UNPKG

@animxyz/vue3

Version:

AnimXYZ is a composable animation library that makes your site shine

295 lines (245 loc) 8.02 kB
/** * VueAnimXyz v0.6.6 * Copyright (c) 2020-present Ingram Projects * Released under the MIT License. * https://animxyz.com */ import { h, Transition, TransitionGroup } from 'vue'; import clsx from 'clsx'; import { getTransitionRawChildren } from '@vue/runtime-core'; function deleteUndefined (obj) { Object.keys(obj).forEach(function (key) { if (obj[key] === undefined) { delete obj[key]; } }); } function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function getXyzDurationForMode (mode, duration) { switch (_typeof(duration)) { case 'number': return duration; case 'string': return duration; case 'object': if (duration === null) return null; return duration[mode]; } return null; } function getXyzElementMode (el) { if (el.classList.contains('xyz-appear')) { return 'appear'; } if (el.classList.contains('xyz-in')) { return 'in'; } if (el.classList.contains('xyz-out')) { return 'out'; } return null; } function clearXyzElementProperties(el) { if (el._xyzAppearObserver) { el._xyzAppearObserver.disconnect(); } if (el._xyzAnimTimeout) { clearTimeout(el._xyzAnimTimeout); } el.removeEventListener('animationend', el._xyzAnimEnd); el.removeEventListener('animationcancelled', el._xyzAnimEnd); delete el._xyzAppearObserver; delete el._xyzAnimTimeout; delete el._xyzAnimEnd; } function getXyzAnimationHook (duration, appearVisible) { return function (el, done) { clearXyzElementProperties(el); function xyzAnimDone() { clearXyzElementProperties(el); done(); } var mode = getXyzElementMode(el); function runAnim() { var modeDuration = getXyzDurationForMode(mode, duration); if (typeof modeDuration === 'number') { el._xyzAnimTimeout = setTimeout(xyzAnimDone, modeDuration); return; } var xyzModeKeyframes = "xyz-".concat(mode, "-keyframes"); var xyzEls = new Set([el]); if (modeDuration === 'auto') { var xyzNestedEls = el.querySelectorAll(".xyz-nested, .xyz-".concat(mode, "-nested")); xyzNestedEls.forEach(xyzEls.add, xyzEls); } function removeXyzEl(xyzEl) { xyzEls.delete(xyzEl); if (xyzEls.size === 0) { xyzAnimDone(); } } // After one tick remove any elements that are dont have active animations el._xyzAnimTimeout = setTimeout(function () { xyzEls.forEach(function (xyzEl) { // Remove if element isnt visible var visible = xyzEl.offsetParent || xyzEl.getClientRects().length; if (!visible) { removeXyzEl(xyzEl); } // Remove if element has xyz animation overridden var animationName = window.getComputedStyle(xyzEl).getPropertyValue('animation-name'); if (animationName.indexOf(xyzModeKeyframes) === -1) { removeXyzEl(xyzEl); } }); }); el._xyzAnimEnd = function (event) { if (event.animationName === xyzModeKeyframes) { removeXyzEl(event.target); } }; el.addEventListener('animationend', el._xyzAnimEnd, false); el.addEventListener('animationcancelled', el._xyzAnimEnd, false); } if (mode === 'appear' && appearVisible) { var observerOptions = Object.assign({}, appearVisible); el.classList.add('xyz-paused-all'); el._xyzAppearObserver = new IntersectionObserver(function (entries, observer) { entries.forEach(function (entry) { if (entry.isIntersecting) { el.classList.remove('xyz-paused-all'); observer.disconnect(); runAnim(); } }); }, observerOptions); el._xyzAppearObserver.observe(el); } else { runAnim(); } }; } var xyzTransitionClasses = { appearFrom: 'xyz-appear-from', appearActive: 'xyz-appear', appearTo: 'xyz-appear-to', inFrom: 'xyz-in-from', inActive: 'xyz-in', inTo: 'xyz-in-to', outFrom: 'xyz-out-from', outActive: 'xyz-out', outTo: 'xyz-out-to' }; var xyzTransitionProps = { appear: Boolean, appearVisible: [Boolean, Object], duration: [Number, String, Object], mode: String, appearFromClass: String, appearActiveClass: String, appearToClass: String, enterFromClass: String, enterActiveClass: String, enterToClass: String, leaveFromClass: String, leaveActiveClass: String, leaveToClass: String }; var xyzTransitionGroupProps = Object.assign({}, xyzTransitionProps, { tag: { type: String, default: 'div' }, moveClass: String }); function mergeData() { var data1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var data2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return Object.assign({}, data1, data2, { style: Object.assign({}, data1 === null || data1 === void 0 ? void 0 : data1.style, data2 === null || data2 === void 0 ? void 0 : data2.style), class: clsx(data1 === null || data1 === void 0 ? void 0 : data1.class, data2 === null || data2 === void 0 ? void 0 : data2.class) }); } function getXyzTransitionData(data) { deleteUndefined(data); data.appear = Boolean(data.appear || data.appearVisible); var appear = data.appear, appearVisible = data.appearVisible, duration = data.duration; var animationHook = getXyzAnimationHook(duration, appearVisible); var transitionData = { css: true, type: 'animation', appearFromClass: xyzTransitionClasses.appearFrom, appearActiveClass: xyzTransitionClasses.appearActive, appearToClass: xyzTransitionClasses.appearTo, enterFromClass: xyzTransitionClasses.inFrom, enterActiveClass: xyzTransitionClasses.inActive, enterToClass: xyzTransitionClasses.inTo, leaveFromClass: xyzTransitionClasses.outFrom, leaveActiveClass: xyzTransitionClasses.outActive, leaveToClass: xyzTransitionClasses.outTo, onEnter: animationHook, onLeave: animationHook }; if (appear) { transitionData.onAppear = animationHook; } var mergedData = mergeData(transitionData, data); delete mergedData.appearVisible; delete mergedData.duration; return mergedData; } function XyzTransition(props, context) { var data = getXyzTransitionData(Object.assign({}, context.attrs, props)); return h(Transition, data, context.slots); } XyzTransition.props = xyzTransitionProps; function XyzTransitionGroup(props, context) { var data = getXyzTransitionData(Object.assign({}, context.attrs, props)); function childrenFn() { var children = context.slots.default ? context.slots.default() : []; var rawChildren = getTransitionRawChildren(children); rawChildren.forEach(function (node, index) { node.props = mergeData({ style: { '--xyz-index': index, '--xyz-index-rev': rawChildren.length - index - 1 } }, node.props); }); return children; } return h(TransitionGroup, data, childrenFn); } XyzTransitionGroup.props = xyzTransitionGroupProps; function updateDirective(el, _ref) { var value = _ref.value; el.setAttribute('xyz', clsx(el._xyzOriginal, value)); } var xyz = { beforeMount: function beforeMount(el) { el._xyzOriginal = el.getAttribute('xyz'); updateDirective.apply(void 0, arguments); }, updated: updateDirective }; var VueAnimXyz = { install: function install(app) { app.component('XyzTransition', XyzTransition); app.component('XyzTransitionGroup', XyzTransitionGroup); app.directive('xyz', xyz); } }; export default VueAnimXyz; export { XyzTransition, XyzTransitionGroup, xyz };