@esri/calcite-components
Version:
Web Components for Esri's Calcite Design System.
92 lines (89 loc) • 3.85 kB
JavaScript
/*!
* 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 };