UNPKG

@esri/calcite-components

Version:

Web Components for Esri's Calcite Design System.

92 lines (89 loc) 3.85 kB
/*! * All material copyright ESRI, All Rights Reserved, unless otherwise specified. * See https://github.com/Esri/calcite-components/blob/master/LICENSE.md for details. * v1.5.0-next.4 */ import { e as readTask } from './index-c8875db5.js'; const componentToTransitionListeners = new WeakMap(); function transitionStart(event) { if (event.propertyName === this.openTransitionProp && event.target === this.transitionEl) { this.open ? this.onBeforeOpen() : this.onBeforeClose(); } } function transitionEnd(event) { if (event.propertyName === this.openTransitionProp && event.target === this.transitionEl) { this.open ? this.onOpen() : this.onClose(); } } /** * Helper to determine globally set transition duration on the given openTransitionProp, which is imported and set in the @Watch("open"). * Used to emit (before)open/close events both for when the opacity transition is present and when there is none (transition-duration is set to 0). * * @param component * @param nonOpenCloseComponent */ function onToggleOpenCloseComponent(component, nonOpenCloseComponent = false) { readTask(() => { if (component.transitionEl) { const allTransitionPropsArray = getComputedStyle(component.transitionEl).transition.split(" "); const openTransitionPropIndex = allTransitionPropsArray.findIndex((item) => item === component.openTransitionProp); const transitionDuration = allTransitionPropsArray[openTransitionPropIndex + 1]; if (transitionDuration === "0s") { (nonOpenCloseComponent ? component[component.transitionProp] : component.open) ? component.onBeforeOpen() : component.onBeforeClose(); (nonOpenCloseComponent ? component[component.transitionProp] : component.open) ? component.onOpen() : component.onClose(); } else { component.transitionEl.addEventListener("transitionstart", () => { (nonOpenCloseComponent ? component[component.transitionProp] : component.open) ? component.onBeforeOpen() : component.onBeforeClose(); }, { once: true }); component.transitionEl.addEventListener("transitionend", () => { (nonOpenCloseComponent ? component[component.transitionProp] : component.open) ? component.onOpen() : component.onClose(); }, { once: true }); } } }); } /** * Helper to keep track of transition listeners on setTransitionEl and connectedCallback on OpenCloseComponent components. * * For component which do not have open prop, use `onToggleOpenCloseComponent` implementation. * * @param component */ function connectOpenCloseComponent(component) { disconnectOpenCloseComponent(component); if (component.transitionEl) { const boundOnTransitionStart = transitionStart.bind(component); const boundOnTransitionEnd = transitionEnd.bind(component); componentToTransitionListeners.set(component, [ component.transitionEl, boundOnTransitionStart, boundOnTransitionEnd ]); component.transitionEl.addEventListener("transitionstart", boundOnTransitionStart); component.transitionEl.addEventListener("transitionend", boundOnTransitionEnd); } } /** * Helper to tear down transition listeners on disconnectedCallback on OpenCloseComponent components. * * @param component */ function disconnectOpenCloseComponent(component) { if (!componentToTransitionListeners.has(component)) { return; } const [transitionEl, start, end] = componentToTransitionListeners.get(component); transitionEl.removeEventListener("transitionstart", start); transitionEl.removeEventListener("transitionend", end); componentToTransitionListeners.delete(component); } export { connectOpenCloseComponent as c, disconnectOpenCloseComponent as d, onToggleOpenCloseComponent as o };