diff --git a/src/RapidElement.ts b/src/RapidElement.ts index b473c2ae..7a3453c7 100644 --- a/src/RapidElement.ts +++ b/src/RapidElement.ts @@ -36,6 +36,7 @@ export interface EventHandler { event: string; method: EventListener; isDocument?: boolean; + isWindow?: boolean; } export class RapidElement extends LitElement { @@ -54,6 +55,8 @@ export class RapidElement extends LitElement { for (const handler of this.getEventHandlers()) { if (handler.isDocument) { document.addEventListener(handler.event, handler.method.bind(this)); + } else if (handler.isWindow) { + window.addEventListener(handler.event, handler.method.bind(this)); } else { this.addEventListener(handler.event, handler.method.bind(this)); } @@ -64,6 +67,8 @@ export class RapidElement extends LitElement { for (const handler of this.getEventHandlers()) { if (handler.isDocument) { document.removeEventListener(handler.event, handler.method); + } else if (handler.isWindow) { + window.removeEventListener(handler.event, handler.method); } else { this.removeEventListener(handler.event, handler.method); } @@ -173,4 +178,12 @@ export class RapidElement extends LitElement { event.preventDefault(); } } + + public isMobile() { + const win = window as any; + if (win.isMobile) { + return win.isMobile(); + } + return false; + } } diff --git a/src/ResizeElement.ts b/src/ResizeElement.ts new file mode 100644 index 00000000..f946c92a --- /dev/null +++ b/src/ResizeElement.ts @@ -0,0 +1,18 @@ +import { RapidElement } from './RapidElement'; +import { throttle } from './utils'; + +export class ResizeElement extends RapidElement { + public handleResize() { + this.requestUpdate(); + } + + public getEventHandlers() { + return [ + { + event: 'resize', + method: throttle(this.handleResize, 50), + isWindow: true, + }, + ]; + } +} diff --git a/src/dialog/Dialog.ts b/src/dialog/Dialog.ts index e72e5524..251d827c 100644 --- a/src/dialog/Dialog.ts +++ b/src/dialog/Dialog.ts @@ -5,6 +5,7 @@ import { RapidElement } from '../RapidElement'; import { CustomEventType } from '../interfaces'; import { styleMap } from 'lit-html/directives/style-map.js'; import { getClasses } from '../utils'; +import { ResizeElement } from '../ResizeElement'; export enum ButtonType { PRIMARY = 'primary', @@ -19,7 +20,7 @@ export class DialogButton { closes?: boolean; } -export class Dialog extends RapidElement { +export class Dialog extends ResizeElement { static get widths(): { [size: string]: string } { return { small: '400px', @@ -86,12 +87,14 @@ export class Dialog extends RapidElement { transform: scale(0.9) translatey(2em); background: white; margin: auto; + display: flex; + flex-direction: column; } .dialog-body { background: #fff; - max-height: 75vh; overflow-y: auto; + flex-grow: 1; } .dialog-mask.dialog-open { @@ -397,6 +400,12 @@ export class Dialog extends RapidElement { dialogStyle['width'] = Dialog.widths[this.size]; } + if (this.isMobile()) { + dialogStyle['width'] = '100%'; + dialogStyle['height'] = '100%'; + delete dialogStyle['maxWidth']; + } + const header = this.header ? html`