From a5a9f975a61649cd1f861a80923c678c5f4d51be Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Tue, 26 Nov 2019 11:18:51 +0100 Subject: [PATCH 01/12] feat: refactor the overlay system implementations, docs and demos --- packages/dialog/README.md | 45 + packages/dialog/index.js | 1 + packages/dialog/lion-dialog.js | 3 + packages/dialog/package.json | 42 + packages/dialog/src/LionDialog.js | 14 + packages/dialog/stories/index.stories.js | 141 ++ packages/dialog/test/lion-dialog.test.js | 75 + .../src/LionInputDatepicker.js | 1 + packages/localize/src/LocalizeMixin.js | 5 +- packages/overlays/README.md | 68 +- .../overlays/docs/GlobalOverlayController.md | 43 - .../overlays/docs/LocalOverlayController.md | 32 - .../overlays/docs/LocalOverlayPositioning.md | 87 - packages/overlays/docs/OverlayController.md | 189 ++ .../docs/OverlaySystemImplementation.md | 244 -- packages/overlays/docs/OverlaySystemScope.md | 2 +- packages/overlays/docs/OverlaysManager.md | 2 +- packages/overlays/docs/migration.md | 141 ++ packages/overlays/index.js | 2 + packages/overlays/lion-overlay.js | 3 + packages/overlays/package.json | 2 + packages/overlays/src/LionOverlay.js | 95 + packages/overlays/src/OverlayController.js | 26 +- .../overlays/stories/bottom-sheet.stories.js | 45 - .../stories/dynamic-overlay.stories.js | 106 - packages/overlays/stories/index.stories.js | 396 +++- .../local-overlay-placement.stories.js | 151 -- .../overlays/stories/local-overlay.stories.js | 185 -- .../overlays/stories/modal-dialog.stories.js | 107 - ...stories.js => overlay-features.stories.js} | 81 +- .../overlays/test/OverlayController.test.js | 29 +- packages/overlays/test/lion-overlay.test.js | 79 + packages/popup/src/LionPopup.js | 36 +- packages/popup/stories/index.stories.js | 2 +- packages/select-rich/src/LionSelectRich.js | 2 + packages/tooltip/src/LionTooltip.js | 27 +- packages/tooltip/stories/index.stories.js | 2 +- packages/validate/src/utils/AsyncQueue.js | 9 +- stories/index.stories.js | 5 +- yarn.lock | 1968 +++++++++-------- 40 files changed, 2482 insertions(+), 2011 deletions(-) create mode 100644 packages/dialog/README.md create mode 100644 packages/dialog/index.js create mode 100644 packages/dialog/lion-dialog.js create mode 100644 packages/dialog/package.json create mode 100644 packages/dialog/src/LionDialog.js create mode 100644 packages/dialog/stories/index.stories.js create mode 100644 packages/dialog/test/lion-dialog.test.js delete mode 100644 packages/overlays/docs/GlobalOverlayController.md delete mode 100644 packages/overlays/docs/LocalOverlayController.md delete mode 100644 packages/overlays/docs/LocalOverlayPositioning.md create mode 100644 packages/overlays/docs/OverlayController.md delete mode 100644 packages/overlays/docs/OverlaySystemImplementation.md create mode 100644 packages/overlays/docs/migration.md create mode 100644 packages/overlays/lion-overlay.js create mode 100644 packages/overlays/src/LionOverlay.js delete mode 100644 packages/overlays/stories/bottom-sheet.stories.js delete mode 100644 packages/overlays/stories/dynamic-overlay.stories.js delete mode 100644 packages/overlays/stories/local-overlay-placement.stories.js delete mode 100644 packages/overlays/stories/local-overlay.stories.js delete mode 100644 packages/overlays/stories/modal-dialog.stories.js rename packages/overlays/stories/{global-overlay.stories.js => overlay-features.stories.js} (86%) create mode 100644 packages/overlays/test/lion-overlay.test.js diff --git a/packages/dialog/README.md b/packages/dialog/README.md new file mode 100644 index 000000000..384ce2efc --- /dev/null +++ b/packages/dialog/README.md @@ -0,0 +1,45 @@ +# Dialog + +[//]: # 'AUTO INSERT HEADER PREPUBLISH' + +`lion-dialog` is a component wrapping a modal dialog controller +Its purpose is to make it easy to use our Overlay System declaratively +With regards to modal dialogs, this is one of the more commonly used examples of overlays. + +## Features + +- Show content when clicking the invoker +- Respond to close event in the slot="content" element, to close the content +- Have a `.config` object to set or update the OverlayController's configuration + +## How to use + +### Installation + +```sh +npm i --save @lion/dialog +``` + +```js +import '@lion/dialog/lion-dialog.js'; +``` + +### Example + +```js +html` + +
+ This is a dialog + +
+ + +`; +``` diff --git a/packages/dialog/index.js b/packages/dialog/index.js new file mode 100644 index 000000000..0cc7556d2 --- /dev/null +++ b/packages/dialog/index.js @@ -0,0 +1 @@ +export { LionDialog } from './src/LionDialog.js'; diff --git a/packages/dialog/lion-dialog.js b/packages/dialog/lion-dialog.js new file mode 100644 index 000000000..6258411aa --- /dev/null +++ b/packages/dialog/lion-dialog.js @@ -0,0 +1,3 @@ +import { LionDialog } from './src/LionDialog.js'; + +customElements.define('lion-dialog', LionDialog); diff --git a/packages/dialog/package.json b/packages/dialog/package.json new file mode 100644 index 000000000..27248ffa3 --- /dev/null +++ b/packages/dialog/package.json @@ -0,0 +1,42 @@ +{ + "name": "@lion/dialog", + "version": "0.1.0", + "description": "Show relative overlay content on click, as a webcomponent", + "author": "ing-bank", + "homepage": "https://github.com/ing-bank/lion/", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/ing-bank/lion.git", + "directory": "packages/dialog" + }, + "scripts": { + "prepublishOnly": "../../scripts/npm-prepublish.js" + }, + "keywords": [ + "lion", + "web-components", + "dialog" + ], + "main": "index.js", + "module": "index.js", + "files": [ + "src", + "stories", + "test", + "*.js" + ], + "dependencies": { + "@lion/core": "^0.3.0", + "@lion/overlays": "^0.6.4" + }, + "devDependencies": { + "@lion/button": "^0.3.32", + "@lion/icon": "^0.2.8", + "@open-wc/demoing-storybook": "^0.2.0", + "@open-wc/testing": "^2.3.9" + } +} diff --git a/packages/dialog/src/LionDialog.js b/packages/dialog/src/LionDialog.js new file mode 100644 index 000000000..390a20459 --- /dev/null +++ b/packages/dialog/src/LionDialog.js @@ -0,0 +1,14 @@ +import { LionOverlay, OverlayController, withModalDialogConfig } from '@lion/overlays'; + +export class LionDialog extends LionOverlay { + // eslint-disable-next-line class-methods-use-this + _defineOverlay({ contentNode, invokerNode }) { + return new OverlayController({ + ...withModalDialogConfig(), + elementToFocusAfterHide: invokerNode, + contentNode, + invokerNode, + ...this.config, // lit-property set by user for overrides + }); + } +} diff --git a/packages/dialog/stories/index.stories.js b/packages/dialog/stories/index.stories.js new file mode 100644 index 000000000..b77904da3 --- /dev/null +++ b/packages/dialog/stories/index.stories.js @@ -0,0 +1,141 @@ +import { storiesOf, html, withKnobs, object } from '@open-wc/demoing-storybook'; +import { css } from '@lion/core'; +import '@lion/icon/lion-icon.js'; +import '@lion/button/lion-button.js'; +import '../lion-dialog.js'; + +const dialogDemoStyle = css` + .demo-box { + width: 200px; + background-color: white; + border-radius: 2px; + border: 1px solid grey; + padding: 8px; + } + + .demo-box_placements { + display: flex; + flex-direction: column; + width: 173px; + margin: 0 auto; + margin-top: 68px; + } + + lion-dialog { + padding: 10px; + } + + .close-button { + color: black; + font-size: 28px; + line-height: 28px; + } + + .demo-box__column { + display: flex; + flex-direction: column; + } + + .dialog { + display: block; + position: absolute; + font-size: 16px; + color: white; + background-color: black; + border-radius: 4px; + padding: 8px; + } + + @media (max-width: 480px) { + .dialog { + display: none; + } + } +`; + +storiesOf('Overlays Specific WC | Dialog', module) + .addDecorator(withKnobs) + .add( + 'Button dialog', + () => html` + +

+ Important note: Your slot="content" gets moved to global overlay container. + After initialization it is no longer a child of lion-dialog +

+

+ To close your dialog from some action performed inside the content slot, fire a + close event. +

+

+ For the dialog to close, it will need to bubble to the content slot (use + bubbles: true. Also composed: true if it needs to traverse shadow + boundaries) +

+

The demo below demonstrates this

+
+ + Dialog +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+
+ `, + ) + .add('Custom configuration', () => { + const dialog = placement => html` + + Dialog ${placement} +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+ `; + + return html` + +
+ ${dialog('center')} ${dialog('top-left')} ${dialog('top-right')} ${dialog('bottom-left')} + ${dialog('bottom-right')} +
+ `; + }) + .add('Toggle placement with knobs', () => { + const dialog = html` + + Dialog +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+ `; + + return html` + +
+ ${dialog} +
+ `; + }); diff --git a/packages/dialog/test/lion-dialog.test.js b/packages/dialog/test/lion-dialog.test.js new file mode 100644 index 000000000..c3717f79a --- /dev/null +++ b/packages/dialog/test/lion-dialog.test.js @@ -0,0 +1,75 @@ +import { expect, fixture, html } from '@open-wc/testing'; + +import '../lion-dialog.js'; + +// Smoke tests dialog +describe('lion-dialog', () => { + describe('Basic', () => { + it('should not be shown by default', async () => { + const el = await fixture(html` + +
Hey there
+ Popup button +
+ `); + expect(el._overlayCtrl.isShown).to.be.false; + }); + + it('should show content on invoker click', async () => { + const el = await fixture(html` + +
+ Hey there +
+ Popup button +
+ `); + const invoker = el.querySelector('[slot="invoker"]'); + invoker.click(); + + expect(el._overlayCtrl.isShown).to.be.true; + }); + + it('should hide content on close event', async () => { + const el = await fixture(html` + +
+ Hey there + +
+ Popup button +
+ `); + const invoker = el.querySelector('[slot="invoker"]'); + invoker.click(); + + expect(el._overlayCtrl.isShown).to.be.true; + + const closeBtn = el._overlayCtrl.contentNode.querySelector('button'); + closeBtn.click(); + + expect(el._overlayCtrl.isShown).to.be.false; + }); + + it('should respond to initially and dynamically setting the config', async () => { + const el = await fixture(html` + +
Hey there
+ Popup button +
+ `); + await el._overlayCtrl.show(); + expect(el._overlayCtrl.trapsKeyboardFocus).to.be.false; + + el.config = { viewportConfig: { placement: 'left' } }; + expect(el._overlayCtrl.viewportConfig.placement).to.equal('left'); + expect( + el._overlayCtrl._contentNodeWrapper.classList.contains( + 'global-overlays__overlay-container--left', + ), + ); + }); + }); +}); diff --git a/packages/input-datepicker/src/LionInputDatepicker.js b/packages/input-datepicker/src/LionInputDatepicker.js index f9cf22c78..aa62fea9b 100644 --- a/packages/input-datepicker/src/LionInputDatepicker.js +++ b/packages/input-datepicker/src/LionInputDatepicker.js @@ -204,6 +204,7 @@ export class LionInputDatepicker extends OverlayMixin(LionInputDate) { * this is our source to give as .contentNode to OverlayController. * Important: do not change the name of this method. */ + // TODO: Refactor to new overlay system public API --> @close=${() => { this.opened = false; }} _overlayTemplate() { return html` this._overlayCtrl.hide()}> diff --git a/packages/localize/src/LocalizeMixin.js b/packages/localize/src/LocalizeMixin.js index 44e91c6af..3abd1cbec 100644 --- a/packages/localize/src/LocalizeMixin.js +++ b/packages/localize/src/LocalizeMixin.js @@ -62,7 +62,10 @@ export const LocalizeMixin = dedupeMixin( if (this.__localizeMessageSync) { return localize.msg(...args); } - return until(this.localizeNamespacesLoaded.then(() => localize.msg(...args)), nothing); + return until( + this.localizeNamespacesLoaded.then(() => localize.msg(...args)), + nothing, + ); } __getUniqueNamespaces() { diff --git a/packages/overlays/README.md b/packages/overlays/README.md index 68a2b986d..ca2e90ecc 100644 --- a/packages/overlays/README.md +++ b/packages/overlays/README.md @@ -2,15 +2,26 @@ [//]: # 'AUTO INSERT HEADER PREPUBLISH' -Supports different types of overlays like dialogs, toasts, tooltips, dropdown, etc... +> Note: Migrating from the old system (`overlays.add(new SomeController({...}))`)? Please check out our [migration guidelines](./docs/migration.md) + +Supports different types of overlays like dialogs, toasts, tooltips, dropdown, etc. + Manages their position on the screen relative to other elements, including other overlays. +Exports `lion-overlay`, which is a generic component wrapping OverlayController. +Its purpose is to make it easy to use our Overlay System declaratively. It can be easily extended where needed, to override event listeners and more. + ## Features -- [**Overlays Manager**](./docs/OverlaysManager.md), a global repository keeping track of all different types of overlays. -- [**Overlays System: Scope**](./docs/OverlaySystemScope.md), outline of all possible occurrences of overlays. Divided into two main types: - - [**Global Overlay Controller**](./docs/GlobalOverlayController.md), controller for overlays relative to the viewport. - - [**Local Overlay Controller**](./docs/LocalOverlayController.md), controller for overlays positioned next to invokers they are related to. +- lion-overlay web component: + + - Show content when clicking the invoker + - Respond to overlay-close event in the slot="content" element, to close the content + - Have a `.config` object to set or update the OverlayController's configuration + +- [**OverlaysManager**](./docs/OverlaysManager.md), a global repository keeping track of all different types of overlays +- [**OverlayController**](./docs/OverlayController.md), a single controller class for handling overlays +- **OverlayMixin**, a mixin that can be used to create webcomponents that use the OverlayController under the hood ## How to use @@ -23,18 +34,43 @@ npm i --save @lion/overlays ### Example ```js -import { overlays } from '@lion/overlays'; +import '@lion/overlays/lion-overlay.js'; -const myCtrl = overlays.add( - new OverlayTypeController({ - /* options */ - }), -); -// name OverlayTypeController is for illustration purpose only -// please read below about existing classes for different types of overlays +html` + +
+ This is an overlay + +
+ + +`; ``` -## Rationals +Or by creating a controller yourself -- No `aria-controls`: as support for it is not quite there yet -- No `aria-haspopup` People knowing the haspop up and hear about it don’t expect a dialog to open (at this moment in time) but expect a sub-menu. Until support for the dialog value has better implementation, it’s probably best to not use aria-haspopup on the element that opens the modal dialog. +```js +import { OverlayController } from '@lion/overlays'; + +const ctrl = new OverlayController({ + ...withModalDialogConfig(), + invokerNode, + contentNode, +}); +``` + +## Rationales + +For rationales, please check the [docs](./docs) folder, where we go more in-depth. + +### Aria roles + +- No `aria-controls` as support for it is not quite there yet +- No `aria-haspopup`. People knowing the haspop up and hear about it don’t expect a dialog to open (at this moment in time) but expect a sub-menu. Until support for the dialog value has better implementation, it’s probably best to not use aria-haspopup on the element that opens the modal dialog. diff --git a/packages/overlays/docs/GlobalOverlayController.md b/packages/overlays/docs/GlobalOverlayController.md deleted file mode 100644 index 361a3a83f..000000000 --- a/packages/overlays/docs/GlobalOverlayController.md +++ /dev/null @@ -1,43 +0,0 @@ -# GlobalOverlayController - -This is a base class for different global overlays (e.g. a dialog, see [Overlay System: Scope](./OverlaySystemScope.md) - the ones positioned relatively to the viewport). - -You should not use this controller directly unless you want to create a unique type of global overlays which is not supported out of the box. But for implementation details check out [Overlay System: Implementation](./OverlaySystemImplementation.md). - -All supported types of global overlays are described below. - -## How to use - -### Installation - -```sh -npm i --save @lion/overlays -``` - -### Example - -```js -import { overlays } from '@lion/overlays'; - -const myCtrl = overlays.add( - new GlobalOverlayController({ - /* options */ - }), -); -``` - -### BottomSheetController - -A specific extension of GlobalOverlayController configured to create accessible dialogs at the bottom of the screen. - -```js -import { BottomSheetController } from '@lion/overlays'; -``` - -### ModalDialogController - -A specific extension of GlobalOverlayController configured to create accessible modal dialogs placed in the center of the screen. - -```js -import { ModalDialogController } from '@lion/overlays'; -``` diff --git a/packages/overlays/docs/LocalOverlayController.md b/packages/overlays/docs/LocalOverlayController.md deleted file mode 100644 index 5ef81a742..000000000 --- a/packages/overlays/docs/LocalOverlayController.md +++ /dev/null @@ -1,32 +0,0 @@ -# LocalOverlayController - -This is a base class for different local overlays (e.g. a [tooltip](../../tooltip/), see [Overlay System: Scope](./OverlaySystemScope.md) - the ones positioned next to invokers they are related to). - -For more information strictly about the positioning of the content element to the reference element (invoker), please refer to the [positioning documentation](./LocalOverlayPositioning.md). - -You should not use this controller directly unless you want to create a unique type of local overlays which is not supported out of the box. But for implementation details check out [Overlay System: Implementation](./OverlaySystemImplementation.md). - -All supported types of local overlays are described below. - -## How to use - -### Installation - -```sh -npm i --save @lion/overlays -``` - -### Example - -```js -import { overlays } from '@lion/overlays'; - -const myCtrl = overlays.add( - new LocalOverlayController({ - /* options */ - }), -); -``` - -This is currently WIP. -Stay tuned for updates on new types of overlays. diff --git a/packages/overlays/docs/LocalOverlayPositioning.md b/packages/overlays/docs/LocalOverlayPositioning.md deleted file mode 100644 index 2b9bf0c74..000000000 --- a/packages/overlays/docs/LocalOverlayPositioning.md +++ /dev/null @@ -1,87 +0,0 @@ -# LocalOverlayPositioning - -## Featuring - [Popper.js](https://popper.js.org/) - -Our local overlays use the open-source Popper.js library for positioning the content relative to the reference element, which we usually refer to as the invoker, in the context of local overlays. - -## Features - -- Everything Popper.js! -- Currently eagerly loads popper in the constructor of LocalOverlayController. Loading during idle time / using prefetch would be better, this is still WIP. - -> Popper strictly is scoped on positioning. **It does not change the dimensions of the popper element nor the reference element**. This also means that if you use the arrow feature, you are in charge of styling it properly, use the x-placement attribute for this. - -## How to use - -For installation, see [LocalOverlayController](./LocalOverlayController.md)'s `How to use` section. - -The API for LocalOverlay without Popper looks like this (`overlays` being the OverlayManager singleton): - -```js -const localOverlay = overlays.add( - new LocalOverlayController({ - contentTemplate: () => - html` -
United Kingdom
- `, - invokerTemplate: () => - html` - - `, - }); -); -``` - -This will use the defaults we set for Popper configuration. To override the default options, you add a `popperConfig` object to the properties of the object you pass to `the LocalOverlayController` like so: - -```js -const localOverlay = overlays.add( - new LocalOverlayController({ - contentTemplate: () => - html` -
United Kingdom
- `, - invokerTemplate: () => - html` - - `, - popperConfig: { - /* Placement of popper element, relative to reference element */ - placement: 'bottom-start', - positionFixed: true, - modifiers: { - /* Prevents detachment of content element from reference element */ - keepTogether: { - enabled: true, - }, - /* When enabled, adds shifting/sliding behavior on secondary axis */ - preventOverflow: { - enabled: false, - boundariesElement: 'viewport', - /* When enabled, this is the -margin for the secondary axis */ - padding: 32, - }, - /* Use to adjust flipping behavior or constrain directions */ - flip: { - boundariesElement: 'viewport', - /* -margin for flipping on primary axis */ - padding: 16, - }, - /* When enabled, adds an offset to either primary or secondary axis */ - offset: { - enabled: true, - /* margin between popper and referenceElement */ - offset: `0, 16px`, - }, - }, - }, - }); -); -``` - -The popperConfig is 1 to 1 aligned with Popper.js' API. For more detailed information and more advanced options, visit the [Popper.js documentation](https://popper.js.org/popper-documentation.html) to learn about the usage. - -## Future additions - -- Coming soon: Webcomponent implementation of LocalOverlay with a default arrow, styled out of the box to at least have proper rotations and positions. -- Default overflow and/or max-width behavior when content is too wide or high for the viewport. diff --git a/packages/overlays/docs/OverlayController.md b/packages/overlays/docs/OverlayController.md new file mode 100644 index 000000000..7ee87410e --- /dev/null +++ b/packages/overlays/docs/OverlayController.md @@ -0,0 +1,189 @@ +# Overlay System + +This document provides an outline of all possible occurrences of overlays found in applications in general and thus provided by Lion. For all concepts referred to in this document, please read [Overlay System Scope](./OverlaySystemScope.md), which includes more background knowledge on overlays on the web. + +OverlayController is the single class we instantiate whenever creating an overlay instance. +Based on provided config, it will handle: + +- DOM position (local vs global) +- positioning logic +- accessibility +- interaction patterns. + +and has the following public functions: + +- **show()**, to show the overlay. +- **hide()**, to hide the overlay. +- **toggle()**, to toggle between show and hide. + +All overlays contain an invokerNode and a contentNode + +- **contentNode**, the toggleable content of the overlay +- **invokerNode**, the element toggles the visibility of the content. For local overlays, this is the relative element the content is positioned to. + +For DOM position, local refers to overlays where the content is positioned next to the invokers they are related to, DOM-wise. +Global refers to overlays where the content is positioned in a global root node at the bottom of ``. + +## Configuration options + +In total, we should end up with configuration options as depicted below, for all possible overlays. +All boolean flags default to 'false'. + +```text +- {Boolean} trapsKeyboardFocus - rotates tab. +- {Boolean} hidesOnEsc - hides the overlay when pressing [esc]. +- {Element} elementToFocusAfterHide - the element that should be called `.focus()` on after dialog closes. +- {Boolean} hasBackdrop - whether it should have a backdrop. (local mode only) +- {Boolean} isBlocking - hides other overlays when multiple are opened. +- {Boolean} preventsScroll - prevents scrolling body content when overlay opened. +- {Object} viewportConfig - placementMode: local only + - {String} placement: 'top-left' | 'top' | 'top-right' | 'right' | 'bottom-left' |'bottom' | 'bottom-right' | 'left' | 'center' +- {Object} popperConfig - placementMode: local only + - {String} placement: 'top-left' | 'top' | 'top-right' | 'right' | 'bottom-left' |'bottom' | 'bottom-right' | 'left' | 'center' +``` + +> Note: popperConfig reflects [Popper.js API](https://popper.js.org/popper-documentation.html) + +## Specific Controllers + +You can find our existing configurations [here](../src/configurations): + +- withModalDialogConfig +- withDropdownConfig +- withBottomSheetConfig + +You import these using ES Modules, and then simply call them inside your OverlayController instantiation: + +```js +const ctrl = new OverlayController({ + ...withModalDialogConfig(), + invokerNode, + contentNode, +}); +``` + +## Responsive switching + +Currently we support switching between overlay configurations. Keep in mind however that we do not yet support switching between overlay configurations while the content is shown. If you try, it will close the content if it is open, and the user will need to re-open. Will be supported in the near future. + +What follows is an example implementation on an `OverlayController` instance which checks the viewport width, and then updates the configuration to a bottom sheet versus a modal dialog on `before-show`. + +```js +myOverlayCtrl.addEventListener('before-show', () => { + if (window.innerWidth >= 600) { + ctrl.updateConfig(withModalDialogConfig()); + } else { + ctrl.updateConfig(withBottomSheetConfig()); + } +}); +``` + +An example implementation inside of a webcomponent that uses the `OverlayMixin`: +Overriding protected method `_defineOverlay`. + +```js +_defineOverlay({ invokerNode, contentNode }) { + + // initial + const ctrl = new OverlayController({ + ...withBottomSheetConfig(), + hidesOnOutsideClick: true, + invokerNode, + contentNode, + }); + + // responsive + ctrl.addEventListener('before-show', () => { + if (window.innerWidth >= 600) { + ctrl.updateConfig(withModalDialogConfig()); + } else { + ctrl.updateConfig(withBottomSheetConfig()); + } + }); + + return ctrl; +``` + +We do not yet support a way to add responsive switching behavior declaratively inside your lit-templates, for our existing overlay webcomponents (e.g. `lion-dialog`). Your best bet for now would be to extend it and only override `_defineOverlay` to include a `before-show` handler as mentioned above. + +## popperConfig for local overlays (placementMode: local) + +> In Popper, content node is often referred to as Popper element, and invoker node is often referred to as the reference element. + +Features: + +- Everything Popper features! +- Currently eagerly loads popper if mode is local, in the constructor. Loading during idle time / using prefetch would be better, this is still WIP. PRs are welcome! + +> Popper strictly is scoped on positioning. **It does not change the dimensions of the content node nor the invoker node**. This also means that if you use the arrow feature, you are in charge of styling it properly, use the x-placement attribute for this. + +To override the default options we set for local mode, you add a `popperConfig` object to the config passed to the OverlayController. +Here's a succinct overview of some often used popper properties: + +```js +const overlayCtrl = new OverlayController({ + contentNode, + invokerNode, + popperConfig: { + /* Placement of content node, relative to invoker node */ + placement: 'bottom-start', + positionFixed: true, + modifiers: { + /* Prevents detachment of content node from invoker node */ + keepTogether: { + enabled: true, + }, + /* When enabled, adds shifting/sliding behavior on secondary axis */ + preventOverflow: { + enabled: false, + boundariesElement: 'viewport', + /* When enabled, this is the -margin for the secondary axis */ + padding: 32, + }, + /* Use to adjust flipping behavior or constrain directions */ + flip: { + boundariesElement: 'viewport', + /* -margin for flipping on primary axis */ + padding: 16, + }, + /* When enabled, adds an offset to either primary or secondary axis */ + offset: { + enabled: true, + /* margin between content node and invoker node */ + offset: `0, 16px`, + }, + }, + }, +)}; +``` + +## Future + +### Potential example implementations for overlays + +- Combobox/autocomplete Component +- Application menu Component +- Popover Component +- Dropdown Component +- Toast Component + +### Potential configuration additions + +```text +- {Boolean} isModal - sets [aria-modal] and/or [aria-hidden="true"] on siblings +- {Boolean} isTooltip - has a totally different interaction - and accessibility pattern from all other overlays, so needed for internals. +- {Boolean} handlesUserInteraction - sets toggle on click, or hover when `isTooltip` +- {Boolean} handlesAccessibility - + - For non `isTooltip`: + - sets [aria-expanded="true/false"] and [aria-haspopup="true"] on invokerNode + - sets [aria-controls] on invokerNode + - returns focus to invokerNode on hide + - sets focus to overlay content(?) + - For `isTooltip`: + - sets [role="tooltip"] and [aria-labelledby]/[aria-describedby] on the content +``` + +### Future for mode local (Popper) + +- Coming soon: Webcomponent implementation of LocalOverlay with a default arrow, styled out of the box to at least have proper rotations and positions. +- Default overflow and/or max-width behavior when content is too wide or high for the viewport. diff --git a/packages/overlays/docs/OverlaySystemImplementation.md b/packages/overlays/docs/OverlaySystemImplementation.md deleted file mode 100644 index 3408a99cb..000000000 --- a/packages/overlays/docs/OverlaySystemImplementation.md +++ /dev/null @@ -1,244 +0,0 @@ -# Overlay System: Implementation - -This document provides an outline of all possible occurrences of overlays found in applications in general and thus provided by Lion. For all concepts referred to in this document, please read [Overlay System Scope](./OverlaySystemScope.md). - -## Base controller - -The BaseController handles the basics of all controllers, and has the following public functions: - -- **show()**, to show the overlay. -- **hide()**, to hide the overlay. -- **toggle()**, to toggle between show and hide. - -All overlays exists of an invoker and a content - -- **invoker**, the element that can trigger showing (and hiding) the overlay. - - invokerNode -- **content**, the toggleable overlays content - - contentTemplate, in most cases the content will be placed inside a template as one of the controller configuration options. - - contentNode, a node can also be used as the content for local overlays (see next section), such as is done in the [popup](../../popup/). - -## Local and global overlay controllers - -Currently, we have a global and a local overlay controller, as two separate entities. -Based on provided config, they handle all positioning logic, accessibility and interaction patterns. - -- [GlobalOverlayController](./GlobalOverlayController.md), the ones positioned relatively to the viewport. -- [LocalOverlayController](./LocalOverlayController.md), the ones positioned next to invokers they are related to. - -All of their configuration options will be described below as part of the _Configuration options_ section. - -### DynamicOverlayController - -Based on screen size, we might want to switch the appearance of an overlay. -For instance: an application menu can be displayed as a dropdown on desktop, -but as a bottom sheet on mobile. - -Similarly, a dialog can be displayed as a popover on desktop, but as a (global) dialog on mobile. - -The DynamicOverlayController is a flexible overlay that can switch between different controllers, also between the connection point in dom (global and local). The switch is only done when the overlay is closed, so the focus isn't lost while switching from one overlay to another. - -### Configuration options - -In total, we should end up with configuration options as depicted below, for all possible overlays. -All boolean flags default to 'false'. -Some options are mutually exclusive, in which case their dependent options and requirement will be mentioned. - -> Note: a more generic and precise term for all mentionings of `invoker` below would actually be `relative positioning element`. - -#### Shared configuration options - -```text -- {Boolean} trapsKeyboardFocus - rotates tab, implicitly set when 'isModal'. -- {Boolean} hidesOnEsc - hides the overlay when pressing [esc]. -``` - -#### Global specific configuration options - -```text -- {Element} elementToFocusAfterHide - the element that should be called `.focus()` on after dialog closes. -- {Boolean} hasBackdrop - whether it should have a backdrop. -- {Boolean} isBlocking - hides other overlays when multiple are opened. -- {Boolean} preventsScroll - prevents scrolling body content when overlay opened. -- {Object} viewportConfig - - {String} placement: 'top-left' | 'top' | 'top-right' | 'right' | 'bottom-left' |'bottom' |'bottom-right' |'left' | 'center' -``` - -#### Local specific configuration options - -```text -- {Boolean} hidesOnOutsideClick - hides the overlay when clicking next to it, excluding invoker. -- {String} cssPosition - 'absolute' or 'fixed'. TODO: choose name that cannot be mistaken for placement like cssPosition or positioningTechnique: . -- For positioning checkout [localOverlayPositioning](./localOverlayPositioning.md). -``` - -#### Suggested additions - -```text -- {Boolean} isModal - sets [aria-modal] and/or [aria-hidden="true"] on siblings -- {Boolean} isTooltip - has a totally different interaction - and accessibility pattern from all other overlays, so needed for internals. -- {Boolean} handlesUserInteraction - sets toggle on click, or hover when `isTooltip` -- {Boolean} handlesAccessibility - - - For non `isTooltip`: - - sets [aria-expanded="true/false"] and [aria-haspopup="true"] on invokerNode - - sets [aria-controls] on invokerNode - - returns focus to invokerNode on hide - - sets focus to overlay content(?) - - For `isTooltip`: - - sets [role="tooltip"] and [aria-labelledby]/[aria-describedby] on the content -``` - -## Specific Controllers - -Controllers/behaviors provide preconfigured configuration objects for the global/local -overlay controllers. - -They provide an imperative and very flexible api for creating overlays and should be used by -Subclassers, inside webcomponents. - -### Dialog Controller - -```js -{ - isModal: true, - hasBackdrop: true, - preventsScroll: true, - trapsKeyboardFocus: true, - hidesOnEsc: true, - handlesUserInteraction: true, - handlesAccessibility: true, - viewportConfig: { - placement: 'center', - }, -} -``` - -### Tooltip Controller - -```js -{ - isTooltip: true, - handlesUserInteraction: true, - handlesAccessibility: true, -} -``` - -### Popover Controller - -```js -{ - handlesUserInteraction: true, - handlesAccessibility: true, -} -``` - -### Dropdown Controller - -It will be quite common to override placement to 'bottom-fullwidth'. -Also, it would be quite common to add a pointerNode. - -```js -{ - placement: 'bottom', - handlesUserInteraction: true, - handlesAccessibility: true, -} -``` - -### Toast Controller - -TODO: - -- add an option for role="alertdialog" ? -- add an option for a 'hide timer' and belonging a11y features for this - -```js -{ - viewportconfig: { - placement: 'top-right', -}, -``` - -### BottomSheetController - -```js -{ - viewportConfig: { - placement: 'bottom', - }, -} -``` - -### Select Controller - -No need for a config, will probably invoke ResponsiveOverlayCtrl and switches -config based on media query from Dropdown to BottomSheet/CenteredDialog - -### Combobox/autocomplete Controller - -No need for a config, will probably invoke ResponsiveOverlayCtrl and switches -config based on media query from Dropdown to BottomSheet/CenteredDialog - -### Application menu Controller - -No need for cfg, will probably invoke ResponsiveOverlayCtrl and switches -config based on media query from Dropdown to BottomSheet/CenteredDialog - -## Web components - -Web components provide a declarative, developer friendly interface with a preconfigured styling that fits the Design System and makes it really easy for Application Developers to build user interfaces. - -Web components should use the ground layers for the webcomponents in Lion are the following: - -### Dialog Component - -Imperative might be better here? We can add a web component later if needed. - -### Tooltip Component - -```html - - -
This will be shown
-
-``` - -### Popover Component - -```html - - -
This will be shown
-
-``` - -### Dropdown Component - -Like the name suggests, the default placement will be bottom - -```html - - -
    -
  • This
  • -
  • will be
  • -
  • shown
  • -
-
-``` - -### Toast Component - -Imperative might be better here? - -### Sheet Component (bottom, top, left, right) - -Imperative might be better here? - -## Web components implementing generic overlays - -### Select, Combobox/autocomplete, Application menu - -Those will be separate web components with a lot of form and a11y logic that will be described in detail in different sections. - -They will implement the Overlay configuration as described above under 'Controllers/behaviors'. diff --git a/packages/overlays/docs/OverlaySystemScope.md b/packages/overlays/docs/OverlaySystemScope.md index e8a3a5c8e..d220a4779 100644 --- a/packages/overlays/docs/OverlaySystemScope.md +++ b/packages/overlays/docs/OverlaySystemScope.md @@ -17,7 +17,7 @@ As opposed to a single overlay, the overlay manager stores knowledge about: The manager is in charge of rendering an overlay to the DOM. Therefore, a developer should be able to control: -- It’s ‘physical position’ (where the dialog is attached). This can either be: +- Its ‘physical position’ (where the dialog is attached). This can either be: - globally: at root level of the DOM. This guarantees a total control over its painting, since the stacking context can be controlled from here and interfering parents (that set overflow values or transforms) can’t be apparent. Additionally, making a modal dialog requiring diff --git a/packages/overlays/docs/OverlaysManager.md b/packages/overlays/docs/OverlaysManager.md index d8c51614b..fe06a0d9d 100644 --- a/packages/overlays/docs/OverlaysManager.md +++ b/packages/overlays/docs/OverlaysManager.md @@ -1,5 +1,5 @@ # Overlay Manager -An overlay manager is a global repository keeping track of all different types of overlays. The need for a global housekeeping mainly arises when multiple overlays are opened simultaneously. +An overlay manager is a global registry keeping track of all different types of overlays. The need for a global housekeeping mainly arises when multiple overlays are opened simultaneously. The overlay manager keeps track of all registered overlays and controls which one to show. diff --git a/packages/overlays/docs/migration.md b/packages/overlays/docs/migration.md new file mode 100644 index 000000000..f219c78fc --- /dev/null +++ b/packages/overlays/docs/migration.md @@ -0,0 +1,141 @@ +# Migration Guidelines Overlay System + +If you are still using the old overlay system, we encourage you to migrate. The new way is more reliable, less error-prone and a lot easier to maintain. In addition, we now have a web component `lion-dialog` which is a declarative way of adding a modal dialog inside your template! + +## Declaratively (encouraged) + +Using generic `lion-overlay`: + +```js +import { withBottomSheetConfig } from '@lion/overlays'; +import '@lion/overlays/lion-overlay.js'; + +const template = html` + + +
+
Hello, World!
+ +
+
+`; +``` + +Or using a more specific component like `lion-tooltip`, which toggles on-hover: + +```js +import '@lion/tooltip/lion-tooltip.js'; + +const template = html` + + +
+
Hello, World!
+
+
+`; +``` + +Or `lion-dialog` which uses modal dialog configuration defaults + +```js +import '@lion/dialog/lion-dialog.js'; + +const template = html` + + +
+
Hello, World!
+ +
+
+`; +``` + +## Instantiating an overlay controller (discouraged) + +### Old + +```js +import { overlays, GlobalOverlayController } from '@lion/overlays'; + +const ctrl = overlays.add( + new GlobalOverlayController({ + contentTemplate: () => html` +
My content
+ `, + }), +); + +const template = html` + + Open dialog + +`; +``` + +### New + +> Note: The OverlayController is render-system agnostic, you are responsible for passing a node (and rendering it prior). +> For lit-html, we will use a simple helper. Let us know if you think we should export this. + +```js +import { render } from '@lion/core'; + +function renderOffline(litHtmlTemplate) { + const offlineRenderContainer = document.createElement('div'); + render(litHtmlTemplate, offlineRenderContainer); + return offlineRenderContainer.firstElementChild; +} +``` + +This example shows how you can use our configuration generators. + +```js +import { OverlayController, withModalDialogConfig } from '@lion/overlays'; + +const ctrl = new OverlayController({ + ...withModalDialogConfig(), + contentTemplate: renderOffline(html` +
My content
+ `), +}); + +const template = html` + + Open dialog + +`; +``` + +### New (local example) + +```js +import { OverlayController } from '@lion/overlays'; + +const ctrl = new OverlayController({ + ...withModalDialogConfig(), + placementMode: 'local', + hidesOnEsc: true, + hidesOnOutsideClick: true, + contentNode: renderOffline(html` +
United Kingdom
+ `), + invokerNode: renderOffline(html` + + `), +}); + +const template = html` +
In the ${ctrl.invoker}${ctrl.content} the weather is nice.
+`; +``` diff --git a/packages/overlays/index.js b/packages/overlays/index.js index 7719aab23..04d690a13 100644 --- a/packages/overlays/index.js +++ b/packages/overlays/index.js @@ -7,3 +7,5 @@ export { OverlayMixin } from './src/OverlayMixin.js'; export { withBottomSheetConfig } from './src/configurations/withBottomSheetConfig.js'; export { withModalDialogConfig } from './src/configurations/withModalDialogConfig.js'; export { withDropdownConfig } from './src/configurations/withDropdownConfig.js'; + +export { LionOverlay } from './src/LionOverlay.js'; diff --git a/packages/overlays/lion-overlay.js b/packages/overlays/lion-overlay.js new file mode 100644 index 000000000..45327afaa --- /dev/null +++ b/packages/overlays/lion-overlay.js @@ -0,0 +1,3 @@ +import { LionOverlay } from './src/LionOverlay.js'; + +customElements.define('lion-overlay', LionOverlay); diff --git a/packages/overlays/package.json b/packages/overlays/package.json index 9071a66c8..2302c1f4a 100644 --- a/packages/overlays/package.json +++ b/packages/overlays/package.json @@ -37,6 +37,8 @@ "popper.js": "^1.15.0" }, "devDependencies": { + "@lion/button": "^0.3.32", + "@lion/icon": "^0.2.8", "@open-wc/demoing-storybook": "^0.2.0", "@open-wc/testing": "^2.3.4", "@open-wc/testing-helpers": "^1.0.0", diff --git a/packages/overlays/src/LionOverlay.js b/packages/overlays/src/LionOverlay.js new file mode 100644 index 000000000..7eb3cb294 --- /dev/null +++ b/packages/overlays/src/LionOverlay.js @@ -0,0 +1,95 @@ +import { LitElement, html } from '@lion/core'; +import { OverlayMixin } from './OverlayMixin.js'; +import { OverlayController } from './OverlayController.js'; + +export class LionOverlay extends OverlayMixin(LitElement) { + static get properties() { + return { + config: { + type: Object, + }, + }; + } + + constructor() { + super(); + this.config = {}; + } + + get config() { + return this._config; + } + + set config(value) { + if (this._overlayCtrl) { + this._overlayCtrl.updateConfig(value); + } + this._config = value; + } + + render() { + return html` + + + `; + } + + // FIXME: This should be refactored to Array.from(this.children).find(child => child.slot === 'content') + // When this issue is fixed https://github.com/ing-bank/lion/issues/382 + /** + * @override + * Overrides OverlayMixin + * Important to use this override, so that later, contentTemplates can also be accepted + */ + get _overlayContentNode() { + const contentNode = this.querySelector('[slot=content]'); + if (contentNode) { + this._cachedOverlayContentNode = contentNode; + } + return contentNode || this._cachedOverlayContentNode; + } + + /** + * @override + * Overrides OverlayMixin + */ + get _overlayInvokerNode() { + return Array.from(this.children).find(child => child.slot === 'invoker'); + } + + // eslint-disable-next-line class-methods-use-this + _defineOverlay({ contentNode, invokerNode }) { + return new OverlayController({ + placementMode: 'global', // have to set a default + contentNode, + invokerNode, + ...this.config, + }); + } + + _setupShowHideListeners() { + this.__close = () => { + this.opened = false; + }; + this.__toggle = () => { + this.opened = !this.opened; + }; + this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); + this._overlayCtrl.contentNode.addEventListener('close', this.__close); + } + + _teardownShowHideListeners() { + this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); + this._overlayCtrl.contentNode.removeEventListener('close', this.__close); + } + + connectedCallback() { + super.connectedCallback(); + this._setupShowHideListeners(); + } + + disconnectedCallback() { + super.disconnectedCallback(); + this._teardownShowHideListeners(); + } +} diff --git a/packages/overlays/src/OverlayController.js b/packages/overlays/src/OverlayController.js index a72e66259..2d88e154d 100644 --- a/packages/overlays/src/OverlayController.js +++ b/packages/overlays/src/OverlayController.js @@ -25,7 +25,7 @@ export class OverlayController { contentNode: config.contentNode, invokerNode: config.invokerNode, referenceNode: null, - elementToFocusAfterHide: document.body, + elementToFocusAfterHide: config.invokerNode, inheritsReferenceWidth: '', hasBackdrop: false, isBlocking: false, @@ -103,6 +103,18 @@ export class OverlayController { * @param {OverlayConfig} cfgToAdd */ updateConfig(cfgToAdd) { + // only updating the viewportConfig + if (Object.keys(cfgToAdd).length === 1 && Object.keys(cfgToAdd)[0] === 'viewportConfig') { + this.updateViewportConfig(cfgToAdd.viewportConfig); + return; + } + + // only updating the popperConfig + if (Object.keys(cfgToAdd).length === 1 && Object.keys(cfgToAdd)[0] === 'popperConfig') { + this.updatePopperConfig(cfgToAdd.popperConfig); + return; + } + // Teardown all previous configs this._handleFeatures({ phase: 'teardown' }); @@ -167,6 +179,7 @@ export class OverlayController { } } + // FIXME: Consider that state can also be shown (rather than only initial/closed), and don't hide in that case /** * @desc Cleanup ._contentNodeWrapper. We do this, because creating a fresh wrapper * can lead to problems with event listeners... @@ -298,7 +311,10 @@ export class OverlayController { // We only are allowed to move focus if we (still) 'own' it. // Otherwise we assume the 'outside world' has, purposefully, taken over // if (this._contentNodeWrapper.activeElement) { - this.elementToFocusAfterHide.focus(); + if (this.elementToFocusAfterHide) { + console.log(this.elementToFocusAfterHide); + this.elementToFocusAfterHide.focus(); + } // } } @@ -550,6 +566,12 @@ export class OverlayController { } } + updateViewportConfig(newConfig) { + this._handlePosition({ phase: 'hide' }); + this.viewportConfig = newConfig; + this._handlePosition({ phase: 'show' }); + } + teardown() { this._handleFeatures({ phase: 'teardown' }); } diff --git a/packages/overlays/stories/bottom-sheet.stories.js b/packages/overlays/stories/bottom-sheet.stories.js deleted file mode 100644 index a4ed33915..000000000 --- a/packages/overlays/stories/bottom-sheet.stories.js +++ /dev/null @@ -1,45 +0,0 @@ -import { storiesOf, html } from '@open-wc/demoing-storybook'; - -import { css } from '@lion/core'; -import { fixtureSync } from '@open-wc/testing-helpers'; -import { OverlayController, withBottomSheetConfig } from '../index.js'; - -const bottomSheetDemoStyle = css` - .demo-overlay { - background-color: white; - border: 1px solid lightgrey; - text-align: center; - } -`; - -storiesOf('Global Overlay System|BottomSheet', module).add('Default', () => { - const bottomSheetCtrl = new OverlayController({ - ...withBottomSheetConfig(), - contentNode: fixtureSync(html` -
-

BottomSheet

- -
- `), - }); - - return html` - - Anchor 1 - - Anchor 2 - ${Array(50).fill( - html` -

Lorem ipsum

- `, - )} - `; -}); diff --git a/packages/overlays/stories/dynamic-overlay.stories.js b/packages/overlays/stories/dynamic-overlay.stories.js deleted file mode 100644 index c3d5996f3..000000000 --- a/packages/overlays/stories/dynamic-overlay.stories.js +++ /dev/null @@ -1,106 +0,0 @@ -import { storiesOf, html } from '@open-wc/demoing-storybook'; -import { fixtureSync } from '@open-wc/testing-helpers'; - -import { css } from '@lion/core'; -import { - OverlayController, - withBottomSheetConfig, - withModalDialogConfig, - withDropdownConfig, -} from '../index.js'; - -const dynamicOverlayDemoStyle = css` - .demo-overlay { - display: block; - position: absolute; - background-color: white; - padding: 8px; - } - - .demo-overlay__global--small { - height: 100px; - width: 100px; - background: #eee; - } - - .demo-overlay__global--big { - left: 50px; - top: 30px; - width: 200px; - max-width: 250px; - border-radius: 2px; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.12), 0 6px 6px 0 rgba(0, 0, 0, 0.24); - } - - .demo-overlay__local { - display: block; - position: absolute; - max-width: 250px; - border-radius: 2px; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.12), 0 6px 6px 0 rgba(0, 0, 0, 0.24); - } -`; - -storiesOf('Dynamic Overlay System| Switching Overlays', module).add( - 'Switch overlays configuration', - () => { - const ctrl = new OverlayController({ - ...withBottomSheetConfig(), - hidesOnOutsideClick: true, - trapsKeyboardFocus: true, - invokerNode: fixtureSync(html` - - `), - contentNode: fixtureSync(html` -
- Content - -
- `), - }); - - const ctrlType = document.createElement('div'); - function switchTo(type) { - ctrlType.innerHTML = type; - switch (type) { - case 'bottom-sheet': - ctrl.updateConfig(withBottomSheetConfig()); - break; - case 'dropdown': - ctrl.updateConfig({ - ...withDropdownConfig(), - hasBackdrop: false, - viewportConfig: null, - }); - break; - default: - ctrl.updateConfig(withModalDialogConfig()); - } - } - - return html` - - - ${ctrl.invoker} - - - - - - - `; - }, -); diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index 66d9ac3ce..9404080b6 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -1,6 +1,390 @@ -import './global-overlay.stories.js'; -import './modal-dialog.stories.js'; -import './bottom-sheet.stories.js'; -import './local-overlay.stories.js'; -import './local-overlay-placement.stories.js'; -import './dynamic-overlay.stories.js'; +import { storiesOf, html, withKnobs } from '@open-wc/demoing-storybook'; +import { css, render } from '@lion/core'; +import '@lion/icon/lion-icon.js'; +import '@lion/button/lion-button.js'; +import { withBottomSheetConfig, withDropdownConfig, withModalDialogConfig } from '../index.js'; +import '../lion-overlay.js'; + +function renderOffline(litHtmlTemplate) { + const offlineRenderContainer = document.createElement('div'); + render(litHtmlTemplate, offlineRenderContainer); + return offlineRenderContainer.firstElementChild; +} + +// Currently toggling while opened doesn't work (see OverlayController) +/* +let toggledPlacement = 'top'; +const togglePlacement = popupController => { + const placements = [ + 'top-end', + 'top', + 'top-start', + 'right-end', + 'right', + 'right-start', + 'bottom-start', + 'bottom', + 'bottom-end', + 'left-start', + 'left', + 'left-end', + ]; + toggledPlacement = placements[(placements.indexOf(toggledPlacement) + 1) % placements.length]; + popupController.updatePopperConfig({ togglePlacement }); +}; +*/ + +const overlayDemoStyle = css` + .demo-box { + width: 200px; + background-color: white; + border-radius: 2px; + border: 1px solid grey; + padding: 8px; + } + + .demo-box_placements { + display: flex; + flex-direction: column; + width: 173px; + margin: 0 auto; + margin-top: 68px; + } + + lion-overlay { + padding: 10px; + } + + .close-button { + color: black; + font-size: 28px; + line-height: 28px; + } + + .demo-box__column { + display: flex; + flex-direction: column; + } + + .overlay { + display: block; + position: absolute; + font-size: 16px; + color: white; + background-color: black; + border-radius: 4px; + padding: 8px; + } + + .demo-popup { + padding: 10px; + border: 1px solid black; + } + + @media (max-width: 480px) { + .overlay { + display: none; + } + } +`; + +storiesOf('Overlay System | Overlay Component', module) + .addDecorator(withKnobs) + .add( + 'Default', + () => html` + +

+ Important note: Your slot="content" gets moved to global overlay container. + After initialization it is no longer a child of lion-overlay +

+

+ To close your overlay from some action performed inside the content slot, fire a + close event. +

+

+ For the overlay to close, it will need to bubble to the content slot (use + bubbles: true. Also composed: true if it needs to traverse shadow + boundaries) +

+

The demo below demonstrates this

+
+ + Overlay +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+
+ `, + ) + .add('Global placement configuration', () => { + const overlay = placement => html` + + Overlay ${placement} +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+ `; + + return html` + +
+ ${overlay('center')} ${overlay('top-left')} ${overlay('top-right')} + ${overlay('bottom-left')} ${overlay('bottom-right')} +
+ `; + }) + .add( + 'Local placementMode', + () => html` + +
+ + Overlay +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+
+ `, + ) + .add( + 'Override the popper config', + () => html` + +
+ The API is aligned with Popper.js, visit their documentation for more information: + Popper.js Docs +
+
+ +
United Kingdom
+ +
+
+ `, + ) + .add('Switch overlays configuration', () => { + const overlay = renderOffline(html` + + Overlay +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+ `); + + return html` + +
+ + + +
+
+ ${overlay} +
+ `; + }) + .add('On hover', () => { + const popup = renderOffline(html` + + { + popup.opened = true; + }} + @mouseleave=${() => { + popup.opened = false; + }} + >UK +
+ United Kingdom +
+
+ `); + + return html` + +
+ In the beautiful ${popup} the weather is nice. +
+ `; + }) + .add('On an input', () => { + const popup = renderOffline(html` + +
United Kingdom
+ e.stopImmediatePropagation()} + @focusout=${() => { + popup.opened = false; + }} + @focusin=${() => { + popup.opened = true; + }} + /> +
+ `); + + return html` + +
+ + ${popup} +
+ `; + }); + +/* .add('Toggle placement with knobs', () => { + const overlay = (placementMode = 'global') => html` + + Overlay +
+ Hello! You can close this notification here: + e.target.dispatchEvent(new Event('close', { bubbles: true }))} + >⨯ +
+
+ `; + + return html` + +
+

