import { storiesOf, html } from '@open-wc/demoing-storybook'; import { css } from '@lion/core'; import { LionLitElement } from '@lion/core/src/LionLitElement.js'; import { overlays, GlobalOverlayController } from '../index.js'; const globalOverlayDemoStyle = css` .demo-overlay { background-color: white; width: 200px; border: 1px solid lightgrey; } `; let placement = 'center'; const togglePlacement = overlayCtrl => { const placements = [ 'top-left', 'top', 'top-right', 'right', 'bottom-left', 'bottom', 'bottom-right', 'left', 'center', ]; placement = placements[(placements.indexOf(placement) + 1) % placements.length]; // eslint-disable-next-line no-param-reassign overlayCtrl.overlayContainerClass = `global-overlays__overlay-container--${placement}`; }; storiesOf('Global Overlay System|Global Overlay', module) .add('Default', () => { const overlayCtrl = overlays.add( new GlobalOverlayController({ contentTemplate: () => html`

Simple overlay

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

Lorem ipsum

`, )} `; }) .add('Option "preventsScroll"', () => { const overlayCtrl = overlays.add( new GlobalOverlayController({ preventsScroll: true, contentTemplate: () => html`

Scrolling the body is blocked

`, }), ); return html` ${Array(50).fill( html`

Lorem ipsum

`, )} `; }) .add('Option "hasBackdrop"', () => { const overlayCtrl = overlays.add( new GlobalOverlayController({ hasBackdrop: true, contentTemplate: () => html`

There is a backdrop

`, }), ); return html` `; }) .add('Option "trapsKeyboardFocus"', () => { const overlayCtrl = overlays.add( new GlobalOverlayController({ trapsKeyboardFocus: true, contentTemplate: () => html`

Tab key is trapped within the overlay

Anchor
Tabindex
Contenteditable
`, }), ); return html` Anchor 1 Anchor 2 `; }) .add('Option "trapsKeyboardFocus" (multiple)', () => { const overlayCtrl2 = overlays.add( new GlobalOverlayController({ trapsKeyboardFocus: true, viewportConfig: { placement: 'left', }, contentTemplate: () => html`

Overlay 2. Tab key is trapped within the overlay

`, }), ); const overlayCtrl1 = overlays.add( new GlobalOverlayController({ trapsKeyboardFocus: true, contentTemplate: () => html`

Overlay 1. Tab key is trapped within the overlay

`, }), ); return html` Anchor 1 Anchor 2 `; }) .add('Option "isBlocking"', () => { const blockingOverlayCtrl = overlays.add( new GlobalOverlayController({ isBlocking: true, viewportConfig: { placement: 'left', }, contentTemplate: () => html`

Hides other overlays

`, }), ); const normalOverlayCtrl = overlays.add( new GlobalOverlayController({ contentTemplate: () => html`

Normal overlay

`, }), ); return html` `; }) .add('Option "viewportConfig:placement"', () => { const overlayCtrl = overlays.add( new GlobalOverlayController({ viewportConfig: { placement: 'center', }, hasBackdrop: true, trapsKeyboardFocus: true, contentTemplate: () => html`

Overlay placement: ${placement}

`, }), ); return html` `; }) .add('Sync', () => { const overlayCtrl = overlays.add( new GlobalOverlayController({ contentTemplate: ({ title = 'default' } = {}) => html`

${title}

`, }), ); return html` `; }) .add('In web components', () => { class EditUsernameOverlay extends LionLitElement { static get properties() { return { username: { type: String }, }; } static get styles() { return css` :host { position: fixed; left: 20px; top: 20px; display: block; width: 300px; padding: 24px; background-color: white; border: 1px solid blue; } .close-button { position: absolute; top: 8px; right: 8px; } `; } render() { return html`
`; } _onUsernameEdited() { this.dispatchEvent( new CustomEvent('edit-username-submitted', { detail: this.$id('usernameInput').value, }), ); } _onClose() { this.dispatchEvent(new CustomEvent('edit-username-closed')); } } if (!customElements.get('edit-username-overlay')) { customElements.define('edit-username-overlay', EditUsernameOverlay); } class MyComponent extends LionLitElement { static get properties() { return { username: { type: String }, _editingUsername: { type: Boolean }, }; } constructor() { super(); this.username = 'Steve'; this._editingUsername = false; } disconnectedCallback() { super.disconnectedCallback(); this._editOverlay.hide(); } render() { return html`

Your username is: ${this.username}

`; } firstUpdated() { this._editOverlay = overlays.add( new GlobalOverlayController({ focusElementAfterHide: this.shadowRoot.querySelector('button'), contentTemplate: ({ username = 'standard' } = {}) => html` `, }), ); } updated() { this._editOverlay.sync({ isShown: this._editingUsername, data: { username: this.username }, }); } _onEditSubmitted(e) { this.username = e.detail; this._editingUsername = false; } _onEditClosed() { this._editingUsername = false; } _onStartEditUsername() { this._editingUsername = true; } } if (!customElements.get('my-component')) { customElements.define('my-component', MyComponent); } return html` `; });