import { storiesOf, html } from '@open-wc/demoing-storybook'; import { css, LitElement } from '@lion/core'; import { fixtureSync } from '@open-wc/testing-helpers'; import { OverlayController } from '../index.js'; const globalOverlayDemoStyle = css` .demo-overlay { background-color: white; width: 200px; border: 1px solid lightgrey; } `; storiesOf('Overlay System | Behavior Features', module) .add('preventsScroll', () => { const overlayCtrl = new OverlayController({ placementMode: 'global', preventsScroll: true, contentNode: fixtureSync(html`

Scrolling the body is blocked

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

Lorem ipsum

`, )} `; }) .add('hasBackdrop', () => { const overlayCtrl = new OverlayController({ placementMode: 'global', hasBackdrop: true, contentNode: fixtureSync(html`

There is a backdrop

`), }); return html` `; }) .add('trapsKeyboardFocus', () => { const overlayCtrl = new OverlayController({ placementMode: 'global', trapsKeyboardFocus: true, contentNode: fixtureSync(html`

Tab key is trapped within the overlay

Anchor
Tabindex
Contenteditable
`), }); return html` Anchor 1 Anchor 2 `; }) .add('trapsKeyboardFocus" (multiple)', () => { const overlayCtrl2 = new OverlayController({ placementMode: 'global', trapsKeyboardFocus: true, viewportConfig: { placement: 'left', }, contentNode: fixtureSync(html`

Overlay 2. Tab key is trapped within the overlay

`), }); const overlayCtrl1 = new OverlayController({ placementMode: 'global', trapsKeyboardFocus: true, contentNode: fixtureSync(html`

Overlay 1. Tab key is trapped within the overlay

`), }); return html` Anchor 1 Anchor 2 `; }) .add('isBlocking', () => { const blockingOverlayCtrl = new OverlayController({ placementMode: 'global', isBlocking: true, viewportConfig: { placement: 'left', }, contentNode: fixtureSync(html`

Hides other overlays

`), }); const normalOverlayCtrl = new OverlayController({ placementMode: 'global', contentNode: fixtureSync(html`

Normal overlay

`), }); return html` `; }) .add('viewportConfig:placement', () => { const tagName = 'lion-overlay-placement-demo'; if (!customElements.get(tagName)) { customElements.define( tagName, class extends LitElement { static get properties() { return { // controller: { type: Object }, placement: { type: String }, }; } constructor() { super(); this.options = [ 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', 'center', ]; } 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, }), ); } }, ); } const initialPlacement = 'center'; const overlayCtrl = new OverlayController({ placementMode: 'global', viewportConfig: { placement: initialPlacement, }, contentNode: fixtureSync(html` `), }); const element = overlayCtrl.content.querySelector(tagName); element.placement = initialPlacement; element.addEventListener('toggle-placement', e => { overlayCtrl.updateConfig({ viewportConfig: { placement: e.detail } }); }); return html` `; }) .add('hidesOnOutsideClick', () => { const shadowContent = document.createElement('div'); shadowContent.attachShadow({ mode: 'open' }); shadowContent.shadowRoot.appendChild( fixtureSync(html`
Shadow area
`), ); const ctrl = new OverlayController({ placementMode: 'global', hidesOnOutsideClick: true, contentNode: fixtureSync(html`

Hides when clicked outside

${shadowContent}
`), }); return html` `; });