UNPKG

vuetify

Version:

Vue Material Component Framework

124 lines 3.5 kB
// Utilities import { h, Transition, TransitionGroup } from 'vue'; import { genericComponent, PREFERS_REDUCED_MOTION, propsFactory } from "../../util/index.js"; // Types export const makeTransitionProps = propsFactory({ disabled: Boolean, group: Boolean, hideOnLeave: Boolean, leaveAbsolute: Boolean, mode: String, origin: String }, 'transition'); export function createCssTransition(name, origin, mode) { return genericComponent()({ name, props: makeTransitionProps({ mode, origin }), setup(props, { slots }) { const functions = { onBeforeEnter(el) { if (props.origin) { el.style.transformOrigin = props.origin; } }, onLeave(el) { if (props.leaveAbsolute) { const { offsetTop, offsetLeft, offsetWidth, offsetHeight } = el; el._transitionInitialStyles = { position: el.style.position, top: el.style.top, left: el.style.left, width: el.style.width, height: el.style.height }; el.style.position = 'absolute'; el.style.top = `${offsetTop}px`; el.style.left = `${offsetLeft}px`; el.style.width = `${offsetWidth}px`; el.style.height = `${offsetHeight}px`; } if (props.hideOnLeave) { el.style.setProperty('display', 'none', 'important'); } }, onAfterLeave(el) { if (props.leaveAbsolute && el?._transitionInitialStyles) { const { position, top, left, width, height } = el._transitionInitialStyles; delete el._transitionInitialStyles; el.style.position = position || ''; el.style.top = top || ''; el.style.left = left || ''; el.style.width = width || ''; el.style.height = height || ''; } } }; return () => { const tag = props.group ? TransitionGroup : Transition; return h(tag, { name: props.disabled ? '' : name, css: !props.disabled, ...(props.group ? undefined : { mode: props.mode }), ...(props.disabled ? {} : functions) }, slots.default); }; } }); } export function createJavascriptTransition(name, functions, mode = 'in-out') { return genericComponent()({ name, props: { mode: { type: String, default: mode }, disabled: { type: Boolean, default: PREFERS_REDUCED_MOTION() }, group: Boolean, hideOnLeave: Boolean }, setup(props, { slots }) { const tag = props.group ? TransitionGroup : Transition; return () => { return h(tag, { name: props.disabled ? '' : name, css: !props.disabled, // mode: props.mode, // TODO: vuejs/vue-next#3104 ...(props.disabled ? {} : { ...functions, onLeave: el => { if (props.hideOnLeave) { el.style.setProperty('display', 'none', 'important'); } else { functions.onLeave?.(el); } } }) }, slots.default); }; } }); } //# sourceMappingURL=createTransition.js.map