@lion/ui
Version:
A package of extendable web components
200 lines (176 loc) • 4.95 kB
Markdown
---
parts:
- Dialog
- Use Cases
title: 'Dialog: Use Cases'
eleventyNavigation:
key: 'Dialog: Use Cases'
order: 20
parent: Dialog
title: Use Cases
---
# Dialog: Use Cases
`lion-dialog` is a component wrapping a modal dialog controller.
Its purpose is to make it easy to use our Overlay System declaratively.
```js script
import { html } from '@mdjs/mdjs-preview';
import '@lion/ui/define/lion-dialog.js';
import { demoStyle } from './src/demoStyle.js';
import './src/styled-dialog-content.js';
import './src/slots-dialog-content.js';
import './src/external-dialog.js';
```
```html
<lion-dialog>
<div slot="content">
This is a dialog
<button ="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}">x</button>
<div>
<button slot="invoker">Click me</button>
</lion-dialog>
```
## Alert dialog
In some cases the dialog should act like an [alertdialog](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/examples/alertdialog/), which is a combination of an alert and dialog. If that is the case, you can add `is-alert-dialog` attribute, which sets the correct role on the dialog.
```js preview-story
export const alertDialog = () => {
return html`
<style>
${demoStyle}
</style>
<lion-dialog is-alert-dialog class="dialog">
<button type="button" slot="invoker">Reset</button>
<div slot="content" class="demo-box">
Are you sure you want to clear the input field?
<button
type="button"
="${ev => ev.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
>
Yes
</button>
<button
type="button"
="${ev => ev.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
>
No
</button>
</div>
</lion-dialog>
`;
};
```
## External trigger
```js preview-story
export const externalTrigger = () => {
const externalTriggerDialog = () => {
class DialogTriggerDemo extends LitElement {
static get properties() {
return {
_isOpen: { state: true },
};
}
toggleDialog(open) {
return () => (this._isOpen = open);
}
handleDialog(e) {
this._isOpen = e.detail.opened;
}
render() {
return html`
<button =${this.toggleDialog(true)}>Open dialog</button>
<lion-dialog ?opened=${this._isOpen} -changed=${this.handleDialog}>
<div slot="content" class="dialog demo-box">
Hello! You can close this notification here:
<button class="close-button" =${this.toggleDialog(false)}>⨯</button>
</div>
</lion-dialog>
`;
}
}
};
return html`
<style>
${demoStyle}
</style>
<div class="demo-box_placements">
<dialog-trigger-demo></dialog-trigger-demo>
</div>
`;
};
```
## Placement overrides
```js preview-story
export const placementOverrides = () => {
const dialog = placement => {
const cfg = { viewportConfig: { placement } };
return html`
<lion-dialog .config="${cfg}">
<button slot="invoker">Dialog ${placement}</button>
<div slot="content" class="dialog demo-box">
Hello! You can close this notification here:
<button
class="close-button"
="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
>
⨯
</button>
</div>
</lion-dialog>
`;
};
return html`
<style>
${demoStyle}
</style>
<div class="demo-box_placements">
${dialog('center')} ${dialog('top-left')} ${dialog('top-right')} ${dialog('bottom-left')}
${dialog('bottom-right')}
</div>
`;
};
```
Configuration passed to `config` property:
```js
{
viewportConfig: {
placement: ... // <-- choose a position
}
}
```
## Other overrides
No backdrop, hides on escape, prevents scrolling while opened, and focuses the body when hiding.
```js preview-story
export const otherOverrides = () => {
const cfg = {
hasBackdrop: false,
hidesOnEscape: true,
preventsScroll: true,
elementToFocusAfterHide: document.body,
};
return html`
<style>
${demoStyle}
</style>
<lion-dialog .config="${cfg}">
<button slot="invoker">Click me to open dialog</button>
<div slot="content" class="demo-dialog-content">
Hello! You can close this dialog here:
<button
class="demo-dialog-content__close-button"
="${e => e.target.dispatchEvent(new Event('close-overlay', { bubbles: true }))}"
>
⨯
</button>
</div>
</lion-dialog>
`;
};
```
Configuration passed to `config` property:
```js
{
hasBackdrop: false,
hidesOnEscape: true,
preventsScroll: true,
elementToFocusAfterHide: document.body
}
```