Local

+ ${overlay('local')} +
+ +
+

Global

+ ${overlay()} +
+ `; + }) */ diff --git a/packages/overlays/stories/local-overlay-placement.stories.js b/packages/overlays/stories/local-overlay-placement.stories.js deleted file mode 100644 index fdbddf5f6..000000000 --- a/packages/overlays/stories/local-overlay-placement.stories.js +++ /dev/null @@ -1,151 +0,0 @@ -import { storiesOf, html } from '@open-wc/demoing-storybook'; -import { fixtureSync } from '@open-wc/testing-helpers'; -import { css } from '@lion/core'; -import { OverlayController } from '../index.js'; - -let placement = 'top'; -const togglePlacement = popupController => { - const placements = [ - 'top-end', - 'top', - 'top-start', - 'right-end', - 'right', - 'right-start', - 'bottom-start', - 'bottom', - 'bottom-end', - 'left-start', - 'left', - 'left-end', - ]; - placement = placements[(placements.indexOf(placement) + 1) % placements.length]; - popupController.updatePopperConfig({ placement }); -}; - -const popupPlacementDemoStyle = css` - .demo-box { - width: 40px; - height: 40px; - background-color: white; - border-radius: 2px; - border: 1px solid grey; - margin: 120px auto 120px 360px; - padding: 8px; - } - - .demo-popup { - background-color: white; - border-radius: 2px; - border: 1px solid grey; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.12), 0 6px 6px 0 rgba(0, 0, 0, 0.24); - padding: 8px; - } -`; - -storiesOf('Local Overlay System|Local Overlay Placement', module) - .addParameters({ options: { selectedPanel: 'storybook/actions/actions-panel' } }) - .add('Preferred placement overlay absolute', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - contentNode: fixtureSync(html` -
United Kingdom
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - - -
- ${popup.invoker}${popup.content} -
- `; - }) - .add('Override the popper config', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - popperConfig: { - placement: 'bottom-start', - positionFixed: true, - modifiers: { - keepTogether: { - enabled: true /* Prevents detachment of content element from reference element */, - }, - preventOverflow: { - enabled: false /* disables shifting/sliding behavior on secondary axis */, - boundariesElement: 'viewport', - padding: 32 /* when enabled, this is the viewport-margin for shifting/sliding */, - }, - flip: { - boundariesElement: 'viewport', - padding: 16 /* viewport-margin for flipping on primary axis */, - }, - offset: { - enabled: true, - offset: `0, 16px` /* horizontal and vertical margin (distance between popper and referenceElement) */, - }, - }, - }, - contentNode: fixtureSync(html` -
United Kingdom
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - -
- The API is aligned with Popper.js, visit their documentation for more information: - Popper.js Docs -
- -
- ${popup.invoker} ${popup.content} -
- `; - }); -/* TODO: Add this when we have a feature in place that adds scrollbars / overflow when no space is available */ -/* .add('Space not available', () => { - let popup; - const invokerNode = document.createElement('button'); - invokerNode.innerHTML = 'UK'; - invokerNode.addEventListener('click', () => popup.toggle()); - let popup = overlays.add( - new LocalOverlayController({ - hidesOnEsc: true, - contentTemplate: () => html` -
- Toggle the placement of this overlay with the buttons. Since there is not enough space - available on the vertical center or the top for this popup, the popup will get - displayed on the available space on the bottom. Try dragging the viewport to - increase/decrease space see the behavior of this. -
- `, - invokerNode, - }), - ); - - return html` - -
- - -
-
- ${invoker} ${popup.content} -
- `; - }); */ diff --git a/packages/overlays/stories/local-overlay.stories.js b/packages/overlays/stories/local-overlay.stories.js deleted file mode 100644 index 3078b192b..000000000 --- a/packages/overlays/stories/local-overlay.stories.js +++ /dev/null @@ -1,185 +0,0 @@ -import { storiesOf, html } from '@open-wc/demoing-storybook'; -import { fixtureSync } from '@open-wc/testing-helpers'; -import { css } from '@lion/core'; -import { OverlayController } from '../index.js'; - -const popupDemoStyle = css` - .demo-box { - width: 200px; - height: 40px; - background-color: white; - border-radius: 2px; - border: 1px solid grey; - margin: 240px auto 240px 240px; - padding: 8px; - } - - .demo-popup { - display: block; - max-width: 250px; - background-color: white; - border-radius: 2px; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.12), 0 6px 6px 0 rgba(0, 0, 0, 0.24); - padding: 8px; - } -`; - -storiesOf('Local Overlay System|Local Overlay', module) - .add('Basic', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - hidesOnOutsideClick: true, - contentNode: fixtureSync(html` -
United Kingdom
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - -
- In the ${popup.invoker}${popup.content} the weather is nice. -
- `; - }) - .add('Change preferred position', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - hidesOnOutsideClick: true, - popperConfig: { - placement: 'top-end', - }, - contentNode: fixtureSync(html` -
United Kingdom
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - -
- In the ${popup.invoker}${popup.content} the weather is nice. -
- `; - }) - .add('Single placement parameter', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - hidesOnOutsideClick: true, - popperConfig: { - placement: 'bottom', - }, - contentNode: fixtureSync(html` -
- Supplying placement with a single parameter will assume 'center' for the other. -
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - -
- ${popup.invoker}${popup.content} -
- `; - }) - .add('On hover', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - hidesOnOutsideClick: true, - popperConfig: { - placement: 'bottom', - }, - contentNode: fixtureSync(html` -
United Kingdom
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - -
- In the beautiful ${popup.invoker}${popup.content} the weather is nice. -
- `; - }) - .add('On an input', () => { - const popup = new OverlayController({ - placementMode: 'local', - contentNode: fixtureSync(html` -
United Kingdom
- `), - invokerNode: fixtureSync(html` - popup.show()} - @focusout=${() => popup.hide()} - /> - `), - }); - - return html` - -
- - ${popup.invoker}${popup.content} -
- `; - }) - .add('trapsKeyboardFocus', () => { - const popup = new OverlayController({ - placementMode: 'local', - hidesOnEsc: true, - hidesOnOutsideClick: true, - trapsKeyboardFocus: true, - contentNode: fixtureSync(html` -
- - Anchor -
Tabindex
- -
Content editable
- - -
- `), - invokerNode: fixtureSync(html` - - `), - }); - - return html` - -
- ${popup.invoker}${popup.content} -
- `; - }); diff --git a/packages/overlays/stories/modal-dialog.stories.js b/packages/overlays/stories/modal-dialog.stories.js deleted file mode 100644 index 491e9daab..000000000 --- a/packages/overlays/stories/modal-dialog.stories.js +++ /dev/null @@ -1,107 +0,0 @@ -import { storiesOf, html } from '@open-wc/demoing-storybook'; -import { fixtureSync } from '@open-wc/testing-helpers'; -import { css } from '@lion/core'; -import { OverlayController, withModalDialogConfig } from '../index.js'; - -const modalDialogDemoStyle = css` - .demo-overlay { - background-color: white; - width: 200px; - border: 1px solid lightgrey; - } -`; - -storiesOf('Global Overlay System|Modal Dialog', module) - .add('Default', () => { - const nestedDialogCtrl = new OverlayController({ - ...withModalDialogConfig(), - contentNode: fixtureSync(html` -
-

Nested modal dialog

- -
- `), - }); - - const dialogCtrl = new OverlayController({ - ...withModalDialogConfig(), - contentNode: fixtureSync(html` -
-

Modal dialog

- - -
- `), - }); - - return html` - - Anchor 1 - - Anchor 2 - ${Array(50).fill( - html` -

Lorem ipsum

- `, - )} - `; - }) - .add('Option "isBlocking"', () => { - const blockingDialogCtrl = new OverlayController({ - ...withModalDialogConfig(), - isBlocking: true, - viewportConfig: { - placement: 'top', - }, - contentNode: fixtureSync(html` -
-

Hides other dialogs

- -
- `), - }); - - const normalDialogCtrl = new OverlayController({ - ...withModalDialogConfig(), - contentNode: fixtureSync(html` -
-

Normal dialog

- - -
- `), - }); - - return html` - - - `; - }); diff --git a/packages/overlays/stories/global-overlay.stories.js b/packages/overlays/stories/overlay-features.stories.js similarity index 86% rename from packages/overlays/stories/global-overlay.stories.js rename to packages/overlays/stories/overlay-features.stories.js index c4a151401..fd9a7d9f2 100644 --- a/packages/overlays/stories/global-overlay.stories.js +++ b/packages/overlays/stories/overlay-features.stories.js @@ -11,39 +11,8 @@ const globalOverlayDemoStyle = css` } `; -storiesOf('Global Overlay System|Global Overlay', module) - .add('Default', () => { - const overlayCtrl = new OverlayController({ - placementMode: 'global', - contentNode: fixtureSync(html` -
-

Simple overlay

