UNPKG

ember-mobile-menu

Version:
97 lines (93 loc) 2.67 kB
import "./tray.css" import Component from '@glimmer/component'; import { htmlSafe } from '@ember/template'; import { modifier } from 'ember-modifier'; import { enableBodyScroll, disableBodyScroll } from '../../utils/body-scroll-lock.js'; import didPan from 'ember-gesture-modifiers/modifiers/did-pan'; import { precompileTemplate } from '@ember/template-compilation'; import { setComponentTemplate } from '@ember/component'; ; class TrayComponent extends Component { /** * Width of the menu in px. * * @property width * @type Number * @default 300 * @private */ get width() { return this.args.width ?? 300; } /** * Whether the menu is a left menu (otherwise it's a right menu) * * @property isLeft * @type Boolean * @default true * @private */ get isLeft() { return this.args.isLeft ?? true; } /** * Current relative position of the menu in px. * * @property position * @type Number * @default 0 * @private */ get position() { return this.args.position ?? 0; } get progress() { return Math.abs(this.position) / this.width; } get style() { let style = `width: ${this.width}px;`; let offset = this.width; let translation = this.position; if (this.args.mode === 'ios') { offset /= 3; translation /= 3; } else if (['reveal', 'squeeze-reveal'].includes(this.args.mode)) { offset = 0; translation = 0; } style += this.isLeft ? `left: -${offset}px; transform: translateX(${translation}px);` : `right: -${offset}px; transform: translateX(${translation}px);`; if (this.args.shadowEnabled && ['default', 'push', 'squeeze'].includes(this.args.mode) && this.progress > 0) { style += `box-shadow: 0 0 10px rgba(0,0,0,${0.3 * this.progress});`; } return htmlSafe(style); } lockBodyScroll = modifier(element => { let { isClosed, preventScroll, embed } = this.args; if (preventScroll && !embed) { if (isClosed) { enableBodyScroll(element); } else { disableBodyScroll(element); } } return () => { if (preventScroll && !embed) { enableBodyScroll(element); } }; }); static { setComponentTemplate(precompileTemplate("\n <div class=\"mobile-menu__tray\" style={{this.style}} {{didPan onPanStart=@onPanStart onPan=@onPan onPanEnd=@onPanEnd capture=@capture preventScroll=@preventScroll}} {{this.lockBodyScroll}} ...attributes>\n {{yield}}\n </div>\n ", { strictMode: true, scope: () => ({ didPan }) }), this); } } export { TrayComponent as default }; //# sourceMappingURL=tray.js.map