Merge pull request #568 from ing-bank/chore/fix-demos-overlays

chore(overlays): fix demos
This commit is contained in:
Joren Broekema 2020-02-13 15:55:10 +01:00 committed by GitHub
commit e0c105fa10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 94 additions and 17 deletions

View file

@ -1,4 +1,4 @@
# Overlays System
# Overlay System
[//]: # 'AUTO INSERT HEADER PREPUBLISH'
@ -6,9 +6,10 @@ Supports different types of overlays like dialogs, toasts, tooltips, dropdown, e
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.
See [lion-dialog](../dialog) and [lion-tooltip](../tooltip) for example Web Component implementations using the Overlay System.
## Features
- lion-overlay web component:
@ -22,19 +23,21 @@ Its purpose is to make it easy to use our Overlay System declaratively. It can b
## How to use
Usually you will use `lion-dialog` (or `lion-tooltip` if this makes more sense).
### Installation
```sh
npm i --save @lion/overlays
npm i --save @lion/dialog
```
### Example
```js
import '@lion/overlays/lion-overlay.js';
import '@lion/dialog/lion-dialog.js';
html`
<lion-overlay .config=${{
<lion-dialog .config=${{
placementMode: 'global',
viewportConfig: { placement: 'bottom-right' },
}}>
@ -47,12 +50,16 @@ html`
<button slot="invoker">
Click me
</button>
</lion-overlay>
</lion-dialog>
`;
```
Or by creating a controller yourself
```sh
npm i --save @lion/overlays
```
```js
import { OverlayController } from '@lion/overlays';
@ -63,9 +70,51 @@ const ctrl = new OverlayController({
});
```
Or creating your own Web Component which uses the Overlay System
```js
import { LitElement } from '@lion/core';
import { OverlayMixin, withModalDialogConfig } from '@lion/overlays';
class MyOverlayComponent extends LitElement {
_defineOverlayConfig() {
return {
...withModalDialogConfig,
};
}
_setupOpenCloseListeners() {
super._setupOpenCloseListeners();
this.__toggle = () => {
this.opened = !this.opened;
};
if (this._overlayInvokerNode) {
this._overlayInvokerNode.addEventListener('click', this.__toggle);
}
}
_teardownOpenCloseListeners() {
super._teardownOpenCloseListeners();
if (this._overlayInvokerNode) {
this._overlayInvokerNode.removeEventListener('click', this.__toggle);
}
}
render() {
return html`
<slot name="invoker"></slot>
<slot name="content"></slot>
<slot name="_overlay-shadow-outlet"></slot>
`;
}
}
```
## Rationales
For rationales, please check the [docs](./docs) folder, where we go more in-depth.
For rationales, please check the [docs](./docs) folder, where we go more in-depth. Or check out the Storybook demos which also contains more info.
### Aria roles

View file

@ -7,7 +7,7 @@ import {
} from '../index.js';
import './demo-overlay-system.js';
import './applyDemoOverlayStyles.js';1
import './applyDemoOverlayStyles.js';
import { ref as r } from './directives/ref.js';
<Meta title="Overlays/System/Overview" parameters={{ component: 'demo-overlay-system' }} />
@ -119,7 +119,15 @@ const ctrl = new OverlayController({
});
```
or in your Web Component with `OverlayMixin`
or in your Web Component with `OverlayMixin`, make sure you override these methods to:
- Define configuration
- Handle setting up event listeners of toggling the opened state of your overlay
- Handle the tearing down of those event listeners
- Define a template which includes
- invoker slot for your user to provide the invoker node (the element that invokes the overlay content)
- content slot for your user to provide the content that shows when the overlay is opened
- _overlay-shadow-outlet, this slot is currently necessary under the hood for acting as a wrapper element for placement purposes, but is not something your end user should be concerned with, unless they are extending your component.
```js
_defineOverlayConfig() {
@ -127,6 +135,33 @@ _defineOverlayConfig() {
...withModalDialogConfig
};
}
_setupOpenCloseListeners() {
super._setupOpenCloseListeners();
this.__toggle = () => {
this.opened = !this.opened;
};
if (this._overlayInvokerNode) {
this._overlayInvokerNode.addEventListener('click', this.__toggle);
}
}
_teardownOpenCloseListeners() {
super._teardownOpenCloseListeners();
if (this._overlayInvokerNode) {
this._overlayInvokerNode.removeEventListener('click', this.__toggle);
}
}
render() {
return html`
<slot name="invoker"></slot>
<slot name="content"></slot>
<slot name="_overlay-shadow-outlet"></slot>
`;
}
```
or declaratively in your template with the `.config` property

View file

@ -8936,20 +8936,13 @@ listr@^0.14.2:
p-map "^2.0.0"
rxjs "^6.3.3"
lit-element@^2.0.1:
lit-element@^2.0.1, lit-element@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.2.1.tgz#79c94d8cfdc2d73b245656e37991bd1e4811d96f"
integrity sha512-ipDcgQ1EpW6Va2Z6dWm79jYdimVepO5GL0eYkZrFvdr0OD/1N260Q9DH+K5HXHFrRoC7dOg+ZpED2XE0TgGdXw==
dependencies:
lit-html "^1.0.0"
lit-element@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.1.0.tgz#85bc3f1da0227f4b13de8a1be978229b9fa327e9"
integrity sha512-0z/KHm1xZweivfOVRr8AKR06+D3k02u15m9s4jkuRdnGe5wfmEwePzrQQBsSZNILdnfJvfo3TJOeGhBCVZaPbw==
dependencies:
lit-html "^1.0.0"
lit-html@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.1.2.tgz#2e3560a7075210243649c888ad738eaf0daa8374"