- -
- `), - }); - - return html` - - Anchor 1 - - Anchor 2 - ${Array(50).fill( - html` -

Lorem ipsum

- `, - )} - `; - }) - .add('Option "preventsScroll"', () => { +storiesOf('Overlay System | Behavior Features', module) + .add('preventsScroll', () => { const overlayCtrl = new OverlayController({ placementMode: 'global', preventsScroll: true, @@ -73,7 +42,7 @@ storiesOf('Global Overlay System|Global Overlay', module) )} `; }) - .add('Option "hasBackdrop"', () => { + .add('hasBackdrop', () => { const overlayCtrl = new OverlayController({ placementMode: 'global', hasBackdrop: true, @@ -98,7 +67,7 @@ storiesOf('Global Overlay System|Global Overlay', module) `; }) - .add('Option "trapsKeyboardFocus"', () => { + .add('trapsKeyboardFocus', () => { const overlayCtrl = new OverlayController({ placementMode: 'global', trapsKeyboardFocus: true, @@ -135,7 +104,7 @@ storiesOf('Global Overlay System|Global Overlay', module) Anchor 2 `; }) - .add('Option "trapsKeyboardFocus" (multiple)', () => { + .add('trapsKeyboardFocus" (multiple)', () => { const overlayCtrl2 = new OverlayController({ placementMode: 'global', trapsKeyboardFocus: true, @@ -183,7 +152,7 @@ storiesOf('Global Overlay System|Global Overlay', module) Anchor 2 `; }) - .add('Option "isBlocking"', () => { + .add('isBlocking', () => { const blockingOverlayCtrl = new OverlayController({ placementMode: 'global', isBlocking: true, @@ -228,7 +197,7 @@ storiesOf('Global Overlay System|Global Overlay', module) `; }) - .add('Option "viewportConfig:placement"', () => { + .add('viewportConfig:placement', () => { const tagName = 'lion-overlay-placement-demo'; if (!customElements.get(tagName)) { customElements.define( @@ -241,18 +210,9 @@ storiesOf('Global Overlay System|Global Overlay', module) }; } - render() { - return html` -

Overlay placement: ${this.placement}

- - - `; - } - - _togglePlacement() { - const options = [ + constructor() { + super(); + this.options = [ 'top', 'top-right', 'right', @@ -263,7 +223,24 @@ storiesOf('Global Overlay System|Global Overlay', module) 'top-left', 'center', ]; - this.placement = options[(options.indexOf(this.placement) + 1) % options.length]; + } + + render() { + return html` +

Overlay placement: ${this.placement}

+ + + `; + } + + _togglePlacement() { + this.placement = this.options[ + (this.options.indexOf(this.placement) + 1) % this.options.length + ]; this.dispatchEvent( new CustomEvent('toggle-placement', { detail: this.placement, @@ -300,7 +277,7 @@ storiesOf('Global Overlay System|Global Overlay', module) `; }) - .add('Option "hidesOnOutsideClick"', () => { + .add('hidesOnOutsideClick', () => { const shadowContent = document.createElement('div'); shadowContent.attachShadow({ mode: 'open' }); shadowContent.shadowRoot.appendChild( diff --git a/packages/overlays/test/OverlayController.test.js b/packages/overlays/test/OverlayController.test.js index dad38b357..3cdd02c3f 100644 --- a/packages/overlays/test/OverlayController.test.js +++ b/packages/overlays/test/OverlayController.test.js @@ -860,7 +860,7 @@ describe('OverlayController', () => { expect(ctrl.contentNode.textContent).to.include('content2'); }); - it('respects the inital config provided to new OverlayController(initialConfig)', async () => { + it('respects the initial config provided to new OverlayController(initialConfig)', async () => { const contentNode = fixtureSync(html`
my content
`); @@ -880,6 +880,33 @@ describe('OverlayController', () => { expect(ctrl.handlesAccesibility).to.equal(true); expect(ctrl.contentNode).to.equal(contentNode); }); + + it('allows for updating viewport config placement only, while keeping the content shown', async () => { + const contentNode = fixtureSync(html` +
my content
+ `); + + const ctrl = new OverlayController({ + // This is the shared config + placementMode: 'global', + handlesAccesibility: true, + contentNode, + }); + + ctrl.show(); + expect( + ctrl._contentNodeWrapper.classList.contains('global-overlays__overlay-container--center'), + ); + expect(ctrl.isShown).to.be.true; + + ctrl.updateConfig({ viewportConfig: { placement: 'top-right' } }); + expect( + ctrl._contentNodeWrapper.classList.contains( + 'global-overlays__overlay-container--top-right', + ), + ); + expect(ctrl.isShown).to.be.true; + }); }); describe('Accessibility', () => { diff --git a/packages/overlays/test/lion-overlay.test.js b/packages/overlays/test/lion-overlay.test.js new file mode 100644 index 000000000..2d42c7663 --- /dev/null +++ b/packages/overlays/test/lion-overlay.test.js @@ -0,0 +1,79 @@ +import { expect, fixture, html } from '@open-wc/testing'; + +import '../lion-overlay.js'; + +describe('lion-overlay', () => { + describe('Basic', () => { + it('should not be shown by default', async () => { + const el = await fixture(html` + +
Hey there
+ Invoker button +
+ `); + expect(el._overlayCtrl.isShown).to.be.false; + }); + + it('should show content on invoker click', async () => { + const el = await fixture(html` + +
+ Hey there +
+ Invoker button +
+ `); + const invoker = el.querySelector('[slot="invoker"]'); + invoker.click(); + await el.updateComplete; + + expect(el._overlayCtrl.isShown).to.be.true; + }); + + it('should hide content on close event', async () => { + const el = await fixture(html` + +
+ Hey there + +
+ Invoker button +
+ `); + const invoker = el.querySelector('[slot="invoker"]'); + invoker.click(); + await el.updateComplete; + + expect(el._overlayCtrl.isShown).to.be.true; + + const closeBtn = el._overlayCtrl.contentNode.querySelector('button'); + closeBtn.click(); + await el.updateComplete; + + expect(el._overlayCtrl.isShown).to.be.false; + }); + + it('should respond to initially and dynamically setting the config', async () => { + const el = await fixture(html` + +
Hey there
+ Invoker button +
+ `); + await el._overlayCtrl.show(); + expect(el._overlayCtrl.trapsKeyboardFocus).to.be.false; + + el.config = { viewportConfig: { placement: 'left' } }; + expect(el._overlayCtrl.viewportConfig.placement).to.equal('left'); + expect( + el._overlayCtrl._contentNodeWrapper.classList.contains( + 'global-overlays__overlay-container--left', + ), + ); + }); + }); +}); diff --git a/packages/popup/src/LionPopup.js b/packages/popup/src/LionPopup.js index c6b564266..0364763bf 100644 --- a/packages/popup/src/LionPopup.js +++ b/packages/popup/src/LionPopup.js @@ -1,42 +1,16 @@ -import { LitElement, html } from '@lion/core'; -import { OverlayMixin, OverlayController } from '@lion/overlays'; - -export class LionPopup extends OverlayMixin(LitElement) { - render() { - return html` - - - `; - } - - // FIXME: This should be refactored to Array.from(this.children).find(child => child.slot === 'content') - // When this issue is fixed https://github.com/ing-bank/lion/issues/382 - get _overlayContentNode() { - return this.querySelector('[slot="content"]'); - } - - get _overlayInvokerNode() { - return Array.from(this.children).find(child => child.slot === 'invoker'); - } +import { OverlayController, LionOverlay } from '@lion/overlays'; +export class LionPopup extends LionOverlay { // eslint-disable-next-line class-methods-use-this _defineOverlay() { return new OverlayController({ placementMode: 'local', + hidesOnOutsideClick: true, + hidesOnEsc: true, contentNode: this._overlayContentNode, invokerNode: this._overlayInvokerNode, handlesAccessibility: true, + ...this.config, }); } - - connectedCallback() { - super.connectedCallback(); - this.__toggle = () => this._overlayCtrl.toggle(); - this._overlayInvokerNode.addEventListener('click', this.__toggle); - } - - disconnectedCallback() { - super.disconnectedCallback(); - this._overlayInvokerNode.removeEventListener('click', this._toggle); - } } diff --git a/packages/popup/stories/index.stories.js b/packages/popup/stories/index.stories.js index c22745006..d2b789f55 100644 --- a/packages/popup/stories/index.stories.js +++ b/packages/popup/stories/index.stories.js @@ -49,7 +49,7 @@ const popupDemoStyle = css` } `; -storiesOf('Local Overlay System|Popup', module) +storiesOf('Overlays Specific WC|Popup', module) .addDecorator(withKnobs) .add( 'Button popup', diff --git a/packages/select-rich/src/LionSelectRich.js b/packages/select-rich/src/LionSelectRich.js index df8401e66..1067b271e 100644 --- a/packages/select-rich/src/LionSelectRich.js +++ b/packages/select-rich/src/LionSelectRich.js @@ -214,6 +214,8 @@ export class LionSelectRich extends OverlayMixin( this.modelValue.length > 0 ) { if (this.checkedIndex) { + // Necessary to sync the checkedIndex through the getter/setter explicitly + // eslint-disable-next-line no-self-assign this.checkedIndex = this.checkedIndex; } } diff --git a/packages/tooltip/src/LionTooltip.js b/packages/tooltip/src/LionTooltip.js index 540426d08..d22bc1a19 100644 --- a/packages/tooltip/src/LionTooltip.js +++ b/packages/tooltip/src/LionTooltip.js @@ -5,12 +5,15 @@ export class LionTooltip extends LionPopup { super(); this.mouseActive = false; this.keyActive = false; + + // Trigger config setter to ensure it updates in OverlayController + this.config = { + ...this.config, + elementToFocusAfterHide: null, + }; } - connectedCallback() { - super.connectedCallback(); - this._overlayContentNode.setAttribute('role', 'tooltip'); - + _setupShowHideListeners() { this.__resetActive = () => { this.mouseActive = false; this.keyActive = false; @@ -19,26 +22,26 @@ export class LionTooltip extends LionPopup { this.__showMouse = () => { if (!this.keyActive) { this.mouseActive = true; - this._overlayCtrl.show(); + this.opened = true; } }; this.__hideMouse = () => { if (!this.keyActive) { - this._overlayCtrl.hide(); + this.opened = false; } }; this.__showKey = () => { if (!this.mouseActive) { this.keyActive = true; - this._overlayCtrl.show(); + this.opened = true; } }; this.__hideKey = () => { if (!this.mouseActive) { - this._overlayCtrl.hide(); + this.opened = false; } }; @@ -49,12 +52,16 @@ export class LionTooltip extends LionPopup { this._overlayInvokerNode.addEventListener('focusout', this.__hideKey); } - disconnectedCallback() { - super.disconnectedCallback(); + _teardownShowHideListeners() { this._overlayCtrl.removeEventListener('hide', this.__resetActive); this.removeEventListener('mouseenter', this.__showMouse); this.removeEventListener('mouseleave', this._hideMouse); this._overlayInvokerNode.removeEventListener('focusin', this._showKey); this._overlayInvokerNode.removeEventListener('focusout', this._hideKey); } + + connectedCallback() { + super.connectedCallback(); + this._overlayContentNode.setAttribute('role', 'tooltip'); + } } diff --git a/packages/tooltip/stories/index.stories.js b/packages/tooltip/stories/index.stories.js index dfb0bb2fc..a2d04e7ce 100644 --- a/packages/tooltip/stories/index.stories.js +++ b/packages/tooltip/stories/index.stories.js @@ -49,7 +49,7 @@ const tooltipDemoStyle = css` } `; -storiesOf('Local Overlay System|Tooltip', module) +storiesOf('Overlays Specific WC|Tooltip', module) .addDecorator(withKnobs) .add( 'Button tooltip', diff --git a/packages/validate/src/utils/AsyncQueue.js b/packages/validate/src/utils/AsyncQueue.js index e4127bc33..0f9b29542 100644 --- a/packages/validate/src/utils/AsyncQueue.js +++ b/packages/validate/src/utils/AsyncQueue.js @@ -1,3 +1,9 @@ +/** + * Use the `.add` method to add async functions to the queue + * Await the `.complete` if you want to ensure the queue is empty at any point + * `complete` resolves whenever no more tasks are running. + * Important note: Currently runs tasks 1 by 1, there is no concurrency option at the moment + */ export class AsyncQueue { constructor() { this.__running = false; @@ -7,7 +13,7 @@ export class AsyncQueue { add(task) { this.__queue.push(task); if (!this.__running) { - // aka we have a new queue, because before there was nothing in the queue + // We have a new queue, because before there was nothing in the queue this.complete = new Promise(resolve => { this.__callComplete = resolve; }); @@ -22,7 +28,6 @@ export class AsyncQueue { if (this.__queue.length > 0) { this.__run(); } else { - // queue is empty again, so call complete this.__running = false; this.__callComplete(); } diff --git a/stories/index.stories.js b/stories/index.stories.js index eee16481c..2249c4ad9 100755 --- a/stories/index.stories.js +++ b/stories/index.stories.js @@ -24,10 +24,13 @@ import '../packages/icon/stories/index.stories.js'; import '../packages/ajax/stories/index.stories.js'; import '../packages/steps/stories/index.stories.js'; import '../packages/localize/stories/index.stories.js'; +import '../packages/calendar/stories/index.stories.js'; + import '../packages/overlays/stories/index.stories.js'; +import '../packages/overlays/stories/overlay-features.stories.js'; +import '../packages/dialog/stories/index.stories.js'; import '../packages/popup/stories/index.stories.js'; import '../packages/tooltip/stories/index.stories.js'; -import '../packages/calendar/stories/index.stories.js'; import '../packages/select-rich/stories/index.stories.js'; import '../packages/switch/stories/index.stories.js'; diff --git a/yarn.lock b/yarn.lock index 00698900e..84580045d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,19 +23,19 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.3.3", "@babel/core@^7.4.5": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" - integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== +"@babel/core@^7.3.3", "@babel/core@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91" + integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.4" - "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.4" - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.3" - "@babel/types" "^7.6.3" - convert-source-map "^1.1.0" + "@babel/generator" "^7.7.2" + "@babel/helpers" "^7.7.0" + "@babel/parser" "^7.7.2" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.7.2" + convert-source-map "^1.7.0" debug "^4.1.0" json5 "^2.1.0" lodash "^4.17.13" @@ -54,68 +54,76 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.4.0", "@babel/generator@^7.6.3", "@babel/generator@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" - integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== +"@babel/generator@^7.4.0", "@babel/generator@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" + integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ== dependencies: - "@babel/types" "^7.6.3" + "@babel/types" "^7.7.2" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e" + integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.0" "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz#32dd9551d6ed3a5fc2edc50d6912852aa18274d9" + integrity sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-explode-assignable-expression" "^7.7.0" + "@babel/types" "^7.7.0" "@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz#df8942452c2c1a217335ca7e393b9afc67f668dc" + integrity sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/helper-hoist-variables" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" -"@babel/helper-create-class-features-plugin@^7.5.5": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" - integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== +"@babel/helper-create-class-features-plugin@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz#bcdc223abbfdd386f94196ae2544987f8df775e8" + integrity sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-function-name" "^7.7.0" + "@babel/helper-member-expression-to-functions" "^7.7.0" + "@babel/helper-optimise-call-expression" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== +"@babel/helper-create-regexp-features-plugin@^7.7.0": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz#6f20443778c8fce2af2ff4206284afc0ced65db6" + integrity sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/helper-define-map@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529" + integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA== + dependencies: + "@babel/helper-function-name" "^7.7.0" + "@babel/types" "^7.7.0" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== +"@babel/helper-explode-assignable-expression@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz#db2a6705555ae1f9f33b4b8212a546bc7f9dc3ef" + integrity sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg== dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" @@ -126,14 +134,14 @@ "@babel/template" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-function-name@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3" + integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q== dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/types" "^7.7.0" "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" @@ -142,52 +150,52 @@ dependencies: "@babel/types" "7.0.0-beta.44" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@babel/helper-get-function-arity@^7.0.0", "@babel/helper-get-function-arity@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d" + integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.0" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== +"@babel/helper-hoist-variables@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81" + integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.7.0" -"@babel/helper-member-expression-to-functions@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" - integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== +"@babel/helper-member-expression-to-functions@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a" + integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA== dependencies: - "@babel/types" "^7.5.5" + "@babel/types" "^7.7.0" -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" + integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.0" -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" - integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786" + integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ== dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/helper-module-imports" "^7.7.0" + "@babel/helper-simple-access" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/types" "^7.7.0" lodash "^4.17.13" -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== +"@babel/helper-optimise-call-expression@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365" + integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.0" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" @@ -201,34 +209,34 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== +"@babel/helper-remap-async-to-generator@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7" + integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.7.0" + "@babel/helper-wrap-function" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" -"@babel/helper-replace-supers@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" - integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== +"@babel/helper-replace-supers@^7.5.5", "@babel/helper-replace-supers@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512" + integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" + "@babel/helper-member-expression-to-functions" "^7.7.0" + "@babel/helper-optimise-call-expression" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== +"@babel/helper-simple-access@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d" + integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g== dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/template" "^7.7.0" + "@babel/types" "^7.7.0" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" @@ -237,31 +245,31 @@ dependencies: "@babel/types" "7.0.0-beta.44" -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@babel/helper-split-export-declaration@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300" + integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.7.0" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== +"@babel/helper-wrap-function@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74" + integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" + "@babel/helper-function-name" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" -"@babel/helpers@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" - integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== +"@babel/helpers@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b" + integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g== dependencies: - "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" @@ -281,32 +289,32 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" - integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== +"@babel/parser@^7.0.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2": + version "7.7.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043" + integrity sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A== -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== +"@babel/plugin-proposal-async-generator-functions@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971" + integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-remap-async-to-generator" "^7.7.0" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-proposal-class-properties@^7.3.0": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" - integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz#ac54e728ecf81d90e8f4d2a9c05a890457107917" + integrity sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" + "@babel/helper-create-class-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== +"@babel/plugin-proposal-dynamic-import@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f" + integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import" "^7.2.0" @@ -335,14 +343,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" - integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== +"@babel/plugin-proposal-unicode-property-regex@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d" + integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -351,6 +358,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-class-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" + integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" @@ -372,6 +386,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" + integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-numeric-separator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.2.0.tgz#7470fe070c2944469a756752a69a6963135018be" + integrity sha512-DroeVNkO/BnGpL2R7+ZNZqW+E24aR/4YWxP3Qb15d6lPU8KDzF8HlIUIRCOJRn4X77/oyW4mJY+7FHfY82NLtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" @@ -386,6 +414,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" + integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-top-level-await@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d" + integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -393,14 +435,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== +"@babel/plugin-transform-async-to-generator@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492" + integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-remap-async-to-generator" "^7.7.0" "@babel/plugin-transform-block-scoped-functions@^7.2.0": version "7.2.0" @@ -417,18 +459,18 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== +"@babel/plugin-transform-classes@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a" + integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.7.0" + "@babel/helper-define-map" "^7.7.0" + "@babel/helper-function-name" "^7.7.0" + "@babel/helper-optimise-call-expression" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -445,14 +487,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" - integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== +"@babel/plugin-transform-dotall-regex@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b" + integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" "@babel/plugin-transform-duplicate-keys@^7.5.0": version "7.5.0" @@ -476,12 +517,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== +"@babel/plugin-transform-function-name@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a" + integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA== dependencies: - "@babel/helper-function-name" "^7.1.0" + "@babel/helper-function-name" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-literals@^7.2.0": @@ -507,39 +548,39 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" - integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== +"@babel/plugin-transform-modules-commonjs@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3" + integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg== dependencies: - "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-module-transforms" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-simple-access" "^7.7.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== +"@babel/plugin-transform-modules-systemjs@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417" + integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-hoist-variables" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== +"@babel/plugin-transform-modules-umd@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966" + integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA== dependencies: - "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-module-transforms" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" - integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf" + integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg== dependencies: - regexpu-core "^4.6.0" + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -580,10 +621,10 @@ "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== +"@babel/plugin-transform-regenerator@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc" + integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg== dependencies: regenerator-transform "^0.14.0" @@ -631,75 +672,75 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" - integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== +"@babel/plugin-transform-unicode-regex@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3" + integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.1", "@babel/preset-env@^7.4.5": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" - integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.1", "@babel/preset-env@^7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb" + integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" + "@babel/plugin-proposal-async-generator-functions" "^7.7.0" + "@babel/plugin-proposal-dynamic-import" "^7.7.0" "@babel/plugin-proposal-json-strings" "^7.2.0" "@babel/plugin-proposal-object-rest-spread" "^7.6.2" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" + "@babel/plugin-proposal-unicode-property-regex" "^7.7.0" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-syntax-top-level-await" "^7.7.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" + "@babel/plugin-transform-async-to-generator" "^7.7.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" "@babel/plugin-transform-block-scoping" "^7.6.3" - "@babel/plugin-transform-classes" "^7.5.5" + "@babel/plugin-transform-classes" "^7.7.0" "@babel/plugin-transform-computed-properties" "^7.2.0" "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-dotall-regex" "^7.6.2" + "@babel/plugin-transform-dotall-regex" "^7.7.0" "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.7.0" "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.6.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" + "@babel/plugin-transform-modules-commonjs" "^7.7.0" + "@babel/plugin-transform-modules-systemjs" "^7.7.0" + "@babel/plugin-transform-modules-umd" "^7.7.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0" "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-regenerator" "^7.7.0" "@babel/plugin-transform-reserved-words" "^7.2.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.6.2" "@babel/plugin-transform-sticky-regex" "^7.2.0" "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.6.2" - "@babel/types" "^7.6.3" + "@babel/plugin-transform-unicode-regex" "^7.7.0" + "@babel/types" "^7.7.1" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" - integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a" + integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw== dependencies: regenerator-runtime "^0.13.2" @@ -713,14 +754,14 @@ babylon "7.0.0-beta.44" lodash "^4.2.0" -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== +"@babel/template@^7.4.0", "@babel/template@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" + integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" + "@babel/parser" "^7.7.0" + "@babel/types" "^7.7.0" "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" @@ -738,17 +779,17 @@ invariant "^2.2.0" lodash "^4.2.0" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" - integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09" + integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.3" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.3" - "@babel/types" "^7.6.3" + "@babel/generator" "^7.7.2" + "@babel/helper-function-name" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" + "@babel/parser" "^7.7.2" + "@babel/types" "^7.7.2" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" @@ -762,10 +803,10 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" - integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== +"@babel/types@^7.0.0", "@babel/types@^7.4.0", "@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" + integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -945,25 +986,25 @@ "@emotion/weak-memoize" "0.2.4" "@emotion/core@^10.0.7": - version "10.0.21" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.21.tgz#2e8398d2b92fd90d4ed6ac4d0b66214971de3458" - integrity sha512-U9zbc7ovZ2ceIwbLXYZPJy6wPgnOdTNT4jENZ31ee6v2lojetV5bTbCVk6ciT8G3wQRyVaTTfUCH9WCrMzpRIw== + version "10.0.22" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.22.tgz#2ac7bcf9b99a1979ab5b0a876fbf37ab0688b177" + integrity sha512-7eoP6KQVUyOjAkE6y4fdlxbZRA4ILs7dqkkm6oZUJmihtHv0UBq98VgPirq9T8F9K2gKu0J/au/TpKryKMinaA== dependencies: "@babel/runtime" "^7.5.5" "@emotion/cache" "^10.0.17" - "@emotion/css" "^10.0.14" - "@emotion/serialize" "^0.11.10" + "@emotion/css" "^10.0.22" + "@emotion/serialize" "^0.11.12" "@emotion/sheet" "0.9.3" "@emotion/utils" "0.11.2" -"@emotion/css@^10.0.14": - version "10.0.14" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.14.tgz#95dacabdd0e22845d1a1b0b5968d9afa34011139" - integrity sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg== +"@emotion/css@^10.0.22": + version "10.0.22" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.22.tgz#37b1abb6826759fe8ac0af0ac0034d27de6d1793" + integrity sha512-8phfa5mC/OadBTmGpMpwykIVH0gFCbUoO684LUkyixPq4F1Wwri7fK5Xlm8lURNBrd2TuvTbPUGxFsGxF9UacA== dependencies: - "@emotion/serialize" "^0.11.8" + "@emotion/serialize" "^0.11.12" "@emotion/utils" "0.11.2" - babel-plugin-emotion "^10.0.14" + babel-plugin-emotion "^10.0.22" "@emotion/hash@0.7.3": version "0.7.3" @@ -975,10 +1016,10 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.6.6.tgz#62266c5f0eac6941fece302abad69f2ee7e25e44" integrity sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ== -"@emotion/is-prop-valid@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.3.tgz#cbe62ddbea08aa022cdf72da3971570a33190d29" - integrity sha512-We7VBiltAJ70KQA0dWkdPMXnYoizlxOXpvtjmu5/MBnExd+u0PGgV27WCYanmLAbCwAU30Le/xA0CQs/F/Otig== +"@emotion/is-prop-valid@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.5.tgz#2dda0791f0eafa12b7a0a5b39858405cc7bde983" + integrity sha512-6ZODuZSFofbxSbcxwsFz+6ioPjb0ISJRRPLZ+WIbjcU2IMU0Io+RGQjjaTgOvNQl007KICBm7zXQaYQEC1r6Bg== dependencies: "@emotion/memoize" "0.7.3" @@ -992,10 +1033,10 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.6.6.tgz#004b98298d04c7ca3b4f50ca2035d4f60d2eed1b" integrity sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ== -"@emotion/serialize@^0.11.10", "@emotion/serialize@^0.11.11", "@emotion/serialize@^0.11.8": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.11.tgz#c92a5e5b358070a7242d10508143306524e842a4" - integrity sha512-YG8wdCqoWtuoMxhHZCTA+egL0RSGdHEc+YCsmiSBPBEDNuVeMWtjEWtGrhUterSChxzwnWBXvzSxIFQI/3sHLw== +"@emotion/serialize@^0.11.12", "@emotion/serialize@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.14.tgz#56a6d8d04d837cc5b0126788b2134c51353c6488" + integrity sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA== dependencies: "@emotion/hash" "0.7.3" "@emotion/memoize" "0.7.3" @@ -1018,23 +1059,23 @@ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a" integrity sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A== -"@emotion/styled-base@^10.0.17": - version "10.0.19" - resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.19.tgz#53655274797194d86453354fdb2c947b46032db6" - integrity sha512-Sz6GBHTbOZoeZQKvkE9gQPzaJ6/qtoQ/OPvyG2Z/6NILlYk60Es1cEcTgTkm26H8y7A0GSgp4UmXl+srvsnFPg== +"@emotion/styled-base@^10.0.23": + version "10.0.24" + resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.24.tgz#9497efd8902dfeddee89d24b0eeb26b0665bfe8b" + integrity sha512-AnBImerf0h4dGAJVo0p0VE8KoAns71F28ErGFK474zbNAHX6yqSWQUasb+1jvg/VPwZjCp19+tAr6oOB0pwmLQ== dependencies: "@babel/runtime" "^7.5.5" - "@emotion/is-prop-valid" "0.8.3" - "@emotion/serialize" "^0.11.11" + "@emotion/is-prop-valid" "0.8.5" + "@emotion/serialize" "^0.11.14" "@emotion/utils" "0.11.2" "@emotion/styled@^10.0.7": - version "10.0.17" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.17.tgz#0cd38b8b36259541f2c6717fc22607a120623654" - integrity sha512-zHMgWjHDMNjD+ux64POtDnjLAObniu3znxFBLSdV/RiEhSLjHIowfvSbbd/C33/3uwtI6Uzs2KXnRZtka/PpAQ== + version "10.0.23" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.23.tgz#2f8279bd59b99d82deade76d1046249ddfab7c1b" + integrity sha512-gNr04eqBQ2iYUx8wFLZDfm3N8/QUOODu/ReDXa693uyQGy2OqA+IhPJk+kA7id8aOfwAsMuvZ0pJImEXXKtaVQ== dependencies: - "@emotion/styled-base" "^10.0.17" - babel-plugin-emotion "^10.0.17" + "@emotion/styled-base" "^10.0.23" + babel-plugin-emotion "^10.0.23" "@emotion/stylis@0.8.4": version "0.8.4" @@ -1151,14 +1192,14 @@ integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== "@lerna/add@^3.4.1": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.18.0.tgz#86e38f14d7a0a7c61315dccb402377feb1c9db83" - integrity sha512-Z5EaQbBnJn1LEPb0zb0Q2o9T8F8zOnlCsj6JYpY6aSke17UUT7xx0QMN98iBK+ueUHKjN/vdFdYlNCYRSIdujA== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.18.5.tgz#b35d6584a20cddf8589269fe73be17cc3904d194" + integrity sha512-oxcQgfrr7KaPfxgbjXo6wcLp/YpHtKeNk8RvBhZDzFl73QS1MqXRM9jsqpEaCfuyYG0owkmaHqFUcUyXe09xVQ== dependencies: "@evocateur/pacote" "^9.6.3" - "@lerna/bootstrap" "3.18.0" - "@lerna/command" "3.18.0" - "@lerna/filter-options" "3.18.0" + "@lerna/bootstrap" "3.18.5" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.18.4" "@lerna/npm-conf" "3.16.0" "@lerna/validation-error" "3.13.0" dedent "^0.7.0" @@ -1166,20 +1207,20 @@ p-map "^2.1.0" semver "^6.2.0" -"@lerna/bootstrap@3.18.0", "@lerna/bootstrap@^3.4.1": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.18.0.tgz#705d9eb51a24d549518796a09f24d24526ed975b" - integrity sha512-3DZKWIaKvr7sUImoKqSz6eqn84SsOVMnA5QHwgzXiQjoeZ/5cg9x2r+Xj3+3w/lvLoh0j8U2GNtrIaPNis4bKQ== +"@lerna/bootstrap@3.18.5", "@lerna/bootstrap@^3.4.1": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.18.5.tgz#cc22a750d6b0402e136926e8b214148dfc2e1390" + integrity sha512-9vD/BfCz8YSF2Dx7sHaMVo6Cy33WjLEmoN1yrHgNkHjm7ykWbLHG5wru0f4Y4pvwa0s5Hf76rvT8aJWzGHk9IQ== dependencies: - "@lerna/command" "3.18.0" - "@lerna/filter-options" "3.18.0" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.18.4" "@lerna/has-npm-version" "3.16.5" "@lerna/npm-install" "3.16.5" - "@lerna/package-graph" "3.18.0" + "@lerna/package-graph" "3.18.5" "@lerna/pulse-till-done" "3.13.0" "@lerna/rimraf-dir" "3.16.5" "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.0" + "@lerna/run-topologically" "3.18.5" "@lerna/symlink-binary" "3.17.0" "@lerna/symlink-dependencies" "3.17.0" "@lerna/validation-error" "3.13.0" @@ -1196,15 +1237,14 @@ semver "^6.2.0" "@lerna/changed@^3.4.1": - version "3.18.2" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.18.2.tgz#4d7c2cd5de92808064891f99fb7c29711439deb9" - integrity sha512-xVnFuj4A6Avxem+8R+KOuKDxfnxp1S5tM5nwsh7n3IhCN5Ga7YINV/JgPhrwgcpqPCVBvAowkilghT/I0r6wUw== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.18.5.tgz#ef2c460f5497b8b4cfac7e5165fe46d7181fcdf5" + integrity sha512-IXS7VZ5VDQUfCsgK56WYxd42luMBxL456cNUf1yBgQ1cy1U2FPVMitIdLN4AcP7bJizdPWeG8yDptf47jN/xVw== dependencies: "@lerna/collect-updates" "3.18.0" - "@lerna/command" "3.18.0" - "@lerna/listable" "3.18.0" + "@lerna/command" "3.18.5" + "@lerna/listable" "3.18.5" "@lerna/output" "3.13.0" - "@lerna/version" "3.18.2" "@lerna/check-working-tree@3.16.5": version "3.16.5" @@ -1225,13 +1265,13 @@ strong-log-transformer "^2.0.0" "@lerna/clean@^3.3.2": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.18.0.tgz#cc67d7697db969a70e989992fdf077126308fb2e" - integrity sha512-BiwBELZNkarRQqj+v5NPB1aIzsOX+Y5jkZ9a5UbwHzEdBUQ5lQa0qaMLSOve/fSkaiZQxe6qnTyatN75lOcDMg== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.18.5.tgz#44b4a6db68ae369778f2921c85ec6961bdd86072" + integrity sha512-tHxOj9frTIhB/H2gtgMU3xpIc4IJEhXcUlReko6RJt8TTiDZGPDudCcgjg6i7n15v9jXMOc1y4F+y5/1089bfA== dependencies: - "@lerna/command" "3.18.0" - "@lerna/filter-options" "3.18.0" - "@lerna/prompt" "3.13.0" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.18.4" + "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" "@lerna/rimraf-dir" "3.16.5" p-map "^2.1.0" @@ -1239,14 +1279,14 @@ p-waterfall "^1.0.0" "@lerna/cli@^3.2.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.18.0.tgz#2b6f8605bee299c6ada65bc2e4b3ed7bf715af3a" - integrity sha512-AwDyfGx7fxJgeaZllEuyJ9LZ6Tdv9yqRD9RX762yCJu+PCAFvB9bp6OYuRSGli7QQgM0CuOYnSg4xVNOmuGKDA== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.18.5.tgz#c90c461542fcd35b6d5b015a290fb0dbfb41d242" + integrity sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA== dependencies: "@lerna/global-options" "3.13.0" dedent "^0.7.0" npmlog "^4.1.2" - yargs "^14.2.0" + yargs "^14.2.2" "@lerna/collect-uncommitted@3.16.5": version "3.16.5" @@ -1269,26 +1309,26 @@ npmlog "^4.1.2" slash "^2.0.0" -"@lerna/command@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.18.0.tgz#1e40399324a69d26a78969d59cf60e19b2f13fc3" - integrity sha512-JQ0TGzuZc9Ky8xtwtSLywuvmkU8X62NTUT3rMNrUykIkOxBaO+tE0O98u2yo/9BYOeTRji9IsjKZEl5i9Qt0xQ== +"@lerna/command@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.18.5.tgz#14c6d2454adbfd365f8027201523e6c289cd3cd9" + integrity sha512-36EnqR59yaTU4HrR1C9XDFti2jRx0BgpIUBeWn129LZZB8kAB3ov1/dJNa1KcNRKp91DncoKHLY99FZ6zTNpMQ== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/package-graph" "3.18.0" + "@lerna/package-graph" "3.18.5" "@lerna/project" "3.18.0" "@lerna/validation-error" "3.13.0" "@lerna/write-log-file" "3.13.0" + clone-deep "^4.0.1" dedent "^0.7.0" execa "^1.0.0" is-ci "^2.0.0" - lodash "^4.17.14" npmlog "^4.1.2" -"@lerna/conventional-commits@3.16.4": - version "3.16.4" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.16.4.tgz#bf464f11b2f6534dad204db00430e1651b346a04" - integrity sha512-QSZJ0bC9n6FVaf+7KDIq5zMv8WnHXnwhyL5jG1Nyh3SgOg9q2uflqh7YsYB+G6FwaRfnPaKosh6obijpYg0llA== +"@lerna/conventional-commits@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.18.5.tgz#08efd2e5b45acfaf3f151a53a3ec7ecade58a7bc" + integrity sha512-qcvXIEJ3qSgalxXnQ7Yxp5H9Ta5TVyai6vEor6AAEHc20WiO7UIdbLDCxBtiiHMdGdpH85dTYlsoYUwsCJu3HQ== dependencies: "@lerna/validation-error" "3.13.0" conventional-changelog-angular "^5.0.3" @@ -1312,13 +1352,13 @@ npmlog "^4.1.2" "@lerna/create@^3.4.1": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.18.0.tgz#78ba4af5eced661944a12b9d7da8553c096c390d" - integrity sha512-y9oS7ND5T13c+cCTJHa2Y9in02ppzyjsNynVWFuS40eIzZ3z058d9+3qSBt1nkbbQlVyfLoP6+bZPsjyzap5ig== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.18.5.tgz#11ac539f069248eaf7bc4c42e237784330f4fc47" + integrity sha512-cHpjocbpKmLopCuZFI7cKEM3E/QY8y+yC7VtZ4FQRSaLU8D8i2xXtXmYaP1GOlVNavji0iwoXjuNpnRMInIr2g== dependencies: "@evocateur/pacote" "^9.6.3" "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.0" + "@lerna/command" "3.18.5" "@lerna/npm-conf" "3.16.0" "@lerna/validation-error" "3.13.0" camelcase "^5.0.0" @@ -1344,31 +1384,31 @@ npmlog "^4.1.2" "@lerna/diff@^3.3.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.18.0.tgz#9638ff4b46e2a8b0d4ebf54cf2f267ac2f8fdb29" - integrity sha512-3iLNlpurc2nV9k22w8ini2Zjm2UPo3xtQgWyqdA6eJjvge0+5AlNAWfPoV6cV+Hc1xDbJD2YDSFpZPJ1ZGilRw== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.18.5.tgz#e9e2cb882f84d5b84f0487c612137305f07accbc" + integrity sha512-u90lGs+B8DRA9Z/2xX4YaS3h9X6GbypmGV6ITzx9+1Ga12UWGTVlKaCXBgONMBjzJDzAQOK8qPTwLA57SeBLgA== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.0" + "@lerna/command" "3.18.5" "@lerna/validation-error" "3.13.0" npmlog "^4.1.2" "@lerna/exec@^3.3.2": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.18.0.tgz#d9ec0b7ca06b7521f0b9f14a164e2d4ca5e1b3b9" - integrity sha512-hwkuzg1+38+pbzdZPhGtLIYJ59z498/BCNzR8d4/nfMYm8lFbw9RgJJajLcdbuJ9LJ08cZ93hf8OlzetL84TYg== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.18.5.tgz#50f1bd6b8f88f2ec02c0768b8b1d9024feb1a96a" + integrity sha512-Q1nz95MeAxctS9bF+aG8FkjixzqEjRpg6ujtnDW84J42GgxedkPtNcJ2o/MBqLd/mxAlr+fW3UZ6CPC/zgoyCg== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.0" - "@lerna/filter-options" "3.18.0" - "@lerna/run-topologically" "3.18.0" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.18.4" + "@lerna/run-topologically" "3.18.5" "@lerna/validation-error" "3.13.0" p-map "^2.1.0" -"@lerna/filter-options@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.18.0.tgz#406667dc75a8fc813c26a91bde754b6a73e1a868" - integrity sha512-UGVcixs3TGzD8XSmFSbwUVVQnAjaZ6Rmt8Vuq2RcR98ULkGB1LiGNMY89XaNBhaaA8vx7yQWiLmJi2AfmD63Qg== +"@lerna/filter-options@3.18.4": + version "3.18.4" + resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.18.4.tgz#f5476a7ee2169abed27ad433222e92103f56f9f1" + integrity sha512-4giVQD6tauRwweO/322LP2gfVDOVrt/xN4khkXyfkJDfcsZziFXq+668otD9KSLL8Ps+To4Fah3XbK0MoNuEvA== dependencies: "@lerna/collect-updates" "3.18.0" "@lerna/filter-packages" "3.18.0" @@ -1435,13 +1475,13 @@ semver "^6.2.0" "@lerna/import@^3.3.1": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.18.0.tgz#c6b124b346a097e6c0f3f1ed4921a278d18bc80b" - integrity sha512-2pYIkkBTZsEdccfc+dPsKZeSw3tBzKSyl0b2lGrfmNX2Y41qqOzsJCyI1WO1uvEIP8aOaLy4hPpqRIBe4ee7hw== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.18.5.tgz#a9c7d8601870729851293c10abd18b3707f7ba5e" + integrity sha512-PH0WVLEgp+ORyNKbGGwUcrueW89K3Iuk/DDCz8mFyG2IG09l/jOF0vzckEyGyz6PO5CMcz4TI1al/qnp3FrahQ== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.0" - "@lerna/prompt" "3.13.0" + "@lerna/command" "3.18.5" + "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" "@lerna/validation-error" "3.13.0" dedent "^0.7.0" @@ -1449,43 +1489,43 @@ p-map-series "^1.0.0" "@lerna/init@^3.3.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.18.0.tgz#b23b9170cce1f4630170dd744e8ee75785ea898d" - integrity sha512-/vHpmXkMlSaJaq25v5K13mcs/2L7E32O6dSsEkHaZCDRiV2BOqsZng9jjbE/4ynfsWfLLlU9ZcydwG72C3I+mQ== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.18.5.tgz#86dd0b2b3290755a96975069b5cb007f775df9f5" + integrity sha512-oCwipWrha98EcJAHm8AGd2YFFLNI7AW9AWi0/LbClj1+XY9ah+uifXIgYGfTk63LbgophDd8936ZEpHMxBsbAg== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.0" + "@lerna/command" "3.18.5" fs-extra "^8.1.0" p-map "^2.1.0" write-json-file "^3.2.0" "@lerna/link@^3.3.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.18.0.tgz#bc72dc62ef4d8fb842b3286887980f98b764781d" - integrity sha512-FbbIpH0EpsC+dpAbvxCoF3cn7F1MAyJjEa5Lh3XkDGATOlinMFuKCbmX0NLpOPQZ5zghvrui97cx+jz5F2IlHw== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.18.5.tgz#f24347e4f0b71d54575bd37cfa1794bc8ee91b18" + integrity sha512-xTN3vktJpkT7Nqc3QkZRtHO4bT5NvuLMtKNIBDkks0HpGxC9PRyyqwOoCoh1yOGbrWIuDezhfMg3Qow+6I69IQ== dependencies: - "@lerna/command" "3.18.0" - "@lerna/package-graph" "3.18.0" + "@lerna/command" "3.18.5" + "@lerna/package-graph" "3.18.5" "@lerna/symlink-dependencies" "3.17.0" p-map "^2.1.0" slash "^2.0.0" "@lerna/list@^3.3.2": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.18.0.tgz#6e5fe545ce4ba7c1eeb6d6cf69240d06c02bd496" - integrity sha512-mpB7Q6T+n2CaiPFz0LuOE+rXphDfHm0mKIwShnyS/XDcii8jXv+z9Iytj8p3rfCH2I1L80j2qL6jWzyGy/uzKA== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.18.5.tgz#58863f17c81e24e2c38018eb8619fc99d7cc5c82" + integrity sha512-qIeomm28C2OCM8TMjEe/chTnQf6XLN54wPVQ6kZy+axMYxANFNt/uhs6GZEmhem7GEVawzkyHSz5ZJPsfH3IFg== dependencies: - "@lerna/command" "3.18.0" - "@lerna/filter-options" "3.18.0" - "@lerna/listable" "3.18.0" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.18.4" + "@lerna/listable" "3.18.5" "@lerna/output" "3.13.0" -"@lerna/listable@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.18.0.tgz#752b014406a9a012486626d22e940edb8205973a" - integrity sha512-9gLGKYNLSKeurD+sJ2RA+nz4Ftulr91U127gefz0RlmAPpYSjwcJkxwa0UfJvpQTXv9C7yzHLnn0BjyAQRjuew== +"@lerna/listable@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.18.5.tgz#e82798405b5ed8fc51843c8ef1e7a0e497388a1a" + integrity sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg== dependencies: - "@lerna/query-graph" "3.18.0" + "@lerna/query-graph" "3.18.5" chalk "^2.3.1" columnify "^1.5.4" @@ -1507,13 +1547,13 @@ config-chain "^1.1.11" pify "^4.0.1" -"@lerna/npm-dist-tag@3.18.1": - version "3.18.1" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.1.tgz#d4dd82ea92e41e960b7117f83102ebcd7a23e511" - integrity sha512-vWkZh2T/O9OjPLDrba0BTWO7ug/C3sCwjw7Qyk1aEbxMBXB/eEJPqirwJTWT+EtRJQYB01ky3K8ZFOhElVyjLw== +"@lerna/npm-dist-tag@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz#9ef9abb7c104077b31f6fab22cc73b314d54ac55" + integrity sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ== dependencies: "@evocateur/npm-registry-fetch" "^4.0.0" - "@lerna/otplease" "3.16.0" + "@lerna/otplease" "3.18.5" figgy-pudding "^3.5.1" npm-package-arg "^6.1.0" npmlog "^4.1.2" @@ -1531,13 +1571,13 @@ signal-exit "^3.0.2" write-pkg "^3.1.0" -"@lerna/npm-publish@3.16.2": - version "3.16.2" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.16.2.tgz#a850b54739446c4aa766a0ceabfa9283bb0be676" - integrity sha512-tGMb9vfTxP57vUV5svkBQxd5Tzc+imZbu9ZYf8Mtwe0+HYfDjNiiHLIQw7G95w4YRdc5KsCE8sQ0uSj+f2soIg== +"@lerna/npm-publish@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.18.5.tgz#240e4039959fd9816b49c5b07421e11b5cb000af" + integrity sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg== dependencies: "@evocateur/libnpmpublish" "^1.2.2" - "@lerna/otplease" "3.16.0" + "@lerna/otplease" "3.18.5" "@lerna/run-lifecycle" "3.16.2" figgy-pudding "^3.5.1" fs-extra "^8.1.0" @@ -1555,12 +1595,12 @@ "@lerna/get-npm-exec-opts" "3.13.0" npmlog "^4.1.2" -"@lerna/otplease@3.16.0": - version "3.16.0" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-3.16.0.tgz#de66aec4f3e835a465d7bea84b58a4ab6590a0fa" - integrity sha512-uqZ15wYOHC+/V0WnD2iTLXARjvx3vNrpiIeyIvVlDB7rWse9mL4egex/QSgZ+lDx1OID7l2kgvcUD9cFpbqB7Q== +"@lerna/otplease@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-3.18.5.tgz#b77b8e760b40abad9f7658d988f3ea77d4fd0231" + integrity sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog== dependencies: - "@lerna/prompt" "3.13.0" + "@lerna/prompt" "3.18.5" figgy-pudding "^3.5.1" "@lerna/output@3.13.0": @@ -1584,10 +1624,10 @@ tar "^4.4.10" temp-write "^3.4.0" -"@lerna/package-graph@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.18.0.tgz#eb42d14404a55b26b2472081615e26b0817cd91a" - integrity sha512-BLYDHO5ihPh20i3zoXfLZ5ZWDCrPuGANgVhl7k5pCmRj90LCvT+C7V3zrw70fErGAfvkcYepMqxD+oBrAYwquQ== +"@lerna/package-graph@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.18.5.tgz#c740e2ea3578d059e551633e950690831b941f6b" + integrity sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA== dependencies: "@lerna/prerelease-id-from-version" "3.16.0" "@lerna/validation-error" "3.13.0" @@ -1629,18 +1669,18 @@ resolve-from "^4.0.0" write-json-file "^3.2.0" -"@lerna/prompt@3.13.0": - version "3.13.0" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.13.0.tgz#53571462bb3f5399cc1ca6d335a411fe093426a5" - integrity sha512-P+lWSFokdyvYpkwC3it9cE0IF2U5yy2mOUbGvvE4iDb9K7TyXGE+7lwtx2thtPvBAfIb7O13POMkv7df03HJeA== +"@lerna/prompt@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.18.5.tgz#628cd545f225887d060491ab95df899cfc5218a1" + integrity sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ== dependencies: inquirer "^6.2.0" npmlog "^4.1.2" "@lerna/publish@^3.4.3": - version "3.18.2" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.18.2.tgz#96f65f2d5ecf8cc7803050482b2d144e768b994d" - integrity sha512-lLQOjoaFv/gc9HtOCMRsOK6NIub8eHnnvmQARjXY/HayA8GuLaD2Px9xOu1L7il+Q0LlMU3wASB9Khy/CiHJUQ== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.18.5.tgz#8cc708d83a4cb7ab1c4cc020a02e7ebc4b6b0b0e" + integrity sha512-ifYqLX6mvw95T8vYRlhT68UC7Al0flQvnf5uF9lDgdrgR5Bs+BTwzk3D+0ctdqMtfooekrV6pqfW0R3gtwRffQ== dependencies: "@evocateur/libnpmaccess" "^3.1.2" "@evocateur/npm-registry-fetch" "^4.0.0" @@ -1648,22 +1688,22 @@ "@lerna/check-working-tree" "3.16.5" "@lerna/child-process" "3.16.5" "@lerna/collect-updates" "3.18.0" - "@lerna/command" "3.18.0" + "@lerna/command" "3.18.5" "@lerna/describe-ref" "3.16.5" "@lerna/log-packed" "3.16.0" "@lerna/npm-conf" "3.16.0" - "@lerna/npm-dist-tag" "3.18.1" - "@lerna/npm-publish" "3.16.2" - "@lerna/otplease" "3.16.0" + "@lerna/npm-dist-tag" "3.18.5" + "@lerna/npm-publish" "3.18.5" + "@lerna/otplease" "3.18.5" "@lerna/output" "3.13.0" "@lerna/pack-directory" "3.16.4" "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/prompt" "3.13.0" + "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.0" + "@lerna/run-topologically" "3.18.5" "@lerna/validation-error" "3.13.0" - "@lerna/version" "3.18.2" + "@lerna/version" "3.18.5" figgy-pudding "^3.5.1" fs-extra "^8.1.0" npm-package-arg "^6.1.0" @@ -1680,12 +1720,12 @@ dependencies: npmlog "^4.1.2" -"@lerna/query-graph@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-3.18.0.tgz#43801a2f1b80a0ea0bfd9d42d470605326a3035d" - integrity sha512-fgUhLx6V0jDuKZaKj562jkuuhrfVcjl5sscdfttJ8dXNVADfDz76nzzwLY0ZU7/0m69jDedohn5Fx5p7hDEVEg== +"@lerna/query-graph@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-3.18.5.tgz#df4830bb5155273003bf35e8dda1c32d0927bd86" + integrity sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA== dependencies: - "@lerna/package-graph" "3.18.0" + "@lerna/package-graph" "3.18.5" figgy-pudding "^3.5.1" "@lerna/resolve-symlink@3.16.0": @@ -1717,25 +1757,25 @@ npm-lifecycle "^3.1.2" npmlog "^4.1.2" -"@lerna/run-topologically@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-3.18.0.tgz#9508604553cfbeba106cd84b711fade17947f94a" - integrity sha512-lrfEewwuUMC3ioxf9Z9NdHUakN6ihekcPfdYbzR2slmdbjYKmIA5srkWdrK8NwOpQCAuekpOovH2s8X3FGEopg== +"@lerna/run-topologically@3.18.5": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-3.18.5.tgz#3cd639da20e967d7672cb88db0f756b92f2fdfc3" + integrity sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg== dependencies: - "@lerna/query-graph" "3.18.0" + "@lerna/query-graph" "3.18.5" figgy-pudding "^3.5.1" p-queue "^4.0.0" "@lerna/run@^3.3.2": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.18.0.tgz#b7069880f6313e4c6026b564b7b76e5d0f30a521" - integrity sha512-sblxHBZ9djaaG7wefPcfEicDqzrB7CP1m/jIB0JvPEQwG4C2qp++ewBpkjRw/mBtjtzg0t7v0nNMXzaWYrQckQ== + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.18.5.tgz#09ae809b16445d3621249c24596cf4ae8e250d5d" + integrity sha512-1S0dZccNJO8+gT5ztYE4rHTEnbXVwThHOfDnlVt2KDxl9cbnBALk3xprGLW7lSzJsxegS849hxrAPUh0UorMgw== dependencies: - "@lerna/command" "3.18.0" - "@lerna/filter-options" "3.18.0" + "@lerna/command" "3.18.5" + "@lerna/filter-options" "3.18.4" "@lerna/npm-run-script" "3.16.5" "@lerna/output" "3.13.0" - "@lerna/run-topologically" "3.18.0" + "@lerna/run-topologically" "3.18.5" "@lerna/timer" "3.13.0" "@lerna/validation-error" "3.13.0" p-map "^2.1.0" @@ -1775,23 +1815,23 @@ dependencies: npmlog "^4.1.2" -"@lerna/version@3.18.2", "@lerna/version@^3.4.1": - version "3.18.2" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.18.2.tgz#f2b54aed7f41d293d0fc5f79baf5cba166bc7e34" - integrity sha512-nmCJpw3A2DoNGbjmvI5UB3ZwTQUayI8M/b3rOA6ZzYeGmoQmm2QBKun05aBRasqTuUo4XjSuas5CqHN+x4f8Ww== +"@lerna/version@3.18.5", "@lerna/version@^3.4.1": + version "3.18.5" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.18.5.tgz#0c4f0c2f8d23e9c95c2aa77ad9ce5c7ef025fac0" + integrity sha512-eSMxLIDuVxZIq0JZKNih50x1IZuMmViwF59uwOGMx0hHB84N3waE8HXOF9CJXDSjeP6sHB8tS+Y+X5fFpBop2Q== dependencies: "@lerna/check-working-tree" "3.16.5" "@lerna/child-process" "3.16.5" "@lerna/collect-updates" "3.18.0" - "@lerna/command" "3.18.0" - "@lerna/conventional-commits" "3.16.4" + "@lerna/command" "3.18.5" + "@lerna/conventional-commits" "3.18.5" "@lerna/github-client" "3.16.5" "@lerna/gitlab-client" "3.15.0" "@lerna/output" "3.13.0" "@lerna/prerelease-id-from-version" "3.16.0" - "@lerna/prompt" "3.13.0" + "@lerna/prompt" "3.18.5" "@lerna/run-lifecycle" "3.16.2" - "@lerna/run-topologically" "3.18.0" + "@lerna/run-topologically" "3.18.5" "@lerna/validation-error" "3.13.0" chalk "^2.3.1" dedent "^0.7.0" @@ -1837,11 +1877,12 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@octokit/endpoint@^5.1.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.4.1.tgz#8f4c747d6cf8f352683d35a7fe8664db487cb730" - integrity sha512-iwn46orWg3F4iqIzAVRfbzhnROyx7BQ7zJE0B7SEeaMIBvk3qmWtswtRk14QkMNUuNiCHQ6mAM00VJxWqrdM1g== +"@octokit/endpoint@^5.5.0": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.5.1.tgz#2eea81e110ca754ff2de11c79154ccab4ae16b3f" + integrity sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg== dependencies: + "@octokit/types" "^2.0.0" is-plain-object "^3.0.0" universal-user-agent "^4.0.0" @@ -1851,20 +1892,22 @@ integrity sha512-3wF5eueS5OHQYuAEudkpN+xVeUsg8vYEMMenEzLphUZ7PRZ8OJtDcsreL3ad9zxXmBbaFWzLmFcdob5CLyZftA== "@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be" - integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.0.tgz#a64d2a9d7a13555570cd79722de4a4d76371baaa" + integrity sha512-DNBhROBYjjV/I9n7A8kVkmQNkqFAMem90dSxqvPq57e2hBr7mNTX98y3R2zDpqMQHVRpBDjsvsfIGgBzy+4PAg== dependencies: + "@octokit/types" "^2.0.0" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.2.0": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.2.1.tgz#d8076b4bd415802c2dbffc82cf9b8b78f49551a3" - integrity sha512-onjQo4QKyiMAqLM6j3eH8vWw1LEfNCpoZUl6a+TrZVJM1wysBC8F0GhK9K/Vc9UsScSmVs2bstOVD34xpQ2wqQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.1.tgz#3a1ace45e6f88b1be4749c5da963b3a3b4a2f120" + integrity sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg== dependencies: - "@octokit/endpoint" "^5.1.0" + "@octokit/endpoint" "^5.5.0" "@octokit/request-error" "^1.0.1" + "@octokit/types" "^2.0.0" deprecation "^2.0.0" is-plain-object "^3.0.0" node-fetch "^2.3.0" @@ -1872,9 +1915,9 @@ universal-user-agent "^4.0.0" "@octokit/rest@^16.28.4": - version "16.33.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.33.1.tgz#19229f5fd28d8e071644d37c249775ee40add433" - integrity sha512-lOQ+fJZwkeJ/1PRTdnY1uNja01aKOMioRhQfZtei64gZMXIX3EAfF4koMQMvoLFwsnVBu3ifj1JW1WAAKdXcnA== + version "16.35.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.35.0.tgz#7ccc1f802f407d5b8eb21768c6deca44e7b4c0d8" + integrity sha512-9ShFqYWo0CLoGYhA1FdtdykJuMzS/9H6vSbbQWDX4pWr4p9v+15MsH/wpd/3fIU+tSxylaNO48+PIHqOkBRx3w== dependencies: "@octokit/request" "^5.2.0" "@octokit/request-error" "^1.0.2" @@ -1889,20 +1932,27 @@ once "^1.4.0" universal-user-agent "^4.0.0" -"@open-wc/building-utils@^2.10.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@open-wc/building-utils/-/building-utils-2.10.0.tgz#843d1743918f64492806cb4c6f9785a62e061366" - integrity sha512-fj2XusQo+DDDrG0uN+18p2x2OwKFQQCtYwTSms9h/q3l449F895hmAvdF9vhZt8va4JZLXmFf52hvZoZCDU/oQ== +"@octokit/types@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.0.2.tgz#0888497f5a664e28b0449731d5e88e19b2a74f90" + integrity sha512-StASIL2lgT3TRjxv17z9pAqbnI7HGu9DrJlg3sEBFfCLaMEqp+O3IQPUF6EZtQ4xkAu2ml6kMBBCtGxjvmtmuQ== dependencies: - "@babel/core" "^7.3.3" + "@types/node" ">= 8" + +"@open-wc/building-utils@^2.10.3": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@open-wc/building-utils/-/building-utils-2.10.3.tgz#1fb1ddb175a80f4ae61b713de3c30572b6f12320" + integrity sha512-GcvEMj4/KQFDRZZlyO7HGpiIe8AwwJ/SyMCDQJ6WkGpBdBvn+8lrucexnSGCCO2AYh0mBTESwL0SLmGkEcQc6Q== + dependencies: + "@babel/core" "^7.7.2" "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@webcomponents/webcomponentsjs" "^2.2.10" arrify "^2.0.1" - browserslist "^4.5.6" + browserslist "^4.7.2" chokidar "^3.0.0" clean-css "^4.2.1" clone "^2.1.2" - core-js-bundle "^3.1.4" + core-js-bundle "^3.4.0" deepmerge "^3.2.0" es-module-shims "^0.4.5" html-minifier "^4.0.0" @@ -1954,71 +2004,73 @@ polymer-webpack-loader "^2.0.0" "@open-wc/eslint-config@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@open-wc/eslint-config/-/eslint-config-1.1.1.tgz#f82ff6885b90a4030f45ebc3d5591c4d11ccb3ba" - integrity sha512-5+cLpTfeWOsuG+aUxSHDtd/0hROEG6B4sb7+fVbehS9xTeOXjPu4dKbn7qvEop3JA3TGWEhFBZlJ5GMUmNxPOQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@open-wc/eslint-config/-/eslint-config-1.3.0.tgz#db93a3359194448b00f862abbfe548284012bd6c" + integrity sha512-hQTVB1TPgiYugampsoXXMJgJ73MWTqzarrNknhNkzBTCEasPBJfo1sQJ3Ke5DeHzO6iPJRkm6mC5W6WvVxozXg== dependencies: babel-eslint "^10.0.0" eslint "^6.1.0" eslint-config-airbnb-base "^14.0.0" eslint-plugin-html "^6.0.0" eslint-plugin-import "^2.18.0" + eslint-plugin-no-only-tests "^2.3.1" eslint-plugin-wc "^1.2.0" -"@open-wc/karma-esm@^2.7.3": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@open-wc/karma-esm/-/karma-esm-2.7.3.tgz#036748aa504c46fe1375123364265f7ec34114d4" - integrity sha512-r7Ylr7urAuWKfpWOIcGiCyjkfHN4VJVb0BKXvzb93Ybi7dudGNevBrx8jxd6kw1oNIcLAGjj0M3yqxOPUgbilA== +"@open-wc/karma-esm@^2.10.1": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@open-wc/karma-esm/-/karma-esm-2.10.1.tgz#06f91f6ab599f76e8021bc8f911097b23de49776" + integrity sha512-n/dWTyCfxd/JXr+zD6RaSZMMz1ytp7NsmE58jKiYb8yMyMQnr5eMS+fo9sgnoNayynLoVP20uOnc+O3T7dSx6Q== dependencies: - "@open-wc/building-utils" "^2.10.0" + "@open-wc/building-utils" "^2.10.3" babel-plugin-istanbul "^5.1.4" - chokidar "^3.0.2" - deepmerge "^3.3.0" - es-dev-server "^1.18.5" + chokidar "^3.0.0" + deepmerge "^3.2.0" + es-dev-server "^1.24.1" minimatch "^3.0.4" + node-fetch "^2.6.0" portfinder "^1.0.21" request "^2.88.0" "@open-wc/prettier-config@^0.1.0": - version "0.1.10" - resolved "https://registry.yarnpkg.com/@open-wc/prettier-config/-/prettier-config-0.1.10.tgz#7b8ab8c2621064bbdbaee79234b3a87d6266cf42" - integrity sha512-3kfNMldb5f+ZPzbK/9eOP3de4uwlzNZ411L1azBIkE6K7pdBqsbASbzdTSO9xrDQSLS+gHd0+wBmNqx7WPezXg== + version "0.1.12" + resolved "https://registry.yarnpkg.com/@open-wc/prettier-config/-/prettier-config-0.1.12.tgz#1e9ce6cbfcfe43072fa593858edf2aa5d9b96c6e" + integrity sha512-EN7+qvhSCgf7cYxlsilF7zUMjlzW6DI7iis6Z2kW0dW+f/EKXpOlvyRxZc3oAbSMjlt4m99M19oRDIXsZVYIEQ== dependencies: eslint-config-prettier "^3.3.0" - prettier "^1.15.0" + prettier "^1.18.2" "@open-wc/semantic-dom-diff@^0.13.16": version "0.13.21" resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz#718b9ec5f9a98935fc775e577ad094ae8d8b7dea" integrity sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg== -"@open-wc/semantic-dom-diff@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.15.0.tgz#7b50f0dadd30541054a4cce4daec7ed4030dec92" - integrity sha512-3198g84g6q0d1Vn5VeJlaB/NNErvjTlIBYw15YCeLI80anwcZbxb3L+52xxfKXJ4xkx08SxkVkijzqLK9+IGKg== +"@open-wc/semantic-dom-diff@^0.15.3": + version "0.15.3" + resolved "https://registry.yarnpkg.com/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.15.3.tgz#df8e363513c5d58eebe660432a914db38f8327fc" + integrity sha512-h9yFY7ue+ezwfTfr+NkUYoeMdpXJ8IsmlWLG2syLA+2mjNo6+R/lhF/UYx/5grtM9Mg2WweMfdbPpG5bub6iJw== -"@open-wc/testing-helpers@^1.0.0", "@open-wc/testing-helpers@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@open-wc/testing-helpers/-/testing-helpers-1.2.1.tgz#eecba5ccfe808f9667caf149e68cd80d781f28e0" - integrity sha512-FZBjqM81GQc+Q8W4YdWNwwk64+PW6frCvHyeov5ivCR2K7SJXwTPRcQIi0qU/6VVRVDlQeQ39PH8oSnjnIYpvQ== +"@open-wc/testing-helpers@^1.0.0", "@open-wc/testing-helpers@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@open-wc/testing-helpers/-/testing-helpers-1.3.0.tgz#5af7e2eed212519034ed6c29349e1e0934f97d63" + integrity sha512-pl115XfU5c6Hzsd4zms9jyXVw6lRj7fhxVpmhRBJnwwRgGeiwT0RMa0z+lgVbkS0o2q19kG0iifgAA5MYTkfaQ== "@open-wc/testing-karma-bs@^1.1.58": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@open-wc/testing-karma-bs/-/testing-karma-bs-1.2.2.tgz#cfcf1dd11d634c430a52338b5f0af8180925d78d" - integrity sha512-+wa3bzXvNaTxEYtMPAx+jD5owhBlnAh2HMkstqTEuLEjr5ya7pevpPf7f6Q+Jwdvfc8RjyxV/GZOXTwq3s6VWw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/@open-wc/testing-karma-bs/-/testing-karma-bs-1.3.1.tgz#30aa08fb379245a6947f269e0a98cc51984eb8b7" + integrity sha512-TydhKdvO7FbAE7KQRTRIUwYYmOKxK6kXM07+eSg5wJzEaxbwwYpFSuW5pDv6pJLNYZnwD3YpRixFd4t+9BCB7A== dependencies: - "@open-wc/testing-karma" "^3.1.41" + "@open-wc/testing-karma" "^3.2.1" "@types/node" "^11.13.0" karma-browserstack-launcher "^1.0.0" -"@open-wc/testing-karma@^3.1.33", "@open-wc/testing-karma@^3.1.41": - version "3.1.41" - resolved "https://registry.yarnpkg.com/@open-wc/testing-karma/-/testing-karma-3.1.41.tgz#14bda3c340b8c286169b751f803307e471ae607a" - integrity sha512-T4/ljqRgCdT2F8DE4qrICXxWSAvEMfU/If0yDWSMnPNmSscYdw2WnTl7Ln47b3+r3eKpYAFPLXo7KldhAuO37A== +"@open-wc/testing-karma@^3.1.33", "@open-wc/testing-karma@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@open-wc/testing-karma/-/testing-karma-3.2.1.tgz#e104a1bf6f289b1c968c6e31c2f96bd2d0a8b75d" + integrity sha512-6/EKjq3btLgNkxIUDf3ubxJOYy8bFdN+cA7IRz9KqScLMtEOr68NZ2GDztlZvovjaMcu22obxHGxRauJraoGiQ== dependencies: - "@open-wc/karma-esm" "^2.7.3" + "@open-wc/karma-esm" "^2.10.1" axe-core "^3.3.1" - karma "^4.0.0" + karma "^4.1.0" karma-chrome-launcher "^2.0.0" karma-coverage-istanbul-reporter "^2.0.0" karma-mocha "^1.0.0" @@ -2026,32 +2078,32 @@ karma-mocha-snapshot "^0.2.1" karma-snapshot "^0.6.0" karma-source-map-support "^1.3.0" - mocha "^6.2.0" + mocha "^6.0.0" "@open-wc/testing-wallaby@^0.1.12": - version "0.1.12" - resolved "https://registry.yarnpkg.com/@open-wc/testing-wallaby/-/testing-wallaby-0.1.12.tgz#2607cfc9cf8db56914cbd1be85ac6c0ef8446dfa" - integrity sha512-wNS73gX7oJxJiYZoFT8UbnMfpjIylcjwz2Lhy/7t82XSFafgZxetmadykWt9nPJ1QmFL3AFCPfB1HSlSY5qF4w== + version "0.1.13" + resolved "https://registry.yarnpkg.com/@open-wc/testing-wallaby/-/testing-wallaby-0.1.13.tgz#f49e8957d57df71d8b34d2c773b35dfbff4d2888" + integrity sha512-teHbNIZYWGVaBKgMPJneOwCwqutshbhKR+r0itjCdYRwbhsrXJkB1cqt8yEcPpf9oJlWi62OXAwipK9StF9nDQ== dependencies: wallaby-webpack "^3.0.0" webpack "^4.28.0" -"@open-wc/testing@^2.3.4": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-2.3.6.tgz#78f9f82652c61fe98e400a98a5fdb35bf802f326" - integrity sha512-U90xwZZ4yXOScu8/iK7/BKmVL0zcgIUZDtksCkytBHDBFtdT58g7QtcyqgnCYUcmAvyVEQFcRpqGAHBmG4Vr9A== +"@open-wc/testing@^2.3.4", "@open-wc/testing@^2.3.9": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-2.3.9.tgz#048bb3122d989cf0df96611513aaec7738964e3d" + integrity sha512-5pKtHNP/73y9VWAwXOdxf4uzKVAtCowSdy4B6It4iETq8RshkAtKJbJBj+iQSU81pG6jOgSNPlGYeU01/CXaxw== dependencies: "@open-wc/chai-dom-equals" "^0.12.36" - "@open-wc/semantic-dom-diff" "^0.15.0" - "@open-wc/testing-helpers" "^1.2.1" + "@open-wc/semantic-dom-diff" "^0.15.3" + "@open-wc/testing-helpers" "^1.3.0" "@types/chai" "^4.1.7" "@types/chai-dom" "^0.0.8" "@types/mocha" "^5.0.0" "@types/sinon-chai" "^3.2.3" chai "^4.2.0" - chai-a11y-axe "^1.2.1" + chai-a11y-axe "^1.2.2" chai-dom "^1.8.1" - mocha "^5.0.0" + mocha "^6.0.0" sinon-chai "^3.3.0" "@polymer/iron-test-helpers@^3.0.1": @@ -2062,9 +2114,9 @@ "@polymer/polymer" "^3.0.0" "@polymer/polymer@^3.0.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@polymer/polymer/-/polymer-3.3.0.tgz#52a0665ac29654728e8f46e8ee178c02c49efdd0" - integrity sha512-rij7suomS7DxdBamnwr/Xa0V5hpypf7I9oYKseF2FWz5Xh2a3wJNpVjgJy1adXVCxqIyPhghsrthnfCt7EblsQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@polymer/polymer/-/polymer-3.3.1.tgz#9ad48992d2a96775f80b0673f3a615d6df8a3dfc" + integrity sha512-8KaB48tzyMjdsHdxo5KvCAaqmTe7rYDzQAoj/pyEfq9Fp4YfUaS+/xqwYj0GbiDAUNzwkmEQ7dw9cgnRNdKO8A== dependencies: "@webcomponents/shadycss" "^1.9.1" @@ -2520,9 +2572,9 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@^4.1.7": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.3.tgz#419477a3d5202bad19e14c787940a61dc9ea6407" - integrity sha512-VRw2xEGbll3ZiTQ4J02/hUjNqZoue1bMhoo2dgM2LXjDdyaq4q80HgBDHwpI0/VKlo4Eg+BavyQMv/NYgTetzA== + version "4.2.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.5.tgz#f8da153ebbe30babb0adc9a528b9ad32be3175a2" + integrity sha512-YvbLiIc0DbbhiANrfVObdkLEHJksQZVq0Uvfg550SRAKVYaEJy+V70j65BVe2WNp6E3HtKsUczeijHFCjba3og== "@types/clone@^0.1.29": version "0.1.30" @@ -2553,20 +2605,25 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== -"@types/node@*": - version "12.11.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.2.tgz#75ba3beda30d690b89a5089ca1c6e8e386150b76" - integrity sha512-dsfE4BHJkLQW+reOS6b17xhZ/6FB1rB8eRRvO08nn5o+voxf3i74tuyFWNH6djdfgX7Sm5s6LD8t6mJug4dpDw== +"@types/node@*", "@types/node@>= 8": + version "12.12.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.11.tgz#bec2961975888d964196bf0016a2f984d793d3ce" + integrity sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ== "@types/node@^11.13.0": - version "11.13.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.22.tgz#91ee88ebfa25072433497f6f3150f84fa8c3a91b" - integrity sha512-rOsaPRUGTOXbRBOKToy4cgZXY4Y+QSVhxcLwdEveozbk7yuudhWMpxxcaXqYizLMP3VY7OcWCFtx9lGFh5j5kg== + version "11.15.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.2.tgz#998b9cacc5f26e441d8396340818fde8e08aada5" + integrity sha512-BqCU9uIFkUH9Sgo2uLYbmIiFB1T+VBiM8AI/El3LIAI5KzwtckeSG+3WOYZr9aMoX4UIvRFBWBeSaOu6hFue2Q== "@types/node@^6.0.0": - version "6.14.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.7.tgz#2173f79d7a61d97d3aad2feeaac7ac69a3df39af" - integrity sha512-YbPXbaynBTe0pVExPhL76TsWnxSPeFAvImIsmylpBWn/yfw+lHy+Q68aawvZHsgskT44ZAoeE67GM5f+Brekew== + version "6.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0" + integrity sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/parse5@^2.2.32": version "2.2.34" @@ -2581,9 +2638,9 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/react@*": - version "16.9.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.9.tgz#a62c6f40f04bc7681be5e20975503a64fe783c3a" - integrity sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg== + version "16.9.11" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120" + integrity sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -2772,9 +2829,9 @@ "@xtuc/long" "4.2.2" "@webcomponents/shadycss@^1.9.1": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@webcomponents/shadycss/-/shadycss-1.9.2.tgz#6a3a65951b5a97279dd9b92cc277dd815d0e1fad" - integrity sha512-GsD7RpDVrVdgC6e+D8zQia8RGNmEGQ9/qotnVPQYPrIXhGS5xSt6ZED9YmuHz3HbLqY+E54tE1EK3tjLzSCGrw== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@webcomponents/shadycss/-/shadycss-1.9.3.tgz#74ee4be13f5374724aecb3d2c2de77523e01ada9" + integrity sha512-fRuET+UGrH84hG0UF4iHbFqWZKUoan4/ki+iCOJ/vnKltPSHv/ZVbcA6sT/pRreznt8aKEGqN2KdHvgRxn4xjA== "@webcomponents/webcomponentsjs@^1.2.0": version "1.3.3" @@ -2782,9 +2839,9 @@ integrity sha512-eLH04VBMpuZGzBIhOnUjECcQPEPcmfhWEijW9u1B5I+2PPYdWf3vWUExdDxu4Y3GljRSTCOlWnGtS9tpzmXMyQ== "@webcomponents/webcomponentsjs@^2.2.0", "@webcomponents/webcomponentsjs@^2.2.10", "@webcomponents/webcomponentsjs@^2.2.5": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.3.0.tgz#d17c67e9602d46f5a6c425bc00613bba83dcd0e2" - integrity sha512-sR6FOrNnnncRuoJDqq9QxtRsJMbIvASw4vnJwIYKVlKO3AMc+NAr/bIQNnUiTTE9pBDTJkFpVaUdjJaRdsjmyA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.0.tgz#e9dd031d24c234eff8824f7560e5c0c605d3d6a0" + integrity sha512-kEClEz2nu9/i6SvyBJTV4pCc6CyCzMhK7zEeJ6QhiJoulBp4YZ06Zfj2E2HUXfWfHJIjtKriJYMtfhettKEjEg== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -2895,9 +2952,9 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" "airbnb-js-shims@^1 || ^2": - version "2.2.0" - resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.0.tgz#46e1d9d9516f704ef736de76a3b6d484df9a96d8" - integrity sha512-pcSQf1+Kx7/0ibRmxj6rmMYc5V8SHlKu+rkQ80h0bjSLDaIxHg/3PiiFJi4A9mDc01CoBHoc8Fls2G/W0/+s5g== + version "2.2.1" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" + integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" @@ -2912,7 +2969,7 @@ agentkeepalive@^3.4.1: object.values "^1.1.0" promise.allsettled "^1.0.0" promise.prototype.finally "^3.1.0" - string.prototype.matchall "^3.0.1" + string.prototype.matchall "^4.0.0 || ^3.0.1" string.prototype.padend "^3.0.0" string.prototype.padstart "^3.0.0" symbol.prototype.description "^1.0.0" @@ -2973,6 +3030,13 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + ansi-gray@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" @@ -3007,6 +3071,11 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -3329,16 +3398,16 @@ atob@^2.1.1: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.4.7: - version "9.6.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.5.tgz#98f4afe7e93cccf323287515d426019619775e5e" - integrity sha512-rGd50YV8LgwFQ2WQp4XzOTG69u1qQsXn0amww7tjqV5jJuNazgFKYEVItEBngyyvVITKOg20zr2V+9VsrXJQ2g== + version "9.7.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.2.tgz#26cf729fbb709323b40171a874304884dcceffed" + integrity sha512-LCAfcdej1182uVvPOZnytbq61AhnOZ/4JelDaJGDeNwewyU1AMaNthcHsyz1NRjTmd2FkurMckLWfkHg3Z//KA== dependencies: - browserslist "^4.7.0" - caniuse-lite "^1.0.30000999" + browserslist "^4.7.3" + caniuse-lite "^1.0.30001010" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.18" + postcss "^7.0.23" postcss-value-parser "^4.0.2" autosize@4.0.2: @@ -3443,18 +3512,6 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= -babel-plugin-bare-import-rewrite@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-bare-import-rewrite/-/babel-plugin-bare-import-rewrite-1.5.1.tgz#dbad68df5b7ddabd012674a42a473beaee0d5a0f" - integrity sha512-1pvMq1G5RPmpiPcF0xOfY5dx29ZhYcdMhD2I3d6xhnuBMPRoElLuDg/hEweiUM0SzZ9FsKmmlH3zZ127V2TGGg== - dependencies: - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - arrify "^2.0.1" - minimatch "^3.0.4" - path-is-inside "^1.0.2" - resolve "^1.11.1" - whatwg-url "^7.0.0" - babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" @@ -3462,15 +3519,15 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.14, babel-plugin-emotion@^10.0.17, babel-plugin-emotion@^10.0.7: - version "10.0.21" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.21.tgz#9ebeb12edeea3e60a5476b0e07c9868605e65968" - integrity sha512-03o+T6sfVAJhNDcSdLapgv4IeewcFPzxlvBUVdSf7o5PI57ZSxoDvmy+ZulVWSu+rOWAWkEejNcsb29TuzJHbg== +babel-plugin-emotion@^10.0.22, babel-plugin-emotion@^10.0.23, babel-plugin-emotion@^10.0.7: + version "10.0.23" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.23.tgz#040d40bf61dcab6d31dd6043d10e180240b8515b" + integrity sha512-1JiCyXU0t5S2xCbItejCduLGGcKmF3POT0Ujbexog2MI4IlRcIn/kWjkYwCUZlxpON0O5FC635yPl/3slr7cKQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@emotion/hash" "0.7.3" "@emotion/memoize" "0.7.3" - "@emotion/serialize" "^0.11.11" + "@emotion/serialize" "^0.11.14" babel-plugin-macros "^2.0.0" babel-plugin-syntax-jsx "^6.18.0" convert-source-map "^1.5.0" @@ -3507,13 +3564,13 @@ babel-plugin-istanbul@^5.1.4: test-exclude "^5.2.3" babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.4.5: - version "2.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" - integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.7.0.tgz#f409a674cbbe548b60cbdf495ec059a2de429ab7" + integrity sha512-eV/9IWjmwT/TDCrNzA9sgO/j+x1dWAdLds7KLTY/emkLimzYbiXugfa0EO9IMkLeBBYvS0OdY+6pkF5VGf0iog== dependencies: - "@babel/runtime" "^7.4.2" - cosmiconfig "^5.2.0" - resolve "^1.10.0" + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" babel-plugin-minify-builtins@^0.5.0: version "0.5.0" @@ -3937,6 +3994,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +browserslist-useragent@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/browserslist-useragent/-/browserslist-useragent-3.0.2.tgz#f0e209b2742baa5de0e451b52e678e8b4402617c" + integrity sha512-/UPzK9xZnk5mwwWx4wcuBKAKx/mD3MNY8sUuZ2NPqnr4RVFWZogX+8mOP0cQEYo8j78sHk0hiDNaVXZ1U3hM9A== + dependencies: + browserslist "^4.6.6" + semver "^6.3.0" + useragent "^2.3.0" + browserslist@4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" @@ -3946,14 +4012,14 @@ browserslist@4.4.1: electron-to-chromium "^1.3.103" node-releases "^1.1.3" -browserslist@^4.5.6, browserslist@^4.6.0, browserslist@^4.7.0, browserslist@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.1.tgz#bd400d1aea56538580e8c4d5f1c54ac11b5ab468" - integrity sha512-QtULFqKIAtiyNx7NhZ/p4rB8m3xDozVo/pi5VgTlADLF2tNigz/QH+v0m5qhn7XfHT7u+607NcCNOnC0HZAlMg== +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.6, browserslist@^4.7.2, browserslist@^4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3" + integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ== dependencies: - caniuse-lite "^1.0.30000999" - electron-to-chromium "^1.3.284" - node-releases "^1.1.36" + caniuse-lite "^1.0.30001010" + electron-to-chromium "^1.3.306" + node-releases "^1.1.40" browserstack-local@^1.3.7: version "1.4.2" @@ -4016,9 +4082,9 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -4058,7 +4124,7 @@ byte-size@^5.0.1: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== -bytes@3.1.0: +bytes@3.1.0, bytes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== @@ -4181,10 +4247,20 @@ camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000999: - version "1.0.30001002" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001002.tgz#ba999a737b1abd5bf0fd47efe43a09b9cadbe9b0" - integrity sha512-pRuxPE8wdrWmVPKcDmJJiGBxr6lFJq4ivdSeo9FTmGj5Rb8NX3Mby2pARG57MXF15hYAhZ0nHV5XxT2ig4bz3g== +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30001008, caniuse-lite@^1.0.30001010: + version "1.0.30001011" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001011.tgz#0d6c4549c78c4a800bb043a83ca0cbe0aee6c6e1" + integrity sha512-h+Eqyn/YA6o6ZTqpS86PyRmNWOs1r54EBDcd2NTwwfsXQ8re1B38SnB+p2RKF8OUsyEIjeDU8XGec1RGO/wYCg== case-sensitive-paths-webpack-plugin@^2.2.0: version "2.2.0" @@ -4196,10 +4272,10 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chai-a11y-axe@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/chai-a11y-axe/-/chai-a11y-axe-1.2.1.tgz#173c9bb5cd534ccc9039edc3cdeed7692ab60f15" - integrity sha512-g5oih6smbZ9YF/X+TiWXJvdoMeYLOdczR14lFCQdHObvz/NTnI4Tt/kVhXiQzTY+85rQeEugYHEvXr7oSr4ADA== +chai-a11y-axe@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/chai-a11y-axe/-/chai-a11y-axe-1.2.2.tgz#90cfda8f352328951de5ad18a2ad6a8eb742cfd9" + integrity sha512-T1QjDQ7bVKTc2vlJWA6Rh18qZE8uHhNaNdb7V0nF7TLYwso03ycWvRJWFLtdLtf6l9v/JOCamKDNo7PzbVQyAg== chai-dom@^1.8.1: version "1.8.1" @@ -4312,10 +4388,10 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.0.0, chokidar@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.2.tgz#a433973350021e09f2b853a2287781022c0dc935" - integrity sha512-bw3pm7kZ2Wa6+jQWYP/c7bAZy3i4GwiIiMO2EeRjrE48l8vBqC/WvFhSF0xyM8fQiPEGvwMY/5bqDG7sSEOuhg== +chokidar@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -4386,6 +4462,13 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-table3@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -4449,6 +4532,15 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone-stats@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" @@ -4558,11 +4650,6 @@ command-line-usage@^5.0.5: table-layout "^0.4.3" typical "^2.6.1" -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -4573,6 +4660,11 @@ commander@^2.14.1, commander@^2.19.0, commander@^2.20.0, commander@^2.9.0, comma resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" + integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== + commander@~2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -4628,6 +4720,13 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= +compressible@^2.0.0: + version "2.0.17" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" + integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== + dependencies: + mime-db ">= 1.40.0 < 2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -4677,11 +4776,9 @@ connect@^3.6.0: utils-merge "1.0.1" console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -4719,9 +4816,9 @@ conventional-changelog-angular@^1.3.3: q "^1.5.1" conventional-changelog-angular@^5.0.3: - version "5.0.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.5.tgz#69b541bcf3e538a8578b1e5fbaabe9bd8f572b57" - integrity sha512-RrkdWnL/TVyWV1ayWmSsrWorsTDqjL/VwG5ZSEneBQrd65ONcfeA1cW7FLtNweQyMiKOyriCMTKRSlk18DjTrw== + version "5.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" + integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== dependencies: compare-func "^1.3.1" q "^1.5.1" @@ -4746,22 +4843,22 @@ conventional-changelog-core@^3.1.6: through2 "^3.0.0" conventional-changelog-preset-loader@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.2.0.tgz#571e2b3d7b53d65587bea9eedf6e37faa5db4fcc" - integrity sha512-zXB+5vF7D5Y3Cb/rJfSyCCvFphCVmF8mFqOdncX3BmjZwAtGAPfYrBcT225udilCKvBbHgyzgxqz2GWDB5xShQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz#580fa8ab02cef22c24294d25e52d7ccd247a9a6a" + integrity sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ== conventional-changelog-writer@^4.0.6: - version "4.0.9" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.9.tgz#44ac4c48121bc90e71cb2947e1ea1a6c222ccd7f" - integrity sha512-2Y3QfiAM37WvDMjkVNaRtZgxVzWKj73HE61YQ/95T53yle+CRwTVSl6Gbv/lWVKXeZcM5af9n9TDVf0k7Xh+cw== + version "4.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" + integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== dependencies: compare-func "^1.3.1" conventional-commits-filter "^2.0.2" dateformat "^3.0.0" handlebars "^4.4.0" json-stringify-safe "^5.0.1" - lodash "^4.2.1" - meow "^4.0.0" + lodash "^4.17.15" + meow "^5.0.0" semver "^6.0.0" split "^1.0.0" through2 "^3.0.0" @@ -4788,14 +4885,14 @@ conventional-commits-parser@^2.1.0: trim-off-newlines "^1.0.0" conventional-commits-parser@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.5.tgz#df471d6cb3f6fecfd1356ac72e0b577dbdae0a9c" - integrity sha512-qVz9+5JwdJzsbt7JbJ6P7NOXBGt8CyLFJYSjKAuPSgO+5UGfcsbk9EMR+lI8Unlvx6qwIc2YDJlrGIfay2ehNA== + version "3.0.8" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" + integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== dependencies: JSONStream "^1.0.4" - is-text-path "^2.0.0" - lodash "^4.2.1" - meow "^4.0.0" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^5.0.0" split2 "^2.0.0" through2 "^3.0.0" trim-off-newlines "^1.0.0" @@ -4814,10 +4911,10 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.1.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== +convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" @@ -4868,17 +4965,17 @@ copy-to-clipboard@^3.0.8: dependencies: toggle-selection "^1.0.6" -core-js-bundle@^3.1.4: - version "3.3.3" - resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.3.3.tgz#92298bfc3af7d8d0103d90c2ff4cf8fa770130fa" - integrity sha512-QMyPnSc08kURa9PQQ45zsIQOSB0eRxpJJz14rmXmVEJvgrJg8IxcpvenzfvkFSiNTxmhmoub0YtCLtjlJoHjZA== +core-js-bundle@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/core-js-bundle/-/core-js-bundle-3.4.1.tgz#3f60fcc73af72d2d2dd0d271e465659811ee7ecf" + integrity sha512-PwRUfaT1LdYbqzZ9kJRhl1FY+bBUJC/OeZLMZ/XLykxKJg9jKJp9drRG+HsWv23D2S3yOLMaUGTjUr9oy15yxw== core-js-compat@^3.1.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.3.tgz#82642808cf484a35292b2f8e83ef9376884e760f" - integrity sha512-GNZkENsx5pMnS7Inwv7ZO/s3B68a9WU5kIjxqrD/tkNR8mtfXJRk8fAKRlbvWZSGPc59/TkiOBDYl5Cb65pTVA== + version "3.4.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.1.tgz#e12c5a3ef9fcb50fd9d9a32805bfe674f9139246" + integrity sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw== dependencies: - browserslist "^4.7.1" + browserslist "^4.7.2" semver "^6.3.0" core-js@^1.0.0: @@ -4906,6 +5003,17 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.7, cosmiconfig@^5.1.0, cosmiconfig@^5.2.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5113,11 +5221,6 @@ date-format@^2.0.0: resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -5216,7 +5319,7 @@ deep-object-diff@^1.1.0: resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw== -deepmerge@^3.2.0, deepmerge@^3.3.0: +deepmerge@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== @@ -5307,9 +5410,9 @@ deprecation@^2.0.0: integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -5427,9 +5530,9 @@ dom-serialize@^2.2.0: void-elements "^2.0.0" dom-serializer@0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" - integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: domelementtype "^2.0.1" entities "^2.0.0" @@ -5586,14 +5689,14 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= ejs@^2.6.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" - integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.284: - version "1.3.292" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.292.tgz#7812fc5138619342f1dd5823df6e9cbb7d2820e9" - integrity sha512-hqkem5ANpt6mxVXmhAmlbdG8iicuyM/jEYgmP1tiHPeOLyZoTyGUzrDmJS/xyrrZy9frkW1uQcubicu7f6DS5g== +electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.306: + version "1.3.307" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.307.tgz#e9b98901371d20164af7c0ca5bc820bd4305ccd3" + integrity sha512-01rTsAqHwf3D2X6NtlUvzB2hxDj67kiTVIO5GWdFb2unA0QvFvrjyrtc993ByRLF+surlr+9AvJdD0UYs5HzwA== elegant-spinner@^1.0.1: version "1.0.1" @@ -5618,6 +5721,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -5761,7 +5869,7 @@ error-inject@^1.0.0: resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= -es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.14.2, es-abstract@^1.15.0, es-abstract@^1.16.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.16.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.16.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== @@ -5777,27 +5885,36 @@ es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.14.2, es-abstract@^1.15 string.prototype.trimleft "^2.1.0" string.prototype.trimright "^2.1.0" -es-dev-server@^1.18.5: - version "1.18.5" - resolved "https://registry.yarnpkg.com/es-dev-server/-/es-dev-server-1.18.5.tgz#db584530e94902b81a6e9a7492aa3bca5695c9f9" - integrity sha512-DXkyOcxJL1J347vexZSww0KF5xE1urObNlEP84I0W4tiDgKvZbXsSrt6B+M4fSiQh5Fte5sYoWMdaHd+eoiihA== +es-dev-server@^1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/es-dev-server/-/es-dev-server-1.24.1.tgz#3fd6e83e8bab69c3f55bd0d87195c2d10f23c3b3" + integrity sha512-gxbEyatMMLheDoXWdzgJSIGlnUcf4Tp3IcN5wmPYYmXcNMbQSXnanKzdfOexaZ5BQZVNlfZN04PMFZHTuwpPIw== dependencies: - "@babel/core" "^7.4.5" + "@babel/core" "^7.7.2" + "@babel/plugin-proposal-dynamic-import" "^7.7.0" + "@babel/plugin-syntax-class-properties" "^7.2.0" "@babel/plugin-syntax-import-meta" "^7.2.0" - "@babel/preset-env" "^7.4.5" - "@open-wc/building-utils" "^2.10.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + "@babel/plugin-syntax-numeric-separator" "^7.2.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + "@babel/preset-env" "^7.7.1" + "@open-wc/building-utils" "^2.10.3" "@types/minimatch" "^3.0.3" - babel-plugin-bare-import-rewrite "^1.5.1" + browserslist "^4.7.2" + browserslist-useragent "^3.0.2" camelcase "^5.3.1" + caniuse-api "^3.0.0" + caniuse-lite "^1.0.30001008" chokidar "^3.0.0" command-line-args "^5.0.2" command-line-usage "^5.0.5" debounce "^1.2.0" - deepmerge "^3.3.0" + deepmerge "^3.2.0" es-module-lexer "0.3.9" get-stream "^5.1.0" is-stream "^2.0.0" koa "^2.7.0" + koa-compress "^3.0.0" koa-etag "^3.0.0" koa-static "^5.0.0" lru-cache "^5.1.1" @@ -5805,8 +5922,9 @@ es-dev-server@^1.18.5: opn "^5.4.0" path-is-inside "^1.0.2" portfinder "^1.0.21" - resolve "^1.12.0" + resolve "^1.11.1" strip-ansi "^5.2.0" + useragent "^2.3.0" whatwg-url "^7.0.0" es-module-lexer@0.3.9: @@ -5820,9 +5938,9 @@ es-module-shims@^0.4.5: integrity sha512-EzVhnLyA/zvmGrAy2RU8m9xpxX7u2yb2by1GZH80SHF6lakG21YAm3Vo56KsLIXaIjT9QabqjYpQU1S5FkM8+Q== es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -5924,6 +6042,11 @@ eslint-plugin-import@^2.18.0: read-pkg-up "^2.0.0" resolve "^1.11.0" +eslint-plugin-no-only-tests@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.3.1.tgz#7b24a4df55b818d0838410aa96b24a5a4a072262" + integrity sha512-LzCzeQrlkNjEwUWEoGhfjz+Kgqe0080W6qC8I8eFwSMXIsr1zShuIQnRuSZc4Oi7k1vdUaNGDc+/GFvg6IHSHA== + eslint-plugin-wc@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-wc/-/eslint-plugin-wc-1.2.0.tgz#c47cedfce92823ea9bd5ebbe25121377cdcb55e4" @@ -5956,7 +6079,7 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.2: +eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== @@ -5969,9 +6092,9 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== eslint@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6" - integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04" + integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -5980,9 +6103,9 @@ eslint@^6.1.0: debug "^4.0.1" doctrine "^3.0.0" eslint-scope "^5.0.0" - eslint-utils "^1.4.2" + eslint-utils "^1.4.3" eslint-visitor-keys "^1.1.0" - espree "^6.1.1" + espree "^6.1.2" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -5992,7 +6115,7 @@ eslint@^6.1.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.4.1" + inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" @@ -6019,7 +6142,7 @@ espree@^3.4.3: acorn "^5.5.0" acorn-jsx "^3.0.0" -espree@^6.1.1: +espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== @@ -6282,7 +6405,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -6339,6 +6462,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -6644,9 +6774,9 @@ fsevents@^1.2.7: node-pre-gyp "^0.12.0" fsevents@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9" - integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw== + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" @@ -6674,9 +6804,9 @@ functions-have-names@^1.1.1: integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== fuzzy-search@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fuzzy-search/-/fuzzy-search-3.0.1.tgz#14a4964508a9607d6e9a88818e7ff634108260b6" - integrity sha512-rjUvzdsMlOyarm0oD5k6zVQwgvt4Tb5Xe3YdIGU+Vogw54+ueAGPUTMU2B9jfPQEie5cD11i/S9J9d+MNBSQ3Q== + version "3.0.2" + resolved "https://registry.yarnpkg.com/fuzzy-search/-/fuzzy-search-3.0.2.tgz#d388dc072cb1dfd6d518f492ea2bb43471ff86ed" + integrity sha512-u3moKS69EAq12J+EPjAeF64u4gir6OzX/gDUNu4FXW2/5UfqqxvuYLWDEf7ehaz/TIMuYYh98HlJ2caUbpAiww== g-status@^2.0.2: version "2.0.2" @@ -6889,18 +7019,6 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -6914,9 +7032,9 @@ glob@7.1.3: path-is-absolute "^1.0.0" glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.2: - version "7.1.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" - integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -7016,9 +7134,9 @@ good-listener@^1.2.2: delegate "^3.1.2" graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -7110,9 +7228,9 @@ gzip-size@5.0.0: pify "^3.0.0" handlebars@^4.1.2, handlebars@^4.4.0: - version "4.4.5" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.5.tgz#1b1f94f9bfe7379adda86a8b73fb570265a0dddd" - integrity sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg== + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -7158,9 +7276,9 @@ has-flag@^3.0.0: integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" @@ -7221,26 +7339,21 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hast-util-parse-selector@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz#66aabccb252c47d94975f50a281446955160380b" - integrity sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw== +hast-util-parse-selector@^2.0.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.3.tgz#57edd449103900c7f63fd9e6f694ffd7e4634719" + integrity sha512-nxbeqjQNxsvo/uYYAw9kij6td05YVUlf1qti09rVfbWSLT5H6wo3c+USIwX6nzXWk5kFZzXnEqO82856r0aM2Q== hastscript@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.0.tgz#a19b3cca6a26a2bcd0f1b1eac574af9427c1c7df" - integrity sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.1.tgz#71726ee1e97220575d1f29a8e937387d99d48275" + integrity sha512-xHo1Hkcqd0LlWNuDL3/BxwhgAGp3d7uEvCMgCTrBY+zsOooPPH+8KAvW8PCgl+GB8H3H44nfSaF0A4BQ+4xlYg== dependencies: comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.2.0" - property-information "^5.0.1" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" space-separated-tokens "^1.0.0" -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - he@1.2.0, he@1.2.x, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -7278,9 +7391,9 @@ hoist-non-react-statics@^2.3.1: integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== hoist-non-react-statics@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" - integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#101685d3aff3b23ea213163f6e8e12f4f111e19f" + integrity sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw== dependencies: react-is "^16.7.0" @@ -7305,6 +7418,19 @@ html-loader@^0.5.1: loader-utils "^1.1.0" object-assign "^4.1.1" +html-minifier-terser@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz#0e67a0b062ae1dd0719fc73199479298f807ae16" + integrity sha512-VAaitmbBuHaPKv9bj47XKypRhgDxT/cDLvsPiiF7w+omrN3K0eQhpigV9Z1ilrmHa9e0rOYcD6R/+LCDADGcnQ== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^4.0.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + terser "^4.3.9" + html-minifier@^3.5.8: version "3.5.21" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" @@ -7332,13 +7458,13 @@ html-minifier@^4.0.0: uglify-js "^3.5.1" html-webpack-plugin@^4.0.0-beta.2: - version "4.0.0-beta.8" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.8.tgz#d9a8d4322d8cf310f1568f6f4f585a80df0ad378" - integrity sha512-n5S2hJi3/vioRvEDswZP2WFgZU8TUqFoYIrkg5dt+xDC4TigQEhIcl4Y81Qs2La/EqKWuJZP8+ikbHGVmzQ4Mg== + version "4.0.0-beta.11" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== dependencies: - html-minifier "^4.0.0" + html-minifier-terser "^5.0.1" loader-utils "^1.2.3" - lodash "^4.17.11" + lodash "^4.17.15" pretty-error "^2.1.1" tapable "^1.1.3" util.promisify "1.0.0" @@ -7436,10 +7562,10 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.3.tgz#fb6cd98ed5b9c35056b5a73cd01a8a721d7193d1" - integrity sha512-Ytgnz23gm2DVftnzqRRz2dOXZbGd2uiajSw/95bPp6v53zPRspQjLm/AfBgqbJ2qfeRXWIOMVLpp86+/5yX39Q== +https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: agent-base "^4.3.0" debug "^3.1.0" @@ -7538,10 +7664,10 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" - integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== +import-fresh@^3.0.0, import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -7663,7 +7789,7 @@ inquirer@6.2.1: strip-ansi "^5.0.0" through "^2.3.6" -inquirer@^6.2.0, inquirer@^6.4.1: +inquirer@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -7682,6 +7808,25 @@ inquirer@^6.2.0, inquirer@^6.4.1: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" + integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + interpret@^1.0.0, interpret@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" @@ -7699,7 +7844,7 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ip@^1.1.5: +ip@1.1.5, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= @@ -7876,6 +8021,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" @@ -8040,20 +8190,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-text-path@^1.0.0: +is-text-path@^1.0.0, is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: text-extensions "^1.0.0" -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== - dependencies: - text-extensions "^2.0.0" - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -8438,7 +8581,7 @@ karma-source-map-support@^1.3.0: dependencies: source-map-support "^0.5.5" -karma@^4.0.0: +karma@^4.1.0: version "4.4.1" resolved "https://registry.yarnpkg.com/karma/-/karma-4.4.1.tgz#6d9aaab037a31136dc074002620ee11e8c2e32ab" integrity sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A== @@ -8530,6 +8673,16 @@ koa-compose@^4.1.0: resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== +koa-compress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/koa-compress/-/koa-compress-3.0.0.tgz#3194059c215cbc24e59bbc84c2c7453a4c88564f" + integrity sha512-xol+LkNB1mozKJkB5Kj6nYXbJXhkLkZlXl9BsGBPjujVfZ8MsIXwU4GHRTT7TlSfUcl2DU3JtC+j6wOWcovfuQ== + dependencies: + bytes "^3.0.0" + compressible "^2.0.0" + koa-is-json "^1.0.0" + statuses "^1.0.0" + koa-convert@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" @@ -8570,9 +8723,9 @@ koa-static@^5.0.0: koa-send "^5.0.0" koa@^2.7.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.10.0.tgz#86a583ff280896dce3a36b0b6dae80f9559240d3" - integrity sha512-vcZopGEWHDokchYtjU6jF1BCy+2MA2hnvGP7xPi26qWoIS0OiAUb4+lCqkqf05qG5ULnGYUFTvFnSK9RyOoiKw== + version "2.11.0" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.11.0.tgz#fe5a51c46f566d27632dd5dc8fd5d7dd44f935a4" + integrity sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA== dependencies: accepts "^1.3.5" cache-content-type "^1.0.0" @@ -8592,7 +8745,6 @@ koa@^2.7.0: is-generator-function "^1.0.7" koa-compose "^4.1.0" koa-convert "^1.2.0" - koa-is-json "^1.0.0" on-finished "^2.3.0" only "~0.0.2" parseurl "^1.3.2" @@ -8663,6 +8815,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + linez@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/linez/-/linez-4.1.4.tgz#4f1db16965c3a19e394a29313023cc9cb29f02a7" @@ -8886,6 +9043,11 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.mergewith@^4.6.1: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" @@ -9054,15 +9216,15 @@ make-error@^1.3.5: integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== make-fetch-happen@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz#a8e3fe41d3415dd656fe7b8e8172e1fb4458b38d" - integrity sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" + integrity sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag== dependencies: agentkeepalive "^3.4.1" cacache "^12.0.0" http-cache-semantics "^3.8.1" http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" + https-proxy-agent "^2.2.3" lru-cache "^5.1.1" mississippi "^3.0.0" node-fetch-npm "^2.0.2" @@ -9242,7 +9404,7 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -meow@5.0.0: +meow@5.0.0, meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== @@ -9330,17 +9492,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== +mime-db@1.42.0, "mime-db@>= 1.40.0 < 2": + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + version "2.1.25" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" + integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== dependencies: - mime-db "1.40.0" + mime-db "1.42.0" mime@1.6.0: version "1.6.0" @@ -9357,7 +9519,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -9469,24 +9631,7 @@ mkdirp@*, mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" -mocha@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -mocha@^6.2.0: +mocha@^6.0.0: version "6.2.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== @@ -9577,7 +9722,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mute-stream@~0.0.4: +mute-stream@0.0.8, mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== @@ -9685,7 +9830,7 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0: +node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -9752,10 +9897,10 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.3, node-releases@^1.1.36: - version "1.1.37" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.37.tgz#af787db03833a7cda5d197cbb8262d5527270bd8" - integrity sha512-0EOsAEdn6S2vQdDGBWBpmClm5BCkXVkVOURdnhfg7//rxI2XbleRdKig87WuBrk+0PHZ4OhO58fRm9mzWW4jNw== +node-releases@^1.1.3, node-releases@^1.1.40: + version "1.1.40" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.40.tgz#a94facfa8e2d612302601ca1361741d529c4515a" + integrity sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ== dependencies: semver "^6.3.0" @@ -9966,9 +10111,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -10070,6 +10215,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" @@ -10098,16 +10250,16 @@ optimist@^0.6.1: wordwrap "~0.0.2" optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" - fast-levenshtein "~2.0.4" + fast-levenshtein "~2.0.6" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" - wordwrap "~1.0.0" + word-wrap "~1.2.3" ordered-read-streams@^1.0.0: version "1.0.1" @@ -10334,6 +10486,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-node-version@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -10377,9 +10539,9 @@ parse5@^3.0.2: "@types/node" "*" parse5@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== parseqs@0.0.5: version "0.0.5" @@ -10453,9 +10615,9 @@ path-to-regexp@0.1.7: integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: isarray "0.0.1" @@ -10482,6 +10644,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -10511,9 +10678,9 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picomatch@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + version "2.1.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" + integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== pidtree@^0.3.0: version "0.3.0" @@ -10722,10 +10889,10 @@ postcss@^6.0.9: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.18, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" - integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== +postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1" + integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -10736,10 +10903,10 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@^1.15.0, prettier@^1.16.4: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +prettier@^1.16.4, prettier@^1.18.2: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== pretty-error@^2.1.1: version "2.1.1" @@ -10845,7 +11012,7 @@ property-expr@^1.5.0: resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== -property-information@^5.0.1: +property-information@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.3.0.tgz#bc87ac82dc4e72a31bb62040544b1bf9653da039" integrity sha512-IslotQn1hBCZDY7SaJ3zmCjVea219VTwmOk6Pu3z9haU9m4+T8GwaDubur+6NMHEU+Fjs/6/p66z6QULPkcL1w== @@ -10967,9 +11134,9 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.5.2: - version "6.9.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.0.tgz#d1297e2a049c53119cb49cca366adbbacc80b409" - integrity sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA== + version "6.9.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" + integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== qs@~6.5.2: version "6.5.2" @@ -11106,14 +11273,14 @@ react-dev-utils@^7.0.0: text-table "0.2.0" react-dom@^16.8.1: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.10.2.tgz#4840bce5409176bc3a1f2bd8cb10b92db452fda6" - integrity sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.16.2" + scheduler "^0.18.0" react-draggable@^3.1.1: version "3.3.2" @@ -11177,9 +11344,9 @@ react-inspector@^2.3.0, react-inspector@^2.3.1: prop-types "^15.6.1" react-is@^16.7.0, react-is@^16.8.1: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" - integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -11187,9 +11354,9 @@ react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.2, react-lifecycles integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-modal@^3.8.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.10.1.tgz#ba37927871830c798f51404aa6bc71ff7a5e4c16" - integrity sha512-2DKIfdOc8+WY+SYJ/xf/WBwOYMmNAYAyGkYlc4e1TCs9rk1xY4QBz04hB3UHGcrLChh7ce77rHAe6VPNmuLYsQ== + version "3.11.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.11.1.tgz#2a0d6877c9e98f123939ea92d2bb4ad7fa5a17f9" + integrity sha512-8uN744Yq0X2lbfSLxsEEc2UV3RjSRb4yDVxRQ1aGzPo86QjNOwhQSukDb8U8kR+636TRTvfMren10fgOjAy9eA== dependencies: exenv "^1.2.0" prop-types "^15.5.10" @@ -11197,17 +11364,17 @@ react-modal@^3.8.1: warning "^4.0.3" react-popper-tooltip@^2.8.0: - version "2.9.1" - resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.9.1.tgz#cc602c89a937aea378d9e2675b1ce62805beb4f6" - integrity sha512-LSbvXLEQlNKWig2GMKQW/1bBwCkWIr9cpJ+WJpSGGGhX45CthRtwyilPPLJQkc3qI6UMTAXPp0Fe/pj9E77trg== + version "2.10.0" + resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.10.0.tgz#4d8383644d1002a50bd2bf74b2d1214d84ffc77c" + integrity sha512-iMNWaY41G7kcx2/kcV+37GLe4C93yI9CPZ9DH+V9tOtJIJwEzm/w9+mlr6G1QLzxefDxjliqymMXk9X73pyuWA== dependencies: "@babel/runtime" "^7.6.3" react-popper "^1.3.4" react-popper@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.4.tgz#f0cd3b0d30378e1f663b0d79bcc8614221652ced" - integrity sha512-9AcQB29V+WrBKk6X7p0eojd1f25/oJajVdMZkywIoAV6Ag7hzE1Mhyeup2Q1QnvFRtGQFQvtqfhlEoDAPfKAVA== + version "1.3.6" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.6.tgz#32122f83af8fda01bdd4f86625ddacaf64fdd06d" + integrity sha512-kLTfa9z8n+0jJvRVal9+vIuirg41rObg4Bbrvv/ZfsGPQDN9reyVVSxqnHF1ZNgXgV7x11PeUfd5ItF8DZnqhg== dependencies: "@babel/runtime" "^7.1.2" create-react-context "^0.3.0" @@ -11251,9 +11418,9 @@ react-syntax-highlighter@^8.0.1: refractor "^2.4.1" react-textarea-autosize@^7.0.4: - version "7.1.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz#3132cb77e65d94417558d37c0bfe415a5afd3445" - integrity sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz#70fdb333ef86bcca72717e25e623e90c336e2cda" + integrity sha512-uH3ORCsCa3C6LHxExExhF4jHoXYCQwE5oECmrRsunlspaDAbS4mGKNlWZqjLfInWtFQcf0o1n1jC/NGXFdUBCg== dependencies: "@babel/runtime" "^7.1.2" prop-types "^15.6.0" @@ -11269,9 +11436,9 @@ react-transition-group@^2.2.1: react-lifecycles-compat "^3.0.4" react@^16.8.1: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react/-/react-16.10.2.tgz#a5ede5cdd5c536f745173c8da47bda64797a4cf0" - integrity sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -11290,9 +11457,9 @@ reactjs-popup@^1.3.2: integrity sha512-9uoxUAcUomnNoBtdYXBmgsF4w46llsogE3tOvLb5IkR5MMrD6UZJK20ip9kDKXCYubSxNkdfQKqSb/c95rf/qA== read-cmd-shim@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.4.tgz#b4a53d43376211b45243f0072b6e603a8e37640d" - integrity sha512-Pqpl3qJ/QdOIjRYA0q5DND/gLvGOfpIz/fYVDGYpOXfW/lFrIttmLsBnd6IkyK10+JHU9zhsaudfvrQTBB9YFQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" + integrity sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA== dependencies: graceful-fs "^4.1.2" @@ -11816,6 +11983,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -11918,10 +12093,10 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.16.2.tgz#f74cd9d33eff6fc554edfb79864868e4819132c1" - integrity sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg== +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -12048,6 +12223,13 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shallowequal@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -12160,10 +12342,10 @@ slide@^1.1.6: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" - integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== snapdragon-node@^2.0.1: version "2.1.1" @@ -12262,12 +12444,12 @@ socks-proxy-agent@^4.0.0: socks "~2.3.2" socks@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" - integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== + version "2.3.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== dependencies: - ip "^1.1.5" - smart-buffer "4.0.2" + ip "1.1.5" + smart-buffer "^4.1.0" sort-keys@^2.0.0: version "2.0.0" @@ -12293,9 +12475,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.5, source-map-support@~0.5.12: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -12431,7 +12613,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0, statuses@~1.5.0: +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.0.0, statuses@^1.5.0, statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -12524,13 +12706,22 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.2.tgz#c1fdb23f90058e929a69cfa2e8b12300daefe030" - integrity sha512-hsRe42jQ8+OJej2GVjhnSVodQ3NQgHV0FDD6dW7ZTM22J4uIbuYiAADCCc1tfyN7ocEl/KUUbudM36E2tZcF8w== +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +"string.prototype.matchall@^4.0.0 || ^3.0.1": + version "4.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.0.tgz#47191e37b67dca43131706bc9c4550df31b2c471" + integrity sha512-/cSuf1qsUaPicdvXcVZJ98fM9FmvkXvw7PKSM5pTtlj4R9VLQc7B51fOZBMsGfv9UXhUhdpxSrEsGe2ObsR2cw== dependencies: define-properties "^1.1.3" - es-abstract "^1.14.2" + es-abstract "^1.15.0" function-bind "^1.1.1" has-symbols "^1.0.0" regexp.prototype.flags "^1.2.0" @@ -12620,6 +12811,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -12686,13 +12884,6 @@ stylis@^3.5.0: resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== - dependencies: - has-flag "^3.0.0" - supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" @@ -12848,10 +13039,10 @@ terser-webpack-plugin@^1.2.1, terser-webpack-plugin@^1.4.1: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser@^4.0.0, terser@^4.1.2: - version "4.3.9" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.9.tgz#e4be37f80553d02645668727777687dad26bbca8" - integrity sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA== +terser@^4.0.0, terser@^4.1.2, terser@^4.3.9: + version "4.4.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3" + integrity sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -12872,11 +13063,6 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== -text-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.0.0.tgz#43eabd1b495482fae4a2bf65e5f56c29f69220f6" - integrity sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ== - text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -13148,6 +13334,11 @@ type-fest@^0.3.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -13195,9 +13386,9 @@ uglify-js@3.4.x: source-map "~0.6.1" uglify-js@^3.1.4, uglify-js@^3.5.1: - version "3.6.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.3.tgz#1351533bbe22cc698f012589ed6bd4cbd971bff8" - integrity sha512-KfQUgOqTkLp2aZxrMbCuKCDGW9slFYu2A23A36Gs7sGzTLcRBDORdOi5E21KWHFIfkY8kzgi/Pr1cXCh0yIp5g== + version "3.6.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.9.tgz#85d353edb6ddfb62a9d798f36e91792249320611" + integrity sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw== dependencies: commander "~2.20.3" source-map "~0.6.1" @@ -13308,9 +13499,9 @@ unist-util-is@^3.0.0: integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== unist-util-remove-position@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz#d91aa8b89b30cb38bad2924da11072faa64fd972" - integrity sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" + integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A== dependencies: unist-util-visit "^1.1.0" @@ -13415,7 +13606,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -useragent@2.3.0: +useragent@2.3.0, useragent@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== @@ -13531,9 +13722,9 @@ verror@1.10.0: extsprintf "^1.2.0" vfile-location@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.5.tgz#c83eb02f8040228a8d2b3f10e485be3e3433e0a2" - integrity sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" + integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== vfile-message@^1.0.0: version "1.1.1" @@ -13601,9 +13792,9 @@ vinyl@^2.0.0, vinyl@^2.2.0: replace-ext "^1.0.0" vm-browserify@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" - integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== void-elements@^2.0.0: version "2.0.1" @@ -13788,16 +13979,16 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wordwrapjs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-3.0.0.tgz#c94c372894cadc6feb1a66bff64e1d9af92c5d1e" @@ -13940,6 +14131,13 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" + integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== + dependencies: + "@babel/runtime" "^7.6.3" + yargs-parser@13.1.1, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" @@ -14014,10 +14212,10 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yargs@^14.2.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" - integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg== +yargs@^14.2.2: + version "14.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.2.tgz#2769564379009ff8597cdd38fba09da9b493c4b5" + integrity sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA== dependencies: cliui "^5.0.0" decamelize "^1.2.0" From 6b2b91f1b367c58dd605645783667e1b93d5808c Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Tue, 26 Nov 2019 14:36:53 +0100 Subject: [PATCH 02/12] chore: refactor OverlayMixin, remove redundant lion-popup --- packages/dialog/src/LionDialog.js | 28 +++- .../src/LionInputDatepicker.js | 2 - packages/overlays/index.js | 2 - packages/overlays/lion-overlay.js | 3 - packages/overlays/src/LionOverlay.js | 95 ------------ packages/overlays/src/OverlayController.js | 39 ++--- packages/overlays/src/OverlayMixin.js | 138 ++++++++++++------ packages/overlays/stories/index.stories.js | 92 +++++++++--- .../overlays/test/OverlayController.test.js | 3 +- packages/overlays/test/lion-overlay.test.js | 79 ---------- packages/popup/README.md | 34 ----- packages/popup/index.js | 1 - packages/popup/lion-popup.js | 3 - packages/popup/src/LionPopup.js | 16 -- packages/popup/stories/index.stories.js | 131 ----------------- packages/popup/test/lion-popup.test.js | 63 -------- packages/tooltip/src/LionTooltip.js | 32 ++-- packages/tooltip/stories/index.stories.js | 54 +++---- stories/index.stories.js | 1 - 19 files changed, 250 insertions(+), 566 deletions(-) delete mode 100644 packages/overlays/lion-overlay.js delete mode 100644 packages/overlays/src/LionOverlay.js delete mode 100644 packages/overlays/test/lion-overlay.test.js delete mode 100644 packages/popup/README.md delete mode 100644 packages/popup/index.js delete mode 100644 packages/popup/lion-popup.js delete mode 100644 packages/popup/src/LionPopup.js delete mode 100644 packages/popup/stories/index.stories.js delete mode 100644 packages/popup/test/lion-popup.test.js diff --git a/packages/dialog/src/LionDialog.js b/packages/dialog/src/LionDialog.js index 390a20459..a35d920a4 100644 --- a/packages/dialog/src/LionDialog.js +++ b/packages/dialog/src/LionDialog.js @@ -1,6 +1,7 @@ -import { LionOverlay, OverlayController, withModalDialogConfig } from '@lion/overlays'; +import { OverlayController, withModalDialogConfig, OverlayMixin } from '@lion/overlays'; +import { LitElement, html } from '@lion/core'; -export class LionDialog extends LionOverlay { +export class LionDialog extends OverlayMixin(LitElement) { // eslint-disable-next-line class-methods-use-this _defineOverlay({ contentNode, invokerNode }) { return new OverlayController({ @@ -11,4 +12,27 @@ export class LionDialog extends LionOverlay { ...this.config, // lit-property set by user for overrides }); } + + _setupOpenCloseListeners() { + this.__close = () => { + this.opened = false; + }; + this.__toggle = () => { + this.opened = !this.opened; + }; + this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); + this._overlayCtrl.contentNode.addEventListener('close', this.__close); + } + + _teardownOpenCloseListeners() { + this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); + this._overlayCtrl.contentNode.removeEventListener('close', this.__close); + } + + render() { + return html` + + + `; + } } diff --git a/packages/input-datepicker/src/LionInputDatepicker.js b/packages/input-datepicker/src/LionInputDatepicker.js index aa62fea9b..9b5c04d2e 100644 --- a/packages/input-datepicker/src/LionInputDatepicker.js +++ b/packages/input-datepicker/src/LionInputDatepicker.js @@ -264,8 +264,6 @@ export class LionInputDatepicker extends OverlayMixin(LionInputDate) { ...withModalDialogConfig(), contentNode, invokerNode, - elementToFocusAfterHide: invokerNode, - hidesOnOutsideClick: true, }); return ctrl; } diff --git a/packages/overlays/index.js b/packages/overlays/index.js index 04d690a13..7719aab23 100644 --- a/packages/overlays/index.js +++ b/packages/overlays/index.js @@ -7,5 +7,3 @@ export { OverlayMixin } from './src/OverlayMixin.js'; export { withBottomSheetConfig } from './src/configurations/withBottomSheetConfig.js'; export { withModalDialogConfig } from './src/configurations/withModalDialogConfig.js'; export { withDropdownConfig } from './src/configurations/withDropdownConfig.js'; - -export { LionOverlay } from './src/LionOverlay.js'; diff --git a/packages/overlays/lion-overlay.js b/packages/overlays/lion-overlay.js deleted file mode 100644 index 45327afaa..000000000 --- a/packages/overlays/lion-overlay.js +++ /dev/null @@ -1,3 +0,0 @@ -import { LionOverlay } from './src/LionOverlay.js'; - -customElements.define('lion-overlay', LionOverlay); diff --git a/packages/overlays/src/LionOverlay.js b/packages/overlays/src/LionOverlay.js deleted file mode 100644 index 7eb3cb294..000000000 --- a/packages/overlays/src/LionOverlay.js +++ /dev/null @@ -1,95 +0,0 @@ -import { LitElement, html } from '@lion/core'; -import { OverlayMixin } from './OverlayMixin.js'; -import { OverlayController } from './OverlayController.js'; - -export class LionOverlay extends OverlayMixin(LitElement) { - static get properties() { - return { - config: { - type: Object, - }, - }; - } - - constructor() { - super(); - this.config = {}; - } - - get config() { - return this._config; - } - - set config(value) { - if (this._overlayCtrl) { - this._overlayCtrl.updateConfig(value); - } - this._config = value; - } - - render() { - return html` - - - `; - } - - // FIXME: This should be refactored to Array.from(this.children).find(child => child.slot === 'content') - // When this issue is fixed https://github.com/ing-bank/lion/issues/382 - /** - * @override - * Overrides OverlayMixin - * Important to use this override, so that later, contentTemplates can also be accepted - */ - get _overlayContentNode() { - const contentNode = this.querySelector('[slot=content]'); - if (contentNode) { - this._cachedOverlayContentNode = contentNode; - } - return contentNode || this._cachedOverlayContentNode; - } - - /** - * @override - * Overrides OverlayMixin - */ - get _overlayInvokerNode() { - return Array.from(this.children).find(child => child.slot === 'invoker'); - } - - // eslint-disable-next-line class-methods-use-this - _defineOverlay({ contentNode, invokerNode }) { - return new OverlayController({ - placementMode: 'global', // have to set a default - contentNode, - invokerNode, - ...this.config, - }); - } - - _setupShowHideListeners() { - this.__close = () => { - this.opened = false; - }; - this.__toggle = () => { - this.opened = !this.opened; - }; - this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); - this._overlayCtrl.contentNode.addEventListener('close', this.__close); - } - - _teardownShowHideListeners() { - this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); - this._overlayCtrl.contentNode.removeEventListener('close', this.__close); - } - - connectedCallback() { - super.connectedCallback(); - this._setupShowHideListeners(); - } - - disconnectedCallback() { - super.disconnectedCallback(); - this._teardownShowHideListeners(); - } -} diff --git a/packages/overlays/src/OverlayController.js b/packages/overlays/src/OverlayController.js index 2d88e154d..2865fcbe5 100644 --- a/packages/overlays/src/OverlayController.js +++ b/packages/overlays/src/OverlayController.js @@ -103,18 +103,6 @@ export class OverlayController { * @param {OverlayConfig} cfgToAdd */ updateConfig(cfgToAdd) { - // only updating the viewportConfig - if (Object.keys(cfgToAdd).length === 1 && Object.keys(cfgToAdd)[0] === 'viewportConfig') { - this.updateViewportConfig(cfgToAdd.viewportConfig); - return; - } - - // only updating the popperConfig - if (Object.keys(cfgToAdd).length === 1 && Object.keys(cfgToAdd)[0] === 'popperConfig') { - this.updatePopperConfig(cfgToAdd.popperConfig); - return; - } - // Teardown all previous configs this._handleFeatures({ phase: 'teardown' }); @@ -164,7 +152,7 @@ export class OverlayController { // TODO: Instead, prefetch it or use a preloader-manager to load it during idle time this.constructor.popperModule = preloadPopper(); } - this.__mergePopperConfigs(this.popperConfig || {}); + this.__mergePopperConfigs(this.config.popperConfig || {}); } this._handleFeatures({ phase: 'init' }); } @@ -312,7 +300,6 @@ export class OverlayController { // Otherwise we assume the 'outside world' has, purposefully, taken over // if (this._contentNodeWrapper.activeElement) { if (this.elementToFocusAfterHide) { - console.log(this.elementToFocusAfterHide); this.elementToFocusAfterHide.focus(); } // } @@ -556,8 +543,7 @@ export class OverlayController { } } - // Popper does not export a nice method to update an existing instance with a new config. Therefore we recreate the instance. - // TODO: Send a merge request to Popper to abstract their logic in the constructor to an exposed method which takes in the user config. + // TODO: Remove when no longer required by OverlayMixin (after updateConfig works properly while opened) async updatePopperConfig(config = {}) { this.__mergePopperConfigs(config); if (this.isShown) { @@ -566,12 +552,6 @@ export class OverlayController { } } - updateViewportConfig(newConfig) { - this._handlePosition({ phase: 'hide' }); - this.viewportConfig = newConfig; - this._handlePosition({ phase: 'show' }); - } - teardown() { this._handleFeatures({ phase: 'teardown' }); } @@ -607,14 +587,19 @@ export class OverlayController { }, }; - // Deep merging default config, previously configured user config, new user config - this.popperConfig = { + /** + * Deep merging: + * - default config + * - previously configured user config + * - new user added config + */ + this.config.popperConfig = { ...defaultConfig, - ...(this.popperConfig || {}), + ...(this.config.popperConfig || {}), ...(config || {}), modifiers: { ...defaultConfig.modifiers, - ...((this.popperConfig && this.popperConfig.modifiers) || {}), + ...((this.config.popperConfig && this.config.popperConfig.modifiers) || {}), ...((config && config.modifiers) || {}), }, }; @@ -627,7 +612,7 @@ export class OverlayController { } const { default: Popper } = await this.constructor.popperModule; this._popper = new Popper(this._referenceNode, this._contentNodeWrapper, { - ...this.popperConfig, + ...this.config.popperConfig, }); } diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index 25af76523..749a2184f 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -15,10 +15,17 @@ export const OverlayMixin = dedupeMixin( type: Boolean, reflect: true, }, - popperConfig: Object, + config: { + type: Object, + }, }; } + constructor() { + super(); + this.config = {}; + } + get opened() { return this._overlayCtrl.isShown; } @@ -30,44 +37,63 @@ export const OverlayMixin = dedupeMixin( } } - __syncOpened() { - if (this._opened) { - this._overlayCtrl.show(); - } else { - this._overlayCtrl.hide(); - } + get config() { + return this._config; } - get popperConfig() { - return this._popperConfig; - } - - set popperConfig(config) { - this._popperConfig = { - ...this._popperConfig, - ...config, - }; - this.__syncPopper(); - } - - __syncPopper() { + set config(value) { if (this._overlayCtrl) { - this._overlayCtrl.updatePopperConfig(this._popperConfig); + this._overlayCtrl.updateConfig(value); } + this._config = value; } + /** + * @overridable method `_overlayTemplate` + * Be aware that the overlay will be placed in a different shadow root. + * Therefore, style encapsulation should be provided by the contents of + * _overlayTemplate + * @return {TemplateResult} + */ + + /** + * @overridable method `_defineOverlay` + * @desc returns an instance of a (dynamic) overlay controller + * @returns {OverlayController} + */ + // eslint-disable-next-line + _defineOverlay({ contentNode, invokerNode }) {} + + /** + * @overridable + * @desc use this method to setup your open and close event listeners + * For example, set a click event listener on _overlayInvokerNode to set opened to true + */ + // eslint-disable-next-line class-methods-use-this + _setupOpenCloseListeners() {} + + /** + * @overridable + * @desc use this method to tear down your event listeners + */ + // eslint-disable-next-line class-methods-use-this + _teardownOpenCloseListeners() {} + connectedCallback() { if (super.connectedCallback) { super.connectedCallback(); } this._createOverlay(); + this._setupOpenCloseListeners(); this.__syncOpened(); this.__syncPopper(); } firstUpdated(c) { super.firstUpdated(c); - this._createOutletForLocalOverlay(); + if (this._overlayCtrl.config.placementMode === 'local') { + this._createOutletForLocalOverlay(); + } } updated(c) { @@ -77,6 +103,27 @@ export const OverlayMixin = dedupeMixin( } } + disconnectedCallback() { + if (super.disconnectedCallback) { + super.disconnectedCallback(); + } + this._teardownOpenCloseListeners(); + } + + get _overlayInvokerNode() { + return Array.from(this.children).find(child => child.slot === 'invoker'); + } + + // FIXME: This should be refactored to Array.from(this.children).find(child => child.slot === 'content') + // When this issue is fixed https://github.com/ing-bank/lion/issues/382 + get _overlayContentNode() { + const contentNode = this.querySelector('[slot=content]'); + if (contentNode) { + this._cachedOverlayContentNode = contentNode; + } + return contentNode || this._cachedOverlayContentNode; + } + _renderOverlayContent() { render(this._overlayTemplate(), this.__contentParent, { scopeName: this.localName, @@ -84,18 +131,6 @@ export const OverlayMixin = dedupeMixin( }); } - /** - * @desc Two options for a Subclasser: - * - 1: Define a template in `._overlayTemplate`. In this case the overlay content is - * predefined and thus belongs to the web component. Examples: datepicker. - * - 2: Define a getter `_overlayContentNode` that returns a node reference to a (content - * projected) node. Used when Application Developer is in charge of the content. Examples: - * popover, dialog, bottom sheet, dropdown, tooltip, select, combobox etc. - */ - get __managesOverlayViaTemplate() { - return Boolean(this._overlayTemplate); - } - _createOverlay() { let contentNode; if (this.__managesOverlayViaTemplate) { @@ -128,19 +163,30 @@ export const OverlayMixin = dedupeMixin( } /** - * @overridable method `_overlayTemplate` - * Be aware that the overlay will be placed in a different shadow root. - * Therefore, style encapsulation should be provided by the contents of - * _overlayTemplate - * @return {TemplateResult} + * @desc Two options for a Subclasser: + * - 1: Define a template in `._overlayTemplate`. In this case the overlay content is + * predefined and thus belongs to the web component. Examples: datepicker. + * - 2: Define a getter `_overlayContentNode` that returns a node reference to a (content + * projected) node. Used when Application Developer is in charge of the content. Examples: + * popover, dialog, bottom sheet, dropdown, tooltip, select, combobox etc. */ + get __managesOverlayViaTemplate() { + return Boolean(this._overlayTemplate); + } - /** - * @overridable method `_defineOverlay` - * @desc returns an instance of a (dynamic) overlay controller - * @returns {OverlayController} - */ - // eslint-disable-next-line - _defineOverlay({ contentNode, invokerNode }) {} + __syncOpened() { + if (this._opened) { + this._overlayCtrl.show(); + } else { + this._overlayCtrl.hide(); + } + } + + __syncPopper() { + if (this._overlayCtrl) { + // TODO: Use updateConfig directly.. but first check if this sync is even still needed! Maybe we can remove it. + this._overlayCtrl.updatePopperConfig(this.config.popperConfig); + } + } }, ); diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index 9404080b6..32ffdacf7 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -1,9 +1,14 @@ import { storiesOf, html, withKnobs } from '@open-wc/demoing-storybook'; -import { css, render } from '@lion/core'; +import { css, render, LitElement } from '@lion/core'; import '@lion/icon/lion-icon.js'; import '@lion/button/lion-button.js'; -import { withBottomSheetConfig, withDropdownConfig, withModalDialogConfig } from '../index.js'; -import '../lion-overlay.js'; +import { + withBottomSheetConfig, + withDropdownConfig, + withModalDialogConfig, + OverlayMixin, + OverlayController, +} from '../index.js'; function renderOffline(litHtmlTemplate) { const offlineRenderContainer = document.createElement('div'); @@ -51,7 +56,7 @@ const overlayDemoStyle = css` margin-top: 68px; } - lion-overlay { + lion-demo-overlay { padding: 10px; } @@ -88,7 +93,45 @@ const overlayDemoStyle = css` } `; -storiesOf('Overlay System | Overlay Component', module) +customElements.define( + 'lion-demo-overlay', + class extends OverlayMixin(LitElement) { + // eslint-disable-next-line class-methods-use-this + _defineOverlay({ contentNode, invokerNode }) { + return new OverlayController({ + placementMode: 'global', // have to set a default + contentNode, + invokerNode, + ...this.config, + }); + } + + _setupOpenCloseListeners() { + this.__close = () => { + this.opened = false; + }; + this.__toggle = () => { + this.opened = !this.opened; + }; + this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); + this._overlayCtrl.contentNode.addEventListener('close', this.__close); + } + + _teardownOpenCloseListeners() { + this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); + this._overlayCtrl.contentNode.removeEventListener('close', this.__close); + } + + render() { + return html` + + + `; + } + }, +); + +storiesOf('Overlay System | Overlay as a WC', module) .addDecorator(withKnobs) .add( 'Default', @@ -97,8 +140,9 @@ storiesOf('Overlay System | Overlay Component', module) ${overlayDemoStyle}

- Important note: Your slot="content" gets moved to global overlay container. - After initialization it is no longer a child of lion-overlay + Important note: For placementMode: 'global', your + slot="content" gets moved to global overlay container. After initialization it + is no longer a child of lion-demo-overlay

To close your overlay from some action performed inside the content slot, fire a @@ -111,7 +155,7 @@ storiesOf('Overlay System | Overlay Component', module)

The demo below demonstrates this

- + Overlay
Hello! You can close this notification here: @@ -121,13 +165,13 @@ storiesOf('Overlay System | Overlay Component', module) >⨯
-
+
`, ) .add('Global placement configuration', () => { const overlay = placement => html` - Overlay ${placement} @@ -139,7 +183,7 @@ storiesOf('Overlay System | Overlay Component', module) >⨯
- + `; return html` @@ -159,7 +203,7 @@ storiesOf('Overlay System | Overlay Component', module) ${overlayDemoStyle}
- Overlay @@ -171,7 +215,7 @@ storiesOf('Overlay System | Overlay Component', module) >⨯
- +
`, ) @@ -186,13 +230,13 @@ storiesOf('Overlay System | Overlay Component', module) Popper.js Docs
- UK - +
`, ) .add('Switch overlays configuration', () => { const overlay = renderOffline(html` - + Overlay
Hello! You can close this notification here: @@ -235,7 +279,7 @@ storiesOf('Overlay System | Overlay Component', module) >⨯
-
+ `); return html` @@ -278,7 +322,7 @@ storiesOf('Overlay System | Overlay Component', module) }) .add('On hover', () => { const popup = renderOffline(html` - United Kingdom
- + `); return html` @@ -315,7 +359,7 @@ storiesOf('Overlay System | Overlay Component', module) }) .add('On an input', () => { const popup = renderOffline(html` - - + `); return html` @@ -353,7 +397,7 @@ storiesOf('Overlay System | Overlay Component', module) /* .add('Toggle placement with knobs', () => { const overlay = (placementMode = 'global') => html` - ⨯ - + `; return html` diff --git a/packages/overlays/test/OverlayController.test.js b/packages/overlays/test/OverlayController.test.js index 3cdd02c3f..ec4bb8526 100644 --- a/packages/overlays/test/OverlayController.test.js +++ b/packages/overlays/test/OverlayController.test.js @@ -881,7 +881,8 @@ describe('OverlayController', () => { expect(ctrl.contentNode).to.equal(contentNode); }); - it('allows for updating viewport config placement only, while keeping the content shown', async () => { + // TODO: Currently not working, enable again when we fix updateConfig + it.skip('allows for updating viewport config placement only, while keeping the content shown', async () => { const contentNode = fixtureSync(html`
my content
`); diff --git a/packages/overlays/test/lion-overlay.test.js b/packages/overlays/test/lion-overlay.test.js deleted file mode 100644 index 2d42c7663..000000000 --- a/packages/overlays/test/lion-overlay.test.js +++ /dev/null @@ -1,79 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../lion-overlay.js'; - -describe('lion-overlay', () => { - describe('Basic', () => { - it('should not be shown by default', async () => { - const el = await fixture(html` - -
Hey there
- Invoker button -
- `); - expect(el._overlayCtrl.isShown).to.be.false; - }); - - it('should show content on invoker click', async () => { - const el = await fixture(html` - -
- Hey there -
- Invoker button -
- `); - const invoker = el.querySelector('[slot="invoker"]'); - invoker.click(); - await el.updateComplete; - - expect(el._overlayCtrl.isShown).to.be.true; - }); - - it('should hide content on close event', async () => { - const el = await fixture(html` - -
- Hey there - -
- Invoker button -
- `); - const invoker = el.querySelector('[slot="invoker"]'); - invoker.click(); - await el.updateComplete; - - expect(el._overlayCtrl.isShown).to.be.true; - - const closeBtn = el._overlayCtrl.contentNode.querySelector('button'); - closeBtn.click(); - await el.updateComplete; - - expect(el._overlayCtrl.isShown).to.be.false; - }); - - it('should respond to initially and dynamically setting the config', async () => { - const el = await fixture(html` - -
Hey there
- Invoker button -
- `); - await el._overlayCtrl.show(); - expect(el._overlayCtrl.trapsKeyboardFocus).to.be.false; - - el.config = { viewportConfig: { placement: 'left' } }; - expect(el._overlayCtrl.viewportConfig.placement).to.equal('left'); - expect( - el._overlayCtrl._contentNodeWrapper.classList.contains( - 'global-overlays__overlay-container--left', - ), - ); - }); - }); -}); diff --git a/packages/popup/README.md b/packages/popup/README.md deleted file mode 100644 index 873dadf49..000000000 --- a/packages/popup/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Popup - -[//]: # 'AUTO INSERT HEADER PREPUBLISH' - -`lion-popup` is a component used for basic popups on click. -Its purpose is to show content appearing when the user clicks an invoker element with the cursor or with the keyboard. - -## Features - -- Show content when clicking the invoker -- Use the position property to position the content popup relative to the invoker - -## How to use - -### Installation - -```sh -npm i --save @lion/popup -``` - -```js -import '@lion/popup/lion-popup.js'; -``` - -### Example - -```html - -
This is a popup
- - Popup on link - - -``` diff --git a/packages/popup/index.js b/packages/popup/index.js deleted file mode 100644 index 6b671f807..000000000 --- a/packages/popup/index.js +++ /dev/null @@ -1 +0,0 @@ -export { LionPopup } from './src/LionPopup.js'; diff --git a/packages/popup/lion-popup.js b/packages/popup/lion-popup.js deleted file mode 100644 index e5dbebcdf..000000000 --- a/packages/popup/lion-popup.js +++ /dev/null @@ -1,3 +0,0 @@ -import { LionPopup } from './src/LionPopup.js'; - -customElements.define('lion-popup', LionPopup); diff --git a/packages/popup/src/LionPopup.js b/packages/popup/src/LionPopup.js deleted file mode 100644 index 0364763bf..000000000 --- a/packages/popup/src/LionPopup.js +++ /dev/null @@ -1,16 +0,0 @@ -import { OverlayController, LionOverlay } from '@lion/overlays'; - -export class LionPopup extends LionOverlay { - // eslint-disable-next-line class-methods-use-this - _defineOverlay() { - return new OverlayController({ - placementMode: 'local', - hidesOnOutsideClick: true, - hidesOnEsc: true, - contentNode: this._overlayContentNode, - invokerNode: this._overlayInvokerNode, - handlesAccessibility: true, - ...this.config, - }); - } -} diff --git a/packages/popup/stories/index.stories.js b/packages/popup/stories/index.stories.js deleted file mode 100644 index d2b789f55..000000000 --- a/packages/popup/stories/index.stories.js +++ /dev/null @@ -1,131 +0,0 @@ -import { storiesOf, html, withKnobs, object, text } from '@open-wc/demoing-storybook'; -import { css } from '@lion/core'; - -import '@lion/icon/lion-icon.js'; -import '@lion/button/lion-button.js'; -import '../lion-popup.js'; - -const popupDemoStyle = css` - .demo-box { - width: 200px; - background-color: white; - border-radius: 2px; - border: 1px solid grey; - margin: 250px 0 0 250px; - padding: 8px; - } - - .demo-box_placements { - display: flex; - flex-direction: column; - width: 173px; - margin: 0 auto; - margin-top: 68px; - } - - lion-popup { - padding: 10px; - } - - .demo-box__column { - display: flex; - flex-direction: column; - } - - .popup { - display: block; - position: absolute; - font-size: 16px; - color: white; - background-color: black; - border-radius: 4px; - padding: 8px; - } - - @media (max-width: 480px) { - .popup { - display: none; - } - } -`; - -storiesOf('Overlays Specific WC|Popup', module) - .addDecorator(withKnobs) - .add( - 'Button popup', - () => html` - -
- - Popup - - -
- `, - ) - .add( - 'placements', - () => html` - -
- - Top - - - - Right - - - - Bottom - - - - Left - - -
- `, - ) - .add( - 'Override popper configuration', - () => html` - -

Use the Storybook Knobs to dynamically change the popper configuration!

-
- - ${text('Invoker text', 'Click me!')} - - -
- `, - ); diff --git a/packages/popup/test/lion-popup.test.js b/packages/popup/test/lion-popup.test.js deleted file mode 100644 index 00db53e14..000000000 --- a/packages/popup/test/lion-popup.test.js +++ /dev/null @@ -1,63 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../lion-popup.js'; - -describe('lion-popup', () => { - describe('Basic', () => { - it('should not be shown by default', async () => { - const el = await fixture(html` - - - Popup button - - `); - expect(el._overlayCtrl.isShown).to.be.false; - }); - - it('should toggle to show content on click', async () => { - const el = await fixture(html` - - - Popup button - - `); - const invoker = Array.from(el.children).find(child => child.slot === 'invoker'); - invoker.click(); - await el.updateComplete; - - expect(el._overlayCtrl.isShown).to.be.true; - invoker.click(); - await el.updateComplete; - expect(el._overlayCtrl.isShown).to.be.false; - }); - - it('should support popup containing html when specified in popup content body', async () => { - const el = await fixture(html` - -
This is Popup using overlay
- Popup button -
- `); - const invoker = Array.from(el.children).find(child => child.slot === 'invoker'); - const event = new Event('click'); - invoker.dispatchEvent(event); - await el.updateComplete; - expect(el.querySelector('strong')).to.not.be.undefined; - }); - - it('should respond to dynamically changing the popperConfig', async () => { - const el = await fixture(html` - - - Popup button - - `); - await el._overlayCtrl.show(); - expect(el._overlayCtrl._popper.options.placement).to.equal('top'); - - el.popperConfig = { placement: 'left' }; - await el._overlayCtrl.show(); - expect(el._overlayCtrl._popper.options.placement).to.equal('left'); - }); - }); -}); diff --git a/packages/tooltip/src/LionTooltip.js b/packages/tooltip/src/LionTooltip.js index d22bc1a19..6eeb8f36b 100644 --- a/packages/tooltip/src/LionTooltip.js +++ b/packages/tooltip/src/LionTooltip.js @@ -1,19 +1,24 @@ -import { LionPopup } from '@lion/popup'; +import { OverlayMixin, OverlayController } from '@lion/overlays'; +import { LitElement, html } from '@lion/core'; -export class LionTooltip extends LionPopup { +export class LionTooltip extends OverlayMixin(LitElement) { constructor() { super(); this.mouseActive = false; this.keyActive = false; - - // Trigger config setter to ensure it updates in OverlayController - this.config = { - ...this.config, - elementToFocusAfterHide: null, - }; } - _setupShowHideListeners() { + _defineOverlay({ contentNode, invokerNode }) { + return new OverlayController({ + placementMode: 'local', // have to set a default + elementToFocusAfterHide: null, + contentNode, + invokerNode, + ...this.config, + }); + } + + _setupOpenCloseListeners() { this.__resetActive = () => { this.mouseActive = false; this.keyActive = false; @@ -52,7 +57,7 @@ export class LionTooltip extends LionPopup { this._overlayInvokerNode.addEventListener('focusout', this.__hideKey); } - _teardownShowHideListeners() { + _teardownOpenCloseListeners() { this._overlayCtrl.removeEventListener('hide', this.__resetActive); this.removeEventListener('mouseenter', this.__showMouse); this.removeEventListener('mouseleave', this._hideMouse); @@ -64,4 +69,11 @@ export class LionTooltip extends LionPopup { super.connectedCallback(); this._overlayContentNode.setAttribute('role', 'tooltip'); } + + render() { + return html` + + + `; + } } diff --git a/packages/tooltip/stories/index.stories.js b/packages/tooltip/stories/index.stories.js index a2d04e7ce..728809d64 100644 --- a/packages/tooltip/stories/index.stories.js +++ b/packages/tooltip/stories/index.stories.js @@ -58,7 +58,7 @@ storiesOf('Overlays Specific WC|Tooltip', module) ${tooltipDemoStyle}
- + Tooltip
Hello there!
@@ -72,19 +72,19 @@ storiesOf('Overlays Specific WC|Tooltip', module) ${tooltipDemoStyle}
- + Top
Its top placement
- + Right
Its right placement
- + Bottom
Its bottom placement
- + Left
Its left placement
@@ -100,28 +100,30 @@ storiesOf('Overlays Specific WC|Tooltip', module)

Use the Storybook Knobs to dynamically change the popper configuration!

${text('Invoker text', 'Hover me!')}
${text('Content text', 'Hello, World!')}
diff --git a/stories/index.stories.js b/stories/index.stories.js index 2249c4ad9..632b5a3f1 100755 --- a/stories/index.stories.js +++ b/stories/index.stories.js @@ -29,7 +29,6 @@ import '../packages/calendar/stories/index.stories.js'; import '../packages/overlays/stories/index.stories.js'; import '../packages/overlays/stories/overlay-features.stories.js'; import '../packages/dialog/stories/index.stories.js'; -import '../packages/popup/stories/index.stories.js'; import '../packages/tooltip/stories/index.stories.js'; import '../packages/select-rich/stories/index.stories.js'; From 45f557183d7bef95ea9685d751e90ba12a4eb2d8 Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Tue, 26 Nov 2019 14:54:33 +0100 Subject: [PATCH 03/12] feat(overlays): improve API for overriding controller config in mixin --- README.md | 10 +-- packages/calendar/test/lion-calendar.test.js | 10 ++- packages/dialog/README.md | 2 +- packages/dialog/src/LionDialog.js | 19 ++--- packages/dialog/stories/index.stories.js | 6 +- packages/dialog/test/lion-dialog.test.js | 4 +- packages/fieldset/test/lion-fieldset.test.js | 85 +++++++++++++++---- .../src/LionInputDatepicker.js | 15 ++-- packages/overlays/docs/migration.md | 2 +- packages/overlays/src/OverlayController.js | 2 +- packages/overlays/src/OverlayMixin.js | 44 ++++++++-- packages/overlays/stories/index.stories.js | 31 ++++--- packages/select-rich/src/LionSelectRich.js | 10 +-- packages/tooltip/README.md | 4 +- packages/tooltip/package.json | 3 +- packages/tooltip/src/LionTooltip.js | 13 ++- 16 files changed, 173 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index 0fe06bbe1..378d78da0 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ The accessibility column indicates whether the functionality is accessible in it | [icon](./packages/icon) | [![icon](https://img.shields.io/npm/v/@lion/icon.svg)](https://www.npmjs.com/package/@lion/icon) | Display our svg icons | [#173][i173], [#172][i172] | | [steps](./packages/steps) | [![steps](https://img.shields.io/npm/v/@lion/steps.svg)](https://www.npmjs.com/package/@lion/steps) | Multi Step System | n/a | | [tabs](./packages/tabs) | [![tBS](https://img.shields.io/npm/v/@lion/tabs.svg)](https://www.npmjs.com/package/@lion/tabs) | Move between a small number of equally important views | n/a | -| **-- Forms --** | | | +| **-- Forms --** | | | | | [form](./packages/form) | [![form](https://img.shields.io/npm/v/@lion/form.svg)](https://www.npmjs.com/package/@lion/form) | Wrapper for multiple form elements | ✔️ | | [field](./packages/field) | [![field](https://img.shields.io/npm/v/@lion/field.svg)](https://www.npmjs.com/package/@lion/field) | Base Class for all inputs | [#190][i190] | | [fieldset](./packages/fieldset) | [![fieldset](https://img.shields.io/npm/v/@lion/fieldset.svg)](https://www.npmjs.com/package/@lion/fieldset) | Group for form inputs | ✔️ | @@ -48,7 +48,7 @@ The accessibility column indicates whether the functionality is accessible in it | [checkbox](./packages/checkbox) | [![checkbox](https://img.shields.io/npm/v/@lion/checkbox.svg)](https://www.npmjs.com/package/@lion/checkbox) | Checkbox form element | ✔️ | | [checkbox-group](./packages/checkbox-group) | [![checkbox-group](https://img.shields.io/npm/v/@lion/checkbox-group.svg)](https://www.npmjs.com/package/@lion/checkbox-group) | Group of checkboxes | ✔️ | | [input](./packages/input) | [![input](https://img.shields.io/npm/v/@lion/input.svg)](https://www.npmjs.com/package/@lion/input) | Input element for strings | ✔️ | -| [input-amount](./packages/input-amount) | [![input-amount](https://img.shields.io/npm/v/@lion/input-amount.svg)](https://www.npmjs.com/package/@lion/input-amount) | Input element for amounts | [#166][i166] | ✔️ | +| [input-amount](./packages/input-amount) | [![input-amount](https://img.shields.io/npm/v/@lion/input-amount.svg)](https://www.npmjs.com/package/@lion/input-amount) | Input element for amounts | [#166][i166] | | [input-date](./packages/input-date) | [![input-date](https://img.shields.io/npm/v/@lion/input-date.svg)](https://www.npmjs.com/package/@lion/input-date) | Input element for dates | ✔️ | | [input-datepicker](./packages/input-datepicker) | [![input-datepicker](https://img.shields.io/npm/v/@lion/input-datepicker.svg)](https://www.npmjs.com/package/@lion/input-datepicker) | Input element for dates with a datepicker | ✔️ | | [input-email](./packages/input-email) | [![input-email](https://img.shields.io/npm/v/@lion/input-email.svg)](https://www.npmjs.com/package/@lion/input-email) | Input element for e-mails | [#169][i169] | @@ -58,9 +58,9 @@ The accessibility column indicates whether the functionality is accessible in it | [select](./packages/select) | [![select](https://img.shields.io/npm/v/@lion/select.svg)](https://www.npmjs.com/package/@lion/select) | Simple native dropdown element | ✔️ | | [textarea](./packages/textarea) | [![textarea](https://img.shields.io/npm/v/@lion/textarea.svg)](https://www.npmjs.com/package/@lion/textarea) | Multiline text input | [#165][i165] | | **-- Overlays --** | | | | -| [overlays](./packages/overlays) | [![overlays](https://img.shields.io/npm/v/@lion/overlays.svg)](https://www.npmjs.com/package/@lion/overlays) | Overlays System using lit-html for rendering | ✔️ | -| [popup](./packages/popup) | [![popup](https://img.shields.io/npm/v/@lion/popup.svg)](https://www.npmjs.com/package/@lion/popup) | Popup element | [#175][i175], [#174][i174] | -| [tooltip](./packages/tooltip) | [![tooltip](https://img.shields.io/npm/v/@lion/tooltip.svg)](https://www.npmjs.com/package/@lion/tooltip) | Popup element | [#178][i178], [#177][i177], [#176][i176], [#175][i175], [#174][i174] | +| [overlays](./packages/overlays) | [![overlays](https://img.shields.io/npm/v/@lion/overlays.svg)](https://www.npmjs.com/package/@lion/overlays) | Overlay System | ✔️ | +| [dialog](./packages/dialog) | [![dialog](https://img.shields.io/npm/v/@lion/dialog.svg)](https://www.npmjs.com/package/@lion/dialog) | Dialog element | ✔️ | +| [tooltip](./packages/tooltip) | [![tooltip](https://img.shields.io/npm/v/@lion/tooltip.svg)](https://www.npmjs.com/package/@lion/tooltip) | Tooltip element | [#178][i178], [#177][i177], [#176][i176], [#175][i175], [#174][i174] | ## How to use diff --git a/packages/calendar/test/lion-calendar.test.js b/packages/calendar/test/lion-calendar.test.js index 8ea9f16a7..dfd711107 100644 --- a/packages/calendar/test/lion-calendar.test.js +++ b/packages/calendar/test/lion-calendar.test.js @@ -108,10 +108,16 @@ describe('', () => { `), ); expect( - elObj.checkForAllDayObjs(o => o.buttonEl.getAttribute('tabindex') === '0', n => n === 5), + elObj.checkForAllDayObjs( + o => o.buttonEl.getAttribute('tabindex') === '0', + n => n === 5, + ), ).to.be.true; expect( - elObj.checkForAllDayObjs(o => o.buttonEl.getAttribute('tabindex') === '-1', n => n !== 5), + elObj.checkForAllDayObjs( + o => o.buttonEl.getAttribute('tabindex') === '-1', + n => n !== 5, + ), ).to.be.true; }); diff --git a/packages/dialog/README.md b/packages/dialog/README.md index 384ce2efc..aa2abb950 100644 --- a/packages/dialog/README.md +++ b/packages/dialog/README.md @@ -34,7 +34,7 @@ html` }}> This is a dialog
@@ -98,7 +98,7 @@ storiesOf('Overlays Specific WC | Dialog', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => e.target.dispatchEvent(new Event('dialog-close', { bubbles: true }))} >⨯
@@ -123,7 +123,7 @@ storiesOf('Overlays Specific WC | Dialog', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => e.target.dispatchEvent(new Event('dialog-close', { bubbles: true }))} >⨯
diff --git a/packages/dialog/test/lion-dialog.test.js b/packages/dialog/test/lion-dialog.test.js index c3717f79a..155fef199 100644 --- a/packages/dialog/test/lion-dialog.test.js +++ b/packages/dialog/test/lion-dialog.test.js @@ -35,7 +35,9 @@ describe('lion-dialog', () => {
Hey there -
diff --git a/packages/fieldset/test/lion-fieldset.test.js b/packages/fieldset/test/lion-fieldset.test.js index fa71b2b0d..1c6b82668 100644 --- a/packages/fieldset/test/lion-fieldset.test.js +++ b/packages/fieldset/test/lion-fieldset.test.js @@ -177,16 +177,28 @@ describe('', () => { expect(el.modelValue).to.deep.equal({ lastName: 'Bar', newfieldset: { - 'hobbies[]': [{ checked: true, value: 'chess' }, { checked: false, value: 'football' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: true, value: 'chess' }, + { checked: false, value: 'football' }, + ], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }, }); el.modelValue = { lastName: 2, newfieldset: { - 'hobbies[]': [{ checked: true, value: 'chess' }, { checked: false, value: 'baseball' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: true, value: 'chess' }, + { checked: false, value: 'baseball' }, + ], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }, }; @@ -546,7 +558,10 @@ describe('', () => { expect(fieldset.formElements['hobbies[]'][0].serializedValue).to.equal('Bar-serialized'); expect(fieldset.serializeGroup()).to.deep.equal({ 'hobbies[]': ['Bar-serialized', { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }); }); @@ -562,15 +577,27 @@ describe('', () => { fieldset.formElements.color.modelValue = { checked: false, value: 'blue' }; expect(fieldset.serializeGroup()).to.deep.equal({ - 'hobbies[]': [{ checked: true, value: 'football' }, { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: true, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: true, value: 'football' }, + { checked: false, value: 'rugby' }, + ], + 'gender[]': [ + { checked: true, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }); fieldset.formElements.color.disabled = true; expect(fieldset.serializeGroup()).to.deep.equal({ - 'hobbies[]': [{ checked: true, value: 'football' }, { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: true, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: true, value: 'football' }, + { checked: false, value: 'rugby' }, + ], + 'gender[]': [ + { checked: true, value: 'male' }, + { checked: false, value: 'female' }, + ], }); }); @@ -594,8 +621,14 @@ describe('', () => { expect(fieldset.serializeGroup()).to.deep.equal({ comment: 'Foo', newfieldset: { - 'hobbies[]': [{ checked: false, value: 'chess' }, { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: false, value: 'chess' }, + { checked: false, value: 'rugby' }, + ], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }, }); @@ -622,8 +655,14 @@ describe('', () => { expect(fieldset.serializeGroup()).to.deep.equal({ comment: 'Foo', newfieldset: { - 'hobbies[]': [{ checked: false, value: 'chess' }, { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: false, value: 'chess' }, + { checked: false, value: 'rugby' }, + ], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], }, }); @@ -631,8 +670,14 @@ describe('', () => { expect(fieldset.serializeGroup()).to.deep.equal({ comment: 'Foo', newfieldset: { - 'hobbies[]': [{ checked: false, value: 'chess' }, { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: false, value: 'chess' }, + { checked: false, value: 'rugby' }, + ], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }, }); @@ -647,8 +692,14 @@ describe('', () => { fieldset.formElements['gender[]'][1].modelValue = { checked: false, value: 'female' }; fieldset.formElements.color.modelValue = { checked: false, value: 'blue' }; expect(fieldset.serializeGroup()).to.deep.equal({ - 'hobbies[]': [{ checked: false, value: 'chess' }, { checked: false, value: 'rugby' }], - 'gender[]': [{ checked: false, value: 'male' }, { checked: false, value: 'female' }], + 'hobbies[]': [ + { checked: false, value: 'chess' }, + { checked: false, value: 'rugby' }, + ], + 'gender[]': [ + { checked: false, value: 'male' }, + { checked: false, value: 'female' }, + ], color: { checked: false, value: 'blue' }, }); }); diff --git a/packages/input-datepicker/src/LionInputDatepicker.js b/packages/input-datepicker/src/LionInputDatepicker.js index 9b5c04d2e..2d34c8475 100644 --- a/packages/input-datepicker/src/LionInputDatepicker.js +++ b/packages/input-datepicker/src/LionInputDatepicker.js @@ -1,6 +1,6 @@ import { html, ifDefined, render } from '@lion/core'; import { LionInputDate } from '@lion/input-date'; -import { OverlayController, withModalDialogConfig, OverlayMixin } from '@lion/overlays'; +import { withModalDialogConfig, OverlayMixin } from '@lion/overlays'; import '@lion/calendar/lion-calendar.js'; import './lion-calendar-overlay-frame.js'; @@ -255,17 +255,14 @@ export class LionInputDatepicker extends OverlayMixin(LionInputDate) { /** * @override Configures OverlayMixin - * @desc returns an instance of a (dynamic) overlay controller - * @returns {OverlayController} + * @desc overrides default configuration options for this component + * @returns {Object} */ // eslint-disable-next-line class-methods-use-this - _defineOverlay({ contentNode, invokerNode }) { - const ctrl = new OverlayController({ + _defineOverlayConfig() { + return { ...withModalDialogConfig(), - contentNode, - invokerNode, - }); - return ctrl; + }; } async __openCalendarOverlay() { diff --git a/packages/overlays/docs/migration.md b/packages/overlays/docs/migration.md index f219c78fc..3e301a123 100644 --- a/packages/overlays/docs/migration.md +++ b/packages/overlays/docs/migration.md @@ -53,7 +53,7 @@ const template = html`
Hello, World!
-
diff --git a/packages/overlays/src/OverlayController.js b/packages/overlays/src/OverlayController.js index 2865fcbe5..299975a4e 100644 --- a/packages/overlays/src/OverlayController.js +++ b/packages/overlays/src/OverlayController.js @@ -152,7 +152,7 @@ export class OverlayController { // TODO: Instead, prefetch it or use a preloader-manager to load it during idle time this.constructor.popperModule = preloadPopper(); } - this.__mergePopperConfigs(this.config.popperConfig || {}); + this.__mergePopperConfigs(cfgToAdd.popperConfig || {}); } this._handleFeatures({ phase: 'init' }); } diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index 749a2184f..552775074 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -1,4 +1,5 @@ import { render, dedupeMixin } from '@lion/core'; +import { OverlayController } from './OverlayController.js'; /** * @type {Function()} @@ -18,12 +19,16 @@ export const OverlayMixin = dedupeMixin( config: { type: Object, }, + closeEventName: { + type: String, + }, }; } constructor() { super(); this.config = {}; + this.closeEventName = 'overlay-close'; } get opened() { @@ -59,10 +64,29 @@ export const OverlayMixin = dedupeMixin( /** * @overridable method `_defineOverlay` * @desc returns an instance of a (dynamic) overlay controller + * In case overriding _defineOverlayConfig is not enough * @returns {OverlayController} */ // eslint-disable-next-line - _defineOverlay({ contentNode, invokerNode }) {} + _defineOverlay({ contentNode, invokerNode }) { + return new OverlayController({ + contentNode, + invokerNode, + ...this._defineOverlayConfig(), + ...this.config, + }); + } + + /** + * @overridable method `_defineOverlay` + * @desc returns an object with default configuration options for your overlay component. + * This is generally speaking easier to override than _defineOverlay method entirely. + * @returns {OverlayController} + */ + // eslint-disable-next-line + _defineOverlayConfig() { + return {}; + } /** * @overridable @@ -84,6 +108,14 @@ export const OverlayMixin = dedupeMixin( super.connectedCallback(); } this._createOverlay(); + + // Default close event catcher on the contentNode which is useful if people want to close + // their overlay but the content is not in the global root node (nowhere near the overlay component) + this.__close = () => { + this.opened = false; + }; + this._overlayCtrl.contentNode.addEventListener(this.closeEventName, this.__close); + this._setupOpenCloseListeners(); this.__syncOpened(); this.__syncPopper(); @@ -91,9 +123,7 @@ export const OverlayMixin = dedupeMixin( firstUpdated(c) { super.firstUpdated(c); - if (this._overlayCtrl.config.placementMode === 'local') { - this._createOutletForLocalOverlay(); - } + this._createOutletForLocalOverlay(); } updated(c) { @@ -107,6 +137,7 @@ export const OverlayMixin = dedupeMixin( if (super.disconnectedCallback) { super.disconnectedCallback(); } + this._overlayCtrl.contentNode.removeEventListener(this.closeEventName, this.__close); this._teardownOpenCloseListeners(); } @@ -114,7 +145,8 @@ export const OverlayMixin = dedupeMixin( return Array.from(this.children).find(child => child.slot === 'invoker'); } - // FIXME: This should be refactored to Array.from(this.children).find(child => child.slot === 'content') + // FIXME: This should be refactored to + // Array.from(this.children).find(child => child.slot === 'content') // When this issue is fixed https://github.com/ing-bank/lion/issues/382 get _overlayContentNode() { const contentNode = this.querySelector('[slot=content]'); @@ -184,7 +216,7 @@ export const OverlayMixin = dedupeMixin( __syncPopper() { if (this._overlayCtrl) { - // TODO: Use updateConfig directly.. but first check if this sync is even still needed! Maybe we can remove it. + // TODO: Use updateConfig directly.. But maybe we can remove this entirely. this._overlayCtrl.updatePopperConfig(this.config.popperConfig); } } diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index 32ffdacf7..e33c82de1 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -7,7 +7,6 @@ import { withDropdownConfig, withModalDialogConfig, OverlayMixin, - OverlayController, } from '../index.js'; function renderOffline(litHtmlTemplate) { @@ -96,14 +95,16 @@ const overlayDemoStyle = css` customElements.define( 'lion-demo-overlay', class extends OverlayMixin(LitElement) { + constructor() { + super(); + this.closeEventName = 'demo-overlay-close'; + } + // eslint-disable-next-line class-methods-use-this - _defineOverlay({ contentNode, invokerNode }) { - return new OverlayController({ + _defineOverlayConfig() { + return { placementMode: 'global', // have to set a default - contentNode, - invokerNode, - ...this.config, - }); + }; } _setupOpenCloseListeners() { @@ -114,12 +115,10 @@ customElements.define( this.opened = !this.opened; }; this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); - this._overlayCtrl.contentNode.addEventListener('close', this.__close); } _teardownOpenCloseListeners() { this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); - this._overlayCtrl.contentNode.removeEventListener('close', this.__close); } render() { @@ -161,7 +160,8 @@ storiesOf('Overlay System | Overlay as a WC', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} >⨯
@@ -179,7 +179,8 @@ storiesOf('Overlay System | Overlay as a WC', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} >⨯
@@ -211,7 +212,8 @@ storiesOf('Overlay System | Overlay as a WC', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} >⨯
@@ -275,7 +277,8 @@ storiesOf('Overlay System | Overlay as a WC', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} >⨯ @@ -410,7 +413,7 @@ storiesOf('Overlay System | Overlay as a WC', module) Hello! You can close this notification here: e.target.dispatchEvent(new Event('close', { bubbles: true }))} + @click=${e => e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} >⨯ diff --git a/packages/select-rich/src/LionSelectRich.js b/packages/select-rich/src/LionSelectRich.js index 1067b271e..2f81abfb6 100644 --- a/packages/select-rich/src/LionSelectRich.js +++ b/packages/select-rich/src/LionSelectRich.js @@ -1,5 +1,5 @@ import { html, css, LitElement, SlotMixin } from '@lion/core'; -import { OverlayController, withDropdownConfig, OverlayMixin } from '@lion/overlays'; +import { withDropdownConfig, OverlayMixin } from '@lion/overlays'; import { FormControlMixin, InteractionStateMixin, FormRegistrarMixin } from '@lion/field'; import { ValidateMixin } from '@lion/validate'; import './differentKeyNamesShimIE.js'; @@ -601,12 +601,10 @@ export class LionSelectRich extends OverlayMixin( } // eslint-disable-next-line class-methods-use-this - _defineOverlay({ invokerNode, contentNode } = {}) { - return new OverlayController({ + _defineOverlayConfig() { + return { ...withDropdownConfig(), - contentNode, - invokerNode, - }); + }; } __setupOverlay() { diff --git a/packages/tooltip/README.md b/packages/tooltip/README.md index e7a4b8914..c42b725f7 100644 --- a/packages/tooltip/README.md +++ b/packages/tooltip/README.md @@ -17,7 +17,7 @@ e invoker element is focused. ### Installation ```sh -npm i --save @lion/popup +npm i --save @lion/tooltip ``` ```js @@ -28,7 +28,7 @@ import '@lion/tooltip/lion-tooltip.js'; ```html -
This is a popup
+
This is a tooltip
Popup on link diff --git a/packages/tooltip/package.json b/packages/tooltip/package.json index 81d716e1b..94f03ee80 100644 --- a/packages/tooltip/package.json +++ b/packages/tooltip/package.json @@ -33,8 +33,7 @@ ], "dependencies": { "@lion/core": "^0.3.0", - "@lion/overlays": "^0.6.4", - "@lion/popup": "^0.3.20" + "@lion/overlays": "^0.6.4" }, "devDependencies": { "@lion/button": "^0.3.43", diff --git a/packages/tooltip/src/LionTooltip.js b/packages/tooltip/src/LionTooltip.js index 6eeb8f36b..1976ea6be 100644 --- a/packages/tooltip/src/LionTooltip.js +++ b/packages/tooltip/src/LionTooltip.js @@ -1,21 +1,20 @@ -import { OverlayMixin, OverlayController } from '@lion/overlays'; +import { OverlayMixin } from '@lion/overlays'; import { LitElement, html } from '@lion/core'; export class LionTooltip extends OverlayMixin(LitElement) { constructor() { super(); + this.closeEventName = 'tooltip-close'; this.mouseActive = false; this.keyActive = false; } - _defineOverlay({ contentNode, invokerNode }) { - return new OverlayController({ + // eslint-disable-next-line class-methods-use-this + _defineOverlayConfig() { + return { placementMode: 'local', // have to set a default elementToFocusAfterHide: null, - contentNode, - invokerNode, - ...this.config, - }); + }; } _setupOpenCloseListeners() { From 57a3c04873d2f7e6cc879f4d129a10d7d863a8f7 Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Wed, 27 Nov 2019 08:46:51 +0100 Subject: [PATCH 04/12] feat(overlays): add before-show event to OverlayMixin --- packages/overlays/src/OverlayMixin.js | 3 +++ packages/overlays/stories/index.stories.js | 29 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index 552775074..f639abe11 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -36,6 +36,9 @@ export const OverlayMixin = dedupeMixin( } set opened(show) { + if (show) { + this.dispatchEvent(new Event('before-show')); + } this._opened = show; // mainly captured for sync on connectedCallback if (this._overlayCtrl) { this.__syncOpened(); diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index e33c82de1..1c7b2cde9 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -323,6 +323,35 @@ storiesOf('Overlay System | Overlay as a WC', module)
`; }) + .add( + 'Responsive switching', + () => html` + + { + if (window.innerWidth >= 600) { + e.target.config = { ...withModalDialogConfig() }; + } else { + e.target.config = { ...withBottomSheetConfig() }; + } + }} + > + Overlay +
+ Hello! You can close this notification here: + + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} + >⨯ +
+
+ `, + ) .add('On hover', () => { const popup = renderOffline(html` Date: Wed, 27 Nov 2019 09:20:19 +0100 Subject: [PATCH 05/12] fix(overlays): fix overlay content node selector to be more accurate --- packages/overlays/src/OverlayMixin.js | 18 ++++++++++++++---- packages/overlays/stories/index.stories.js | 6 ------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index f639abe11..d11deeb85 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -148,11 +148,21 @@ export const OverlayMixin = dedupeMixin( return Array.from(this.children).find(child => child.slot === 'invoker'); } - // FIXME: This should be refactored to - // Array.from(this.children).find(child => child.slot === 'content') - // When this issue is fixed https://github.com/ing-bank/lion/issues/382 get _overlayContentNode() { - const contentNode = this.querySelector('[slot=content]'); + let contentNode; + + // FIXME: This should shadow outlet in between the host and the content slot, is a problem + // Should simply be Array.from(this.children).find(child => child.slot === 'content') + // Issue: https://github.com/ing-bank/lion/issues/382 + const shadowOutlet = Array.from(this.children).find( + child => child.slot === '_overlay-shadow-outlet', + ); + if (shadowOutlet) { + contentNode = Array.from(shadowOutlet.children).find(child => child.slot === 'content'); + } else { + contentNode = Array.from(this.children).find(child => child.slot === 'content'); + } + if (contentNode) { this._cachedOverlayContentNode = contentNode; } diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index 1c7b2cde9..eefceeb2d 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -84,12 +84,6 @@ const overlayDemoStyle = css` padding: 10px; border: 1px solid black; } - - @media (max-width: 480px) { - .overlay { - display: none; - } - } `; customElements.define( From 0b3149469aaa4f7b50d62fc758137a2c94e3a10c Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Wed, 27 Nov 2019 13:12:49 +0100 Subject: [PATCH 06/12] fix(overlays): remove _contentNodeWrapper on teardown --- packages/field/test/FormControlMixin.test.js | 1 - packages/overlays/src/OverlayController.js | 1 + packages/overlays/src/OverlayMixin.js | 1 + packages/overlays/stories/index.stories.js | 47 +++++++++++++++++-- .../overlays/test/OverlayController.test.js | 13 +++++ 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/packages/field/test/FormControlMixin.test.js b/packages/field/test/FormControlMixin.test.js index 074bf0972..df30e8ae9 100644 --- a/packages/field/test/FormControlMixin.test.js +++ b/packages/field/test/FormControlMixin.test.js @@ -78,7 +78,6 @@ describe('FormControlMixin', () => { const el = wrapper.querySelector(elem); const { _inputNode } = el; - console.log('_inputNode', _inputNode); // 1. addToAriaLabelledBy() // external inputs should go in order defined by user diff --git a/packages/overlays/src/OverlayController.js b/packages/overlays/src/OverlayController.js index 299975a4e..f9e8d60b4 100644 --- a/packages/overlays/src/OverlayController.js +++ b/packages/overlays/src/OverlayController.js @@ -554,6 +554,7 @@ export class OverlayController { teardown() { this._handleFeatures({ phase: 'teardown' }); + this._contentNodeWrapper.remove(); } /** diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index d11deeb85..7b819e592 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -142,6 +142,7 @@ export const OverlayMixin = dedupeMixin( } this._overlayCtrl.contentNode.removeEventListener(this.closeEventName, this.__close); this._teardownOpenCloseListeners(); + this._overlayCtrl.teardown(); } get _overlayInvokerNode() { diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index eefceeb2d..60c060dba 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -80,6 +80,10 @@ const overlayDemoStyle = css` padding: 8px; } + .overlay lion-button { + color: black; + } + .demo-popup { padding: 10px; border: 1px solid black; @@ -102,16 +106,18 @@ customElements.define( } _setupOpenCloseListeners() { - this.__close = () => { - this.opened = false; - }; this.__toggle = () => { + console.log('toggle!'); this.opened = !this.opened; }; + + console.log(this._overlayCtrl.invokerNode, this, this.__toggle); this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); + this._overlayCtrl.invokerNode.addEventListener('click', () => console.log('ay')); } _teardownOpenCloseListeners() { + console.log('teardown for', this); this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); } @@ -191,6 +197,41 @@ storiesOf('Overlay System | Overlay as a WC', module)
`; }) + .add( + 'Nested overlays', + () => html` + + + Overlay +
+
+ Hello! This is a notification. + + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} + >Close + + Open child +
+ Hello! You can close this notification here: + + e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} + >⨯ +
+
+
+
+
+ `, + ) .add( 'Local placementMode', () => html` diff --git a/packages/overlays/test/OverlayController.test.js b/packages/overlays/test/OverlayController.test.js index ec4bb8526..e31b59a57 100644 --- a/packages/overlays/test/OverlayController.test.js +++ b/packages/overlays/test/OverlayController.test.js @@ -162,6 +162,19 @@ describe('OverlayController', () => { }); }); + // TODO: Add teardown feature tests + describe('Teardown', () => { + it('removes the contentNodeWrapper from global rootnode upon teardown', async () => { + const ctrl = new OverlayController({ + ...withGlobalTestConfig(), + }); + + expect(ctrl.manager.globalRootNode.children.length).to.equal(1); + ctrl.teardown(); + expect(ctrl.manager.globalRootNode.children.length).to.equal(0); + }); + }); + describe('Node Configuration', () => { it('accepts an .contentNode to directly set content', async () => { const ctrl = new OverlayController({ From d1a410346decd1d654d31818bab1724aad134df9 Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Thu, 28 Nov 2019 15:55:51 +0100 Subject: [PATCH 07/12] chore(dialog): allow for not having an invokerNode --- packages/dialog/src/LionDialog.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/dialog/src/LionDialog.js b/packages/dialog/src/LionDialog.js index abecc9cac..fbe015e24 100644 --- a/packages/dialog/src/LionDialog.js +++ b/packages/dialog/src/LionDialog.js @@ -21,11 +21,16 @@ export class LionDialog extends OverlayMixin(LitElement) { this.__toggle = () => { this.opened = !this.opened; }; - this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); + + if (this._overlayCtrl.invokerNode) { + this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); + } } _teardownOpenCloseListeners() { - this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); + if (this._overlayCtrl.invokerNode) { + this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); + } } render() { From ab5cb627afe5ce5c9739346afe1404cc16326576 Mon Sep 17 00:00:00 2001 From: Joren Broekema Date: Thu, 28 Nov 2019 16:23:31 +0100 Subject: [PATCH 08/12] fix(overlays): close overlay upon disconnectedCallback --- packages/overlays/src/OverlayMixin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index 7b819e592..67a79c71d 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -140,6 +140,7 @@ export const OverlayMixin = dedupeMixin( if (super.disconnectedCallback) { super.disconnectedCallback(); } + this.opened = false; this._overlayCtrl.contentNode.removeEventListener(this.closeEventName, this.__close); this._teardownOpenCloseListeners(); this._overlayCtrl.teardown(); From 4b1acbdafa242ce840de3e2b8f37446f7a019edc Mon Sep 17 00:00:00 2001 From: Thomas Allmer Date: Fri, 29 Nov 2019 17:05:38 +0100 Subject: [PATCH 09/12] chore: fix typo in docs; no autocomplete show overlay in story --- packages/dialog/README.md | 8 ++++---- packages/overlays/README.md | 10 +++++----- packages/overlays/stories/index.stories.js | 5 ++++- packages/tooltip/README.md | 2 +- packages/tooltip/stories/index.stories.js | 20 +++++++------------- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/packages/dialog/README.md b/packages/dialog/README.md index aa2abb950..8b3e1e9d2 100644 --- a/packages/dialog/README.md +++ b/packages/dialog/README.md @@ -28,10 +28,10 @@ import '@lion/dialog/lion-dialog.js'; ```js html` - -
+ +
This is a dialog
Hello! You can close this notification here: - e.target.dispatchEvent(new Event('dialog-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
@@ -93,14 +92,15 @@ storiesOf('Overlays Specific WC | Dialog', module) .add('Custom configuration', () => { const dialog = placement => html` - Dialog ${placement} +
Hello! You can close this notification here: - e.target.dispatchEvent(new Event('dialog-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
`; @@ -118,14 +118,15 @@ storiesOf('Overlays Specific WC | Dialog', module) .add('Toggle placement with knobs', () => { const dialog = html` - Dialog +
Hello! You can close this notification here: - e.target.dispatchEvent(new Event('dialog-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
`; diff --git a/packages/dialog/test/lion-dialog.test.js b/packages/dialog/test/lion-dialog.test.js index 155fef199..70932dcac 100644 --- a/packages/dialog/test/lion-dialog.test.js +++ b/packages/dialog/test/lion-dialog.test.js @@ -1,77 +1,34 @@ -import { expect, fixture, html } from '@open-wc/testing'; +import { expect, fixture, html, unsafeStatic } from '@open-wc/testing'; +import { runOverlayMixinSuite } from '@lion/overlays/test-suites/OverlayMixin.suite.js'; import '../lion-dialog.js'; -// Smoke tests dialog describe('lion-dialog', () => { - describe('Basic', () => { - it('should not be shown by default', async () => { - const el = await fixture(html` - -
Hey there
- Popup button -
- `); - expect(el._overlayCtrl.isShown).to.be.false; - }); + describe('Integration tests', () => { + const tagString = 'lion-dialog'; + const tag = unsafeStatic(tagString); + runOverlayMixinSuite({ + tagString, + tag, + suffix: ' for lion-dialog', + }); + }); + + describe('Basic', () => { it('should show content on invoker click', async () => { const el = await fixture(html`
Hey there
- Popup button +
`); const invoker = el.querySelector('[slot="invoker"]'); invoker.click(); - expect(el._overlayCtrl.isShown).to.be.true; - }); - - it('should hide content on close event', async () => { - const el = await fixture(html` - -
- Hey there - -
- Popup button -
- `); - const invoker = el.querySelector('[slot="invoker"]'); - invoker.click(); - - expect(el._overlayCtrl.isShown).to.be.true; - - const closeBtn = el._overlayCtrl.contentNode.querySelector('button'); - closeBtn.click(); - - expect(el._overlayCtrl.isShown).to.be.false; - }); - - it('should respond to initially and dynamically setting the config', async () => { - const el = await fixture(html` - -
Hey there
- Popup button -
- `); - await el._overlayCtrl.show(); - expect(el._overlayCtrl.trapsKeyboardFocus).to.be.false; - - el.config = { viewportConfig: { placement: 'left' } }; - expect(el._overlayCtrl.viewportConfig.placement).to.equal('left'); - expect( - el._overlayCtrl._contentNodeWrapper.classList.contains( - 'global-overlays__overlay-container--left', - ), - ); + expect(el.opened).to.be.true; }); }); }); diff --git a/packages/input-datepicker/src/LionCalendarOverlayFrame.js b/packages/input-datepicker/src/LionCalendarOverlayFrame.js index 3ec585e68..2978ef210 100644 --- a/packages/input-datepicker/src/LionCalendarOverlayFrame.js +++ b/packages/input-datepicker/src/LionCalendarOverlayFrame.js @@ -90,14 +90,9 @@ export class LionCalendarOverlayFrame extends LocalizeMixin(LitElement) { ]; } - constructor() { - super(); - this.__dispatchCloseEvent = this.__dispatchCloseEvent.bind(this); - } - - __dispatchCloseEvent() { + __dispatchHideEvent() { // Designed to work in conjunction with ModalDialogController - this.dispatchEvent(new CustomEvent('dialog-close'), { bubbles: true, composed: true }); + this.dispatchEvent(new CustomEvent('hide'), { bubbles: true }); } render() { @@ -109,7 +104,7 @@ export class LionCalendarOverlayFrame extends LocalizeMixin(LitElement) {
-
-
Hello, World!
- -
- -`; -``` - -Or using a more specific component like `lion-tooltip`, which toggles on-hover: - -```js -import '@lion/tooltip/lion-tooltip.js'; - -const template = html` - - -
-
Hello, World!
-
-
-`; -``` - -Or `lion-dialog` which uses modal dialog configuration defaults - -```js -import '@lion/dialog/lion-dialog.js'; - -const template = html` - - -
-
Hello, World!
- -
-
-`; -``` - -## Instantiating an overlay controller (discouraged) - -### Old - -```js -import { overlays, GlobalOverlayController } from '@lion/overlays'; - -const ctrl = overlays.add( - new GlobalOverlayController({ - contentTemplate: () => html` -
My content
- `, - }), -); - -const template = html` - - Open dialog - -`; -``` - -### New - -> Note: The OverlayController is render-system agnostic, you are responsible for passing a node (and rendering it prior). -> For lit-html, we will use a simple helper. Let us know if you think we should export this. - -```js -import { render } from '@lion/core'; - -function renderOffline(litHtmlTemplate) { - const offlineRenderContainer = document.createElement('div'); - render(litHtmlTemplate, offlineRenderContainer); - return offlineRenderContainer.firstElementChild; -} -``` - -This example shows how you can use our configuration generators. - -```js -import { OverlayController, withModalDialogConfig } from '@lion/overlays'; - -const ctrl = new OverlayController({ - ...withModalDialogConfig(), - contentTemplate: renderOffline(html` -
My content
- `), -}); - -const template = html` - - Open dialog - -`; -``` - -### New (local example) - -```js -import { OverlayController } from '@lion/overlays'; - -const ctrl = new OverlayController({ - ...withModalDialogConfig(), - placementMode: 'local', - hidesOnEsc: true, - hidesOnOutsideClick: true, - contentNode: renderOffline(html` -
United Kingdom
- `), - invokerNode: renderOffline(html` - - `), -}); - -const template = html` -
In the ${ctrl.invoker}${ctrl.content} the weather is nice.
-`; -``` diff --git a/packages/overlays/package.json b/packages/overlays/package.json index 2d3411218..79b8274a9 100644 --- a/packages/overlays/package.json +++ b/packages/overlays/package.json @@ -29,6 +29,7 @@ "stories", "test", "test-helpers", + "test-suites", "translations", "*.js" ], @@ -37,8 +38,6 @@ "popper.js": "^1.15.0" }, "devDependencies": { - "@lion/button": "^0.3.43", - "@lion/icon": "^0.2.9", "@open-wc/demoing-storybook": "^0.2.0", "@open-wc/testing": "^2.3.4", "@open-wc/testing-helpers": "^1.0.0", diff --git a/packages/overlays/src/OverlayController.js b/packages/overlays/src/OverlayController.js index 552b5ee21..1ba08b842 100644 --- a/packages/overlays/src/OverlayController.js +++ b/packages/overlays/src/OverlayController.js @@ -33,6 +33,7 @@ export class OverlayController { trapsKeyboardFocus: false, hidesOnEsc: false, hidesOnOutsideClick: false, + hidesOnHideEventInContentNode: true, isTooltip: false, handlesUserInteraction: false, handlesAccessibility: false, @@ -336,6 +337,9 @@ export class OverlayController { if (this.hidesOnOutsideClick) { this._handleHidesOnOutsideClick({ phase }); } + if (this.hidesOnHideEventInContentNode) { + this._handleHidesOnHideEventInContentNode({ phase }); + } if (this.handlesAccessibility) { this._handleAccessibility({ phase }); } @@ -483,10 +487,26 @@ export class OverlayController { if (phase === 'show') { this.__escKeyHandler = ev => ev.key === 'Escape' && this.hide(); this.contentNode.addEventListener('keyup', this.__escKeyHandler); - this.invokerNode.addEventListener('keyup', this.__escKeyHandler); + if (this.invokerNode) { + this.invokerNode.addEventListener('keyup', this.__escKeyHandler); + } } else if (phase === 'hide') { this.contentNode.removeEventListener('keyup', this.__escKeyHandler); - this.invokerNode.removeEventListener('keyup', this.__escKeyHandler); + if (this.invokerNode) { + this.invokerNode.removeEventListener('keyup', this.__escKeyHandler); + } + } + } + + _handleHidesOnHideEventInContentNode({ phase }) { + if (phase === 'show') { + this.__hideEventInContentNodeHandler = ev => { + ev.stopPropagation(); + this.hide(); + }; + this.contentNode.addEventListener('hide', this.__hideEventInContentNodeHandler); + } else if (phase === 'hide') { + this.contentNode.removeEventListener('keyup', this.__hideEventInContentNodeHandler); } } diff --git a/packages/overlays/src/OverlayMixin.js b/packages/overlays/src/OverlayMixin.js index 67a79c71d..a96cba7de 100644 --- a/packages/overlays/src/OverlayMixin.js +++ b/packages/overlays/src/OverlayMixin.js @@ -1,4 +1,4 @@ -import { render, dedupeMixin } from '@lion/core'; +import { dedupeMixin } from '@lion/core'; import { OverlayController } from './OverlayController.js'; /** @@ -16,54 +16,26 @@ export const OverlayMixin = dedupeMixin( type: Boolean, reflect: true, }, - config: { - type: Object, - }, - closeEventName: { - type: String, - }, }; } constructor() { super(); + this.opened = false; this.config = {}; - this.closeEventName = 'overlay-close'; - } - - get opened() { - return this._overlayCtrl.isShown; - } - - set opened(show) { - if (show) { - this.dispatchEvent(new Event('before-show')); - } - this._opened = show; // mainly captured for sync on connectedCallback - if (this._overlayCtrl) { - this.__syncOpened(); - } } get config() { - return this._config; + return this.__config; } set config(value) { if (this._overlayCtrl) { this._overlayCtrl.updateConfig(value); } - this._config = value; + this.__config = value; } - /** - * @overridable method `_overlayTemplate` - * Be aware that the overlay will be placed in a different shadow root. - * Therefore, style encapsulation should be provided by the contents of - * _overlayTemplate - * @return {TemplateResult} - */ - /** * @overridable method `_defineOverlay` * @desc returns an instance of a (dynamic) overlay controller @@ -88,7 +60,19 @@ export const OverlayMixin = dedupeMixin( */ // eslint-disable-next-line _defineOverlayConfig() { - return {}; + return { + placementMode: 'local', + }; + } + + updated(changedProperties) { + super.updated(changedProperties); + + if (changedProperties.has('opened')) { + if (this._overlayCtrl) { + this.__syncToOverlayController(); + } + } } /** @@ -106,44 +90,19 @@ export const OverlayMixin = dedupeMixin( // eslint-disable-next-line class-methods-use-this _teardownOpenCloseListeners() {} - connectedCallback() { - if (super.connectedCallback) { - super.connectedCallback(); - } - this._createOverlay(); - - // Default close event catcher on the contentNode which is useful if people want to close - // their overlay but the content is not in the global root node (nowhere near the overlay component) - this.__close = () => { - this.opened = false; - }; - this._overlayCtrl.contentNode.addEventListener(this.closeEventName, this.__close); - - this._setupOpenCloseListeners(); - this.__syncOpened(); - this.__syncPopper(); - } - - firstUpdated(c) { - super.firstUpdated(c); - this._createOutletForLocalOverlay(); - } - - updated(c) { - super.updated(c); - if (this.__managesOverlayViaTemplate) { - this._renderOverlayContent(); - } + firstUpdated(changedProperties) { + super.firstUpdated(changedProperties); + // we setup in firstUpdated so we can use nodes from light and shadowDom + this._setupOverlayCtrl(); } disconnectedCallback() { if (super.disconnectedCallback) { super.disconnectedCallback(); } - this.opened = false; - this._overlayCtrl.contentNode.removeEventListener(this.closeEventName, this.__close); - this._teardownOpenCloseListeners(); - this._overlayCtrl.teardown(); + if (this._overlayCtrl) { + this._teardownOverlayCtrl(); + } } get _overlayInvokerNode() { @@ -171,69 +130,51 @@ export const OverlayMixin = dedupeMixin( return contentNode || this._cachedOverlayContentNode; } - _renderOverlayContent() { - render(this._overlayTemplate(), this.__contentParent, { - scopeName: this.localName, - eventContext: this, + _setupOverlayCtrl() { + this._overlayCtrl = this._defineOverlay({ + contentNode: this._overlayContentNode, + invokerNode: this._overlayInvokerNode, }); + this.__syncToOverlayController(); + this.__setupSyncFromOverlayController(); + + this._setupOpenCloseListeners(); } - _createOverlay() { - let contentNode; - if (this.__managesOverlayViaTemplate) { - this.__contentParent = document.createElement('div'); - this._renderOverlayContent(); - contentNode = this.__contentParent.firstElementChild; - } else { - contentNode = this._overlayContentNode; - } - - // Why no template support for invokerNode? - // -> Because this node will always be managed by the Subclasser and should - // reside in the dom of the sub class. A reference to a rendered node suffices. - const invokerNode = this._overlayInvokerNode; - this._overlayCtrl = this._defineOverlay({ contentNode, invokerNode }); + _teardownOverlayCtrl() { + this._teardownOpenCloseListeners(); + this.__teardownSyncFromOverlayController(); + this._overlayCtrl.teardown(); } - // FIXME: We add an overlay slot to the wrapper, but the content node already has a slot="content" - // This is a big problem, because slots should be direct children of its host element. - // Putting the shadow outlet slot in between breaks that. https://github.com/ing-bank/lion/issues/382 - /** - * @desc Should be called by Subclasser for local overlay support in shadow roots - * Create an outlet slot in shadow dom that our local overlay can pass through - */ - _createOutletForLocalOverlay() { - const outlet = document.createElement('slot'); - outlet.name = '_overlay-shadow-outlet'; - this.shadowRoot.appendChild(outlet); - this._overlayCtrl._contentNodeWrapper.slot = '_overlay-shadow-outlet'; + __setupSyncFromOverlayController() { + this.__onOverlayCtrlShow = () => { + this.opened = true; + }; + this.__onOverlayCtrlHide = () => { + this.opened = false; + }; + this.__onBeforeShow = () => { + this.dispatchEvent(new Event('before-show')); + }; + + this._overlayCtrl.addEventListener('show', this.__onOverlayCtrlShow); + this._overlayCtrl.addEventListener('hide', this.__onOverlayCtrlHide); + this._overlayCtrl.addEventListener('before-show', this.__onBeforeShow); } - /** - * @desc Two options for a Subclasser: - * - 1: Define a template in `._overlayTemplate`. In this case the overlay content is - * predefined and thus belongs to the web component. Examples: datepicker. - * - 2: Define a getter `_overlayContentNode` that returns a node reference to a (content - * projected) node. Used when Application Developer is in charge of the content. Examples: - * popover, dialog, bottom sheet, dropdown, tooltip, select, combobox etc. - */ - get __managesOverlayViaTemplate() { - return Boolean(this._overlayTemplate); + __teardownSyncFromOverlayController() { + this._overlayCtrl.removeEventListener('show', this.__onOverlayCtrlShow); + this._overlayCtrl.removeEventListener('hide', this.__onOverlayCtrlHide); + this._overlayCtrl.removeEventListener('before-show', this.__onBeforeShow); } - __syncOpened() { - if (this._opened) { + __syncToOverlayController() { + if (this.opened) { this._overlayCtrl.show(); } else { this._overlayCtrl.hide(); } } - - __syncPopper() { - if (this._overlayCtrl) { - // TODO: Use updateConfig directly.. But maybe we can remove this entirely. - this._overlayCtrl.updatePopperConfig(this.config.popperConfig); - } - } }, ); diff --git a/packages/overlays/stories/index.stories.js b/packages/overlays/stories/index.stories.js index 4331b4b96..4b1e6100e 100644 --- a/packages/overlays/stories/index.stories.js +++ b/packages/overlays/stories/index.stories.js @@ -1,7 +1,5 @@ import { storiesOf, html, withKnobs } from '@open-wc/demoing-storybook'; import { css, render, LitElement } from '@lion/core'; -import '@lion/icon/lion-icon.js'; -import '@lion/button/lion-button.js'; import { withBottomSheetConfig, withDropdownConfig, @@ -70,7 +68,7 @@ const overlayDemoStyle = css` flex-direction: column; } - .overlay { + .demo-overlay { display: block; position: absolute; font-size: 16px; @@ -80,7 +78,7 @@ const overlayDemoStyle = css` padding: 8px; } - .overlay lion-button { + .demo-overlay button { color: black; } @@ -93,11 +91,6 @@ const overlayDemoStyle = css` customElements.define( 'lion-demo-overlay', class extends OverlayMixin(LitElement) { - constructor() { - super(); - this.closeEventName = 'demo-overlay-close'; - } - // eslint-disable-next-line class-methods-use-this _defineOverlayConfig() { return { @@ -107,24 +100,20 @@ customElements.define( _setupOpenCloseListeners() { this.__toggle = () => { - console.log('toggle!'); this.opened = !this.opened; }; - - console.log(this._overlayCtrl.invokerNode, this, this.__toggle); - this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle); - this._overlayCtrl.invokerNode.addEventListener('click', () => console.log('ay')); + this._overlayInvokerNode.addEventListener('click', this.__toggle); } _teardownOpenCloseListeners() { - console.log('teardown for', this); - this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle); + this._overlayInvokerNode.removeEventListener('click', this.__toggle); } render() { return html` + `; } }, @@ -145,25 +134,25 @@ storiesOf('Overlay System | Overlay as a WC', module)

To close your overlay from some action performed inside the content slot, fire a - close event. + hide event.

For the overlay to close, it will need to bubble to the content slot (use - bubbles: true. Also composed: true if it needs to traverse shadow - boundaries) + bubbles: true. If absolutely needed composed: true can be used to + traverse shadow boundaries)

The demo below demonstrates this

- Overlay -
+ +
Hello! You can close this notification here: - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
@@ -174,15 +163,15 @@ storiesOf('Overlay System | Overlay as a WC', module) - Overlay ${placement} -
+ +
Hello! You can close this notification here: - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
`; @@ -204,27 +193,25 @@ storiesOf('Overlay System | Overlay as a WC', module) ${overlayDemoStyle} - Overlay -
+ +
Hello! This is a notification. - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >Close + - Open child -
+ +
Hello! You can close this notification here: - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
@@ -242,15 +229,15 @@ storiesOf('Overlay System | Overlay as a WC', module) - Overlay -
+ +
Hello! You can close this notification here: - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
@@ -307,15 +294,15 @@ storiesOf('Overlay System | Overlay as a WC', module) .add('Switch overlays configuration', () => { const overlay = renderOffline(html` - Overlay -
+ +
Hello! You can close this notification here: - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
`); @@ -376,15 +363,15 @@ storiesOf('Overlay System | Overlay as a WC', module) } }} > - Overlay -
+ +
Hello! You can close this notification here: - - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} > + ⨯ +
`, @@ -411,7 +398,7 @@ storiesOf('Overlay System | Overlay as a WC', module) }} >UK -
+
United Kingdom
@@ -475,13 +462,13 @@ storiesOf('Overlay System | Overlay as a WC', module) : { popperConfig: { placement: text('local config', 'top-start') } }), }} > - Overlay -
+ +
Hello! You can close this notification here: - e.target.dispatchEvent(new Event('demo-overlay-close', { bubbles: true }))} - >⨯ e.target.dispatchEvent(new Event('hide', { bubbles: true }))} + >⨯
diff --git a/packages/overlays/stories/overlay-features.stories.js b/packages/overlays/stories/overlay-features.stories.js index fd9a7d9f2..b6108c402 100644 --- a/packages/overlays/stories/overlay-features.stories.js +++ b/packages/overlays/stories/overlay-features.stories.js @@ -233,7 +233,7 @@ storiesOf('Overlay System | Behavior Features', module) ${this.options[(this.options.indexOf(this.placement) + 1) % this.options.length]} position - + `; } @@ -265,9 +265,6 @@ storiesOf('Overlay System | Behavior Features', module) element.addEventListener('toggle-placement', e => { overlayCtrl.updateConfig({ viewportConfig: { placement: e.detail } }); }); - element.addEventListener('close', () => { - overlayCtrl.hide(); - }); return html`
- Tooltip +
Hello there!
@@ -67,19 +65,19 @@ storiesOf('Overlays Specific WC|Tooltip', module)
- Top +
Its top placement
- Right +
Its right placement
- Bottom +
Its bottom placement
- Left +
Its left placement
@@ -119,7 +117,7 @@ storiesOf('Overlays Specific WC|Tooltip', module) }), }}" > - ${text('Invoker text', 'Hover me!')} +
${text('Content text', 'Hello, World!')}
diff --git a/packages/tooltip/test/lion-tooltip.test.js b/packages/tooltip/test/lion-tooltip.test.js index 45d64bddc..5d61bd42f 100644 --- a/packages/tooltip/test/lion-tooltip.test.js +++ b/packages/tooltip/test/lion-tooltip.test.js @@ -1,24 +1,26 @@ -import { expect, fixture, html } from '@open-wc/testing'; +import { expect, fixture, html, unsafeStatic } from '@open-wc/testing'; +import { runOverlayMixinSuite } from '@lion/overlays/test-suites/OverlayMixin.suite.js'; import '../lion-tooltip.js'; describe('lion-tooltip', () => { - describe('Basic', () => { - it('should not be shown by default', async () => { - const el = await fixture(html` - -
Hey there
- Tooltip button -
- `); - expect(el._overlayCtrl.isShown).to.equal(false); - }); + describe('Integration tests', () => { + const tagString = 'lion-tooltip'; + const tag = unsafeStatic(tagString); + runOverlayMixinSuite({ + tagString, + tag, + suffix: ' for lion-tooltip', + }); + }); + + describe('Basic', () => { it('should show content on mouseenter and hide on mouseleave', async () => { const el = await fixture(html`
Hey there
- Tooltip button +
`); const eventMouseEnter = new Event('mouseenter'); @@ -35,7 +37,7 @@ describe('lion-tooltip', () => { const el = await fixture(html`
Hey there
- Tooltip button +
`); const eventMouseEnter = new Event('mouseenter'); @@ -52,7 +54,7 @@ describe('lion-tooltip', () => { const el = await fixture(html`
Hey there
- Tooltip button +
`); const invoker = Array.from(el.children).find(child => child.slot === 'invoker'); @@ -70,7 +72,7 @@ describe('lion-tooltip', () => { const el = await fixture(html`
Hey there
- Tooltip button +
`); const invoker = Array.from(el.children).find(child => child.slot === 'invoker'); @@ -90,7 +92,7 @@ describe('lion-tooltip', () => {
This is Tooltip using overlay
- Tooltip button + `); const invoker = Array.from(el.children).find(child => child.slot === 'invoker'); @@ -106,7 +108,7 @@ describe('lion-tooltip', () => { const el = await fixture(html`
Hey there
- Tooltip button +
`); diff --git a/yarn.lock b/yarn.lock index 84580045d..7cfb81f99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2088,7 +2088,7 @@ wallaby-webpack "^3.0.0" webpack "^4.28.0" -"@open-wc/testing@^2.3.4", "@open-wc/testing@^2.3.9": +"@open-wc/testing@^2.3.4": version "2.3.9" resolved "https://registry.yarnpkg.com/@open-wc/testing/-/testing-2.3.9.tgz#048bb3122d989cf0df96611513aaec7738964e3d" integrity sha512-5pKtHNP/73y9VWAwXOdxf4uzKVAtCowSdy4B6It4iETq8RshkAtKJbJBj+iQSU81pG6jOgSNPlGYeU01/CXaxw==