UNPKG

vue-kinesis

Version:

Easily create complexe interactive animations with Vue.js

1,303 lines (1,182 loc) 36.6 kB
'use strict';Object.defineProperty(exports,'__esModule',{value:true});function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }function getCoordinates (x, y) { return { x: x, y: y }; }function getCenter (element) { return getCoordinates(element ? element.width / 2 : 0, element ? element.height / 2 : 0); }function mouseMovement (action) { var target = action.target, event = action.event; var x = event.clientX; var y = event.clientY; var relativeX = x - target.left; var relativeY = y - target.top; var center = getCenter(target); var mouseMovementX = relativeX / center.x; var mouseMovementY = relativeY / center.y; return _objectSpread2(_objectSpread2({}, getCoordinates(mouseMovementX, mouseMovementY)), {}, { target: target }); }function scrollMovement (shape) { var target = shape.target; var x = (target.left - window.innerWidth) / (target.width + window.innerWidth); var y = (target.top - window.innerHeight) / (target.height + window.innerHeight); return _objectSpread2(_objectSpread2({}, getCoordinates(x, y)), {}, { target: target }); }function orientationElement (action) { var event = action.event, target = action.target; var x = event.gamma / 45; var y = event.beta / 90; return _objectSpread2(_objectSpread2({}, getCoordinates(x, y)), {}, { target: target }); }function inViewport(element) { var isInViewport = element.bottom >= 0 && element.right >= 0 && element.top <= (window.innerHeight || document.documentElement.clientHeight) && element.left <= (window.innerWidth || document.documentElement.clientWidth); return isInViewport; }function isTouch() { try { return /Mobi|Android/i.test(navigator.userAgent); } catch (e) { return true; } }function throttle(callback, delay, type) { var last; var timer; // eslint-disable-next-line func-names return function () { var context = this; var newDelay; if (type === 'scroll') { newDelay = delay; } else { newDelay = context.duration > 1000 ? delay : context.duration / 10; } var now = +new Date(); // eslint-disable-next-line prefer-rest-params var args = arguments; if (last && now < last + newDelay) { clearTimeout(timer); timer = setTimeout(function () { requestAnimationFrame(function () { last = now; callback.apply(context, args); }); }, newDelay); } else { requestAnimationFrame(function () { last = now; callback.apply(context, args); }); } }; }var audioMixin = { props: { audio: { type: String, required: false }, playAudio: { type: Boolean, default: false } }, data: function data() { return { analyser: null, audioArray: null, audioData: null, audioRef: null, wasPlayed: false, isPlaying: false }; }, watch: { audio: function audio() { this.wasPlayed = false; this.isPlaying = false; }, playAudio: function playAudio(play) { if (play) { this.play(); } else { this.stop(); } } }, methods: { play: function play() { if (!this.active) return; if (!this.wasPlayed) { this.handleAudio(); this.wasPlayed = true; } this.isPlaying = true; this.audioRef.play(); this.getSongData(); }, stop: function stop() { this.isPlaying = false; this.audioRef.pause(); }, handleAudio: function handleAudio() { var audio = this.$refs.audio; this.audioRef = audio; var context = new AudioContext(); var src = context.createMediaElementSource(audio); var analyser = context.createAnalyser(); src.connect(analyser); analyser.connect(context.destination); analyser.fftSize = 256; var bufferLength = analyser.frequencyBinCount; var audioArray = new Uint8Array(bufferLength); this.audioArray = audioArray; this.analyser = analyser; }, getSongData: function getSongData() { if (this.isPlaying) { this.analyser.getByteFrequencyData(this.audioArray); this.audioData = new Array(this.audioArray); // @Todo reactivity issue requestAnimationFrame(this.getSongData); } } } };// var script$4 = { name: 'KinesisContainer', mixins: [audioMixin], props: { tag: { type: String, default: 'div' }, event: { type: String, default: 'move' }, active: { type: Boolean, default: true }, duration: { type: Number, default: 1000 }, easing: { type: String, default: 'cubic-bezier(0.23, 1, 0.32, 1)' }, perspective: { type: Number, default: 1000 } }, provide: function provide() { var _this = this; var context = {}; var providedProps = ['audioData', 'duration', 'easing', 'event', 'eventData', 'isMoving', 'movement', 'shape']; providedProps.forEach(function (prop) { return Object.defineProperty(context, prop, { enumerable: true, get: function get() { return _this[prop]; } }); }); return { context: context }; }, data: function data() { var _this$$el; return { shape: (_this$$el = this.$el) === null || _this$$el === void 0 ? void 0 : _this$$el.getBoundingClientRect(), isMoving: false, leftOnce: false, movement: { x: 0, y: 0 }, eventMap: { orientation: 'deviceorientation', scroll: 'scroll', move: isTouch() ? 'deviceorientation' : null } }; }, computed: { eventActions: function eventActions() { var _this$shape; return { move: { action: mouseMovement, condition: this.isMoving && !isTouch(), type: isTouch() ? 'deviceorientation' : null }, scroll: { action: scrollMovement, condition: !!((_this$shape = this.shape) !== null && _this$shape !== void 0 && _this$shape.height), type: 'scroll' }, orientation: { action: orientationElement, condition: this.event === 'move' && isTouch(), type: 'deviceorientation' } }; }, style: function style() { return { perspective: "".concat(this.perspective, "px") }; } }, mounted: function mounted() { this.addEvents(); }, beforeDestroy: function beforeDestroy() { this.removeEvents(); }, methods: { handleMovementStart: function handleMovementStart() { if (!this.active) return; this.isMoving = true; }, handleMovementStop: function handleMovementStop() { if (!this.active) return; // fixes the specific case when mouseenter didn't trigger on page refresh this.leftOnce = true; this.isMoving = false; }, // eslint-disable-next-line func-names handleMovement: throttle(function (event) { if (!this.active) return; if (!this.isMoving && !this.leftOnce) { // fixes the specific case when mouseenter didn't trigger on page refresh this.handleMovementStart(); } this.shape = this.$el.getBoundingClientRect(); var isInViewport = inViewport(this.shape); var eventCondition = this.eventActions[this.event].condition; var eventAction = this.eventActions[this.event].action; if (isInViewport && eventCondition) { this.movement = eventAction({ target: this.shape, event: event }); this.eventData = getCoordinates(event.clientX, event.clientY); } }, 100), addEvents: function addEvents() { if (this.eventMap[this.event]) { window.addEventListener(this.eventMap[this.event], this.handleMovement, true); } }, removeEvents: function removeEvents() { if (this.eventMap[this.event]) { window.removeEventListener(this.eventMap[this.event], this.handleMovement, true); } } } };function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) { if (typeof shadowMode !== 'boolean') { createInjectorSSR = createInjector; createInjector = shadowMode; shadowMode = false; } // Vue.extend constructor export interop. const options = typeof script === 'function' ? script.options : script; // render functions if (template && template.render) { options.render = template.render; options.staticRenderFns = template.staticRenderFns; options._compiled = true; // functional template if (isFunctionalTemplate) { options.functional = true; } } // scopedId if (scopeId) { options._scopeId = scopeId; } let hook; if (moduleIdentifier) { // server build hook = function (context) { // 2.3 injection context = context || // cached call (this.$vnode && this.$vnode.ssrContext) || // stateful (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__; } // inject component styles if (style) { style.call(this, createInjectorSSR(context)); } // register component module identifier for async chunk inference if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier); } }; // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook; } else if (style) { hook = shadowMode ? function (context) { style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot)); } : function (context) { style.call(this, createInjector(context)); }; } if (hook) { if (options.functional) { // register for functional component in vue file const originalRender = options.render; options.render = function renderWithStyleInjection(h, context) { hook.call(context); return originalRender(h, context); }; } else { // inject component registration as beforeCreate hook const existing = options.beforeCreate; options.beforeCreate = existing ? [].concat(existing, hook) : [hook]; } } return script; }/* script */ var __vue_script__$4 = script$4; /* template */ var __vue_render__$3 = function __vue_render__() { var _vm = this; var _h = _vm.$createElement; var _c = _vm._self._c || _h; return _c(_vm.tag, { tag: "component", style: _vm.style, on: { "mousemove": _vm.handleMovement, "mouseenter": _vm.handleMovementStart, "mouseleave": _vm.handleMovementStop } }, [_vm._t("default"), _vm._v(" "), _vm.audio ? _c('audio', { ref: "audio", attrs: { "type": "audio/mpeg" }, on: { "ended": _vm.stop } }, [_c('source', { attrs: { "src": _vm.audio } })]) : _vm._e()], 2); }; var __vue_staticRenderFns__$3 = []; /* style */ var __vue_inject_styles__$4 = undefined; /* scoped */ var __vue_scope_id__$4 = undefined; /* module identifier */ var __vue_module_identifier__$4 = "data-v-5b4afee6"; /* functional template */ var __vue_is_functional_template__$4 = false; /* style inject */ /* style inject SSR */ /* style inject shadow dom */ var __vue_component__$4 = /*#__PURE__*/normalizeComponent({ render: __vue_render__$3, staticRenderFns: __vue_staticRenderFns__$3 }, __vue_inject_styles__$4, __vue_script__$4, __vue_scope_id__$4, __vue_is_functional_template__$4, __vue_module_identifier__$4, false, undefined, undefined, undefined);/* eslint-disable no-nested-ternary */ function clamp (value, min, max) { return max && value > max ? max : min && value < min ? min : value; }function elementMovement (action) { var y = action.y, x = action.x, target = action.target, _action$originX = action.originX, originX = _action$originX === void 0 ? 50 : _action$originX, _action$strength = action.strength, strength = _action$strength === void 0 ? 10 : _action$strength, _action$event = action.event, event = _action$event === void 0 ? null : _action$event, minX = action.minX, minY = action.minY, maxX = action.maxX, maxY = action.maxY; var _action$originY = action.originY, originY = _action$originY === void 0 ? 50 : _action$originY; if (event === 'scroll') { originY = -originY / 2; } var movementX = clamp((x - originX / 50) * strength, minX, maxX); var movementY = clamp((y - originY / 50) * strength, minY, maxY); return _objectSpread2(_objectSpread2({}, getCoordinates(movementX, movementY)), {}, { target: target }); }/* eslint-disable default-case */ var transformMixin = { methods: { transformSwitch: function transformSwitch(type, x, y, s) { type = type === 'scaleX' || type === 'scaleY' ? 'scale' : type; var transform; switch (type) { case 'translate': transform = this.translateMovement(x, y); break; case 'rotate': transform = this.rotateMovement(x, y); break; case 'depth': transform = this.depthMovement(x, y, s); break; case 'depth_inv': transform = this.depthMovement(-x, -y, s); break; case 'scale': transform = this.scaleMovement(x, y); break; } return transform; }, translateMovement: function translateMovement(x, y) { return "translate3d(".concat(-x, "px, ").concat(-y, "px, 0)"); }, rotateMovement: function rotateMovement(x, y) { var movement; if (!this.axis) { movement = x + y; } else if (this.axis === 'x') { movement = 2 * x; } else if (this.axis === 'y') { movement = 2 * y; } return "rotate3d(0,0,1,".concat(movement, "deg)"); }, depthMovement: function depthMovement(x, y, s) { return "rotateX(".concat(-y, "deg) rotateY(").concat(x, "deg) translate3d(0,0,").concat(s * 2, "px)"); }, scaleMovement: function scaleMovement(x, y) { var type = this.type; var movement = Math.sign(this.strength) * (Math.abs(x) + Math.abs(y)) / 10 + 1; return "scale3d(".concat(type === 'scaleX' || type === 'scale' ? movement : 1, ",\n ").concat(type === 'scaleY' || type === 'scale' ? movement : 1, ",\n 1)"); } } };function cyclicMovement (cycleData) { var referencePosition = cycleData.referencePosition, shape = cycleData.shape, event = cycleData.event, cycles = cycleData.cycles, strength = cycleData.strength; var spanningRangeX = event === 'scroll' ? window.innerWidth : shape.width; var spanningRangeY = event === 'scroll' ? window.innerHeight : shape.height; var radialPositionX = (referencePosition.x - shape.left) * (Math.PI * 2) / spanningRangeX; var radialPositionY = (referencePosition.y - shape.top) * (Math.PI * 2) / spanningRangeY; var cycleX = spanningRangeX * Math.sin(radialPositionX * cycles); var cycleY = spanningRangeY * Math.sin(radialPositionY * cycles); return getCoordinates(cycleX * strength / (spanningRangeX / 2), cycleY * strength / (spanningRangeY / 2)); }var script$3 = { name: 'KinesisElement', mixins: [transformMixin], props: { tag: { type: String, default: 'div' }, type: { type: String, default: 'translate' // translate, rotate, scale, scaleX, scaleY, depth, depth_inv, custom }, transformOrigin: { type: String, default: 'center' }, originX: { type: Number, default: 50 }, originY: { type: Number, default: 50 }, strength: { type: Number, default: 10 }, axis: { type: String, default: null }, maxX: { type: Number, default: null }, maxY: { type: Number, default: null }, minX: { type: Number, default: null }, minY: { type: Number, default: null }, cycle: { type: Number, default: 0 } }, inject: ['context'], computed: { transform: function transform() { return this.transformCalculation(); }, transformParameters: function transformParameters() { return { transitionProperty: 'transform', transitionDuration: this.transitionDuration, transformOrigin: this.transformOrigin, transitionTimingFunction: this.transitionTimingFunction }; }, transitionDuration: function transitionDuration() { var duration = this.context.duration; return "".concat(duration, "ms"); }, transitionTimingFunction: function transitionTimingFunction() { return this.context.easing; } }, methods: { transformCalculation: function transformCalculation() { var context = this.context; if (!context.shape || !context.isMoving && context.event === 'move') return {}; var movementX; var movementY; var _ref = this.cycle < 1 ? elementMovement(_objectSpread2(_objectSpread2({}, context.movement), {}, { originX: this.originX, originY: this.originY, strength: this.strengthManager(), event: context.event, minX: this.minX, minY: this.minY, maxX: this.maxX, maxY: this.maxY })) : cyclicMovement({ referencePosition: context.event === 'scroll' ? { x: 0, y: 0 } : context.eventData, shape: context.shape, event: context.event, cycles: this.cycle, strength: this.strengthManager() }), x = _ref.x, y = _ref.y; if (context.event !== 'scroll') { movementX = this.axis === 'y' ? 0 : x; movementY = this.axis === 'x' ? 0 : y; } else if (context.event === 'scroll') { movementX = this.axis === 'x' ? y : 0; movementY = this.axis === 'y' || !this.axis ? y : 0; } else if (this.cycle > 0) { movementX = this.axis === 'x' ? x : 0; movementY = this.axis === 'y' ? y : 0; } return { transform: this.transformSwitch(this.type, movementX, movementY, this.strength) }; }, strengthManager: function strengthManager() { return this.type === 'depth' || this.type === 'depth_inv' ? Math.abs(this.strength) : this.strength; } }, render: function render(createElement) { var context = this; return createElement(context.tag, { style: _objectSpread2(_objectSpread2({}, context.transform), context.transformParameters) }, context.$slots.default); } };/* script */ var __vue_script__$3 = script$3; /* template */ /* style */ var __vue_inject_styles__$3 = undefined; /* scoped */ var __vue_scope_id__$3 = undefined; /* module identifier */ var __vue_module_identifier__$3 = "data-v-2ae8e75a"; /* functional template */ var __vue_is_functional_template__$3 = undefined; /* style inject */ /* style inject SSR */ /* style inject shadow dom */ var __vue_component__$3 = /*#__PURE__*/normalizeComponent({}, __vue_inject_styles__$3, __vue_script__$3, __vue_scope_id__$3, __vue_is_functional_template__$3, __vue_module_identifier__$3, false, undefined, undefined, undefined);var motionMixin = { props: { type: { type: String, default: 'translate' // translate, rotate, scale, scaleX, scaleY, depth, depth_inv, custom }, transformOrigin: { type: String, default: 'center' }, originX: { type: Number, default: 50 }, originY: { type: Number, default: 50 }, strength: { type: Number, default: 10 }, audioIndex: { type: Number, default: 50 }, axis: { type: String, default: null }, maxX: { type: Number, default: null }, maxY: { type: Number, default: null }, minX: { type: Number, default: null }, minY: { type: Number, default: null }, cycle: { type: Number, default: 0 } }, methods: { strengthManager: function strengthManager() { return this.type === 'depth' || this.type === 'depth_inv' ? Math.abs(this.strength) : this.strength; } } };// var script$2 = { name: 'KinesisAudio', inject: ['context'], mixins: [motionMixin], props: { tag: { type: String, default: 'div' }, audioIndex: { type: Number, default: 50 } }, computed: { transform: function transform() { return this.transformAudio(); }, transformParameters: function transformParameters() { return { transitionProperty: 'transform', transitionDuration: this.transitionDuration, transformOrigin: this.transformOrigin, transitionTimingFunction: this.transitionTimingFunction }; }, transitionDuration: function transitionDuration() { var duration = this.context.duration; return "".concat(duration, "ms"); }, transitionTimingFunction: function transitionTimingFunction() { return this.context.easing; } }, methods: { transformAudio: function transformAudio() { var audioData = this.context.audioData; if (!audioData) return; var transformType = this.type; var strength = this.strength; var amplitude; var transform; // eslint-disable-next-line default-case switch (transformType) { case 'translate': amplitude = audioData ? audioData[0][this.audioIndex] : 0; transform = "translate3d(".concat(amplitude * strength, "px, 0, 0)"); break; case 'rotate': amplitude = audioData ? audioData[0][this.audioIndex] : 0; transform = "rotate3d(0,0,1,".concat(amplitude * strength / 10, "deg)"); break; case 'scale': // eslint-disable-next-line no-nested-ternary amplitude = audioData ? audioData[0][this.audioIndex] / strength < 1 ? 1 : audioData[0][this.audioIndex] / (strength * 2) : 1; transform = "scale(".concat(amplitude, ")"); break; } // eslint-disable-next-line consistent-return return { transform: transform }; } } };/* script */ var __vue_script__$2 = script$2; /* template */ var __vue_render__$2 = function __vue_render__() { var _vm = this; var _h = _vm.$createElement; var _c = _vm._self._c || _h; return _c(_vm.tag, { tag: "component", style: Object.assign({}, _vm.transform, _vm.transformParameters) }, [_vm._t("default")], 2); }; var __vue_staticRenderFns__$2 = []; /* style */ var __vue_inject_styles__$2 = undefined; /* scoped */ var __vue_scope_id__$2 = undefined; /* module identifier */ var __vue_module_identifier__$2 = "data-v-32d1a292"; /* functional template */ var __vue_is_functional_template__$2 = false; /* style inject */ /* style inject SSR */ /* style inject shadow dom */ var __vue_component__$2 = /*#__PURE__*/normalizeComponent({ render: __vue_render__$2, staticRenderFns: __vue_staticRenderFns__$2 }, __vue_inject_styles__$2, __vue_script__$2, __vue_scope_id__$2, __vue_is_functional_template__$2, __vue_module_identifier__$2, false, undefined, undefined, undefined);var baseMixin = { props: { active: { type: Boolean, default: true }, duration: { type: Number, default: 1000 }, easing: { type: String, default: 'cubic-bezier(0.23, 1, 0.32, 1)' }, tag: { type: String, default: 'div' } } };var perspectiveMixin = { props: { perspective: { type: Number, default: 1000 } }, computed: { style: function style() { return { perspective: "".concat(this.perspective, "px") }; } } };// var script$1 = { name: 'KinesisScroll', mixins: [baseMixin, perspectiveMixin, motionMixin, transformMixin], data: function data() { return { transform: {} }; }, computed: { transformParameters: function transformParameters() { return { transitionProperty: 'transform', transitionDuration: this.transitionDuration, transformOrigin: this.transformOrigin, transitionTimingFunction: this.easing }; }, transitionDuration: function transitionDuration() { return "".concat(this.duration, "ms"); } }, mounted: function mounted() { window.addEventListener('scroll', this.handleScroll, { passive: true }); }, beforeDestroy: function beforeDestroy() { window.removeEventListener('scroll', this.handleScroll, { passive: true }); }, methods: { getCycleMovement: function getCycleMovement(xPos, yPos, width, height, shape) { var x = (xPos - shape.left) * (Math.PI * 2) / width; var y = (yPos - shape.top) * (Math.PI * 2) / height; this.cycleMovement = { x: x, y: y, width: width, height: height }; }, handleScroll: throttle( // eslint-disable-next-line func-names function () { if (!this.active) return; var shape = this.$el.getBoundingClientRect(); var isInViewport = inViewport(shape); if (isInViewport && !!shape.height) { this.transformBehavior(shape); } }, 19, 'scroll'), transformBehavior: function transformBehavior(shape) { var movementX; var movementY; var scrollPosition = (shape.top - window.innerHeight) / (shape.height + window.innerHeight); if (this.cycle <= 0) { var scrollMovement = scrollPosition * this.strength; movementX = this.axis === 'x' ? scrollMovement : 0; movementY = this.axis === 'y' || !this.axis ? scrollMovement : 0; if (this.maxX) { movementX = Math.min(movementX, this.maxX); } if (this.minX) { movementX = Math.max(movementX, this.minX); } if (this.maxY) { movementY = Math.min(movementY, this.maxY); } if (this.minY) { movementY = Math.max(movementY, this.minY); } } else if (this.cycle > 0) { var _this$getCycleMovemen = this.getCycleMovement(0, 0, window.innerWidth, window.innerHeight, shape), x = _this$getCycleMovemen.x, y = _this$getCycleMovemen.y, width = _this$getCycleMovemen.width, height = _this$getCycleMovemen.height; var cycleX = width * Math.sin(x * this.cycle); var cycleY = height * Math.sin(y * this.cycle); movementX = this.axis === 'x' ? cycleX / (width / 2) * this.strength : 0; movementY = this.axis === 'y' || !this.axis ? cycleY / (height / 2) * this.strength : 0; } var transformType = this.type; transformType = transformType === 'scaleX' || transformType === 'scaleY' ? 'scale' : transformType; var transform = this.transformSwitch(transformType, movementX, movementY, this.strength); this.transform = { transform: transform }; } } };/* script */ var __vue_script__$1 = script$1; /* template */ var __vue_render__$1 = function __vue_render__() { var _vm = this; var _h = _vm.$createElement; var _c = _vm._self._c || _h; return _c(_vm.tag, { tag: "component", style: Object.assign({}, _vm.transform, _vm.transformParameters) }, [_vm._t("default")], 2); }; var __vue_staticRenderFns__$1 = []; /* style */ var __vue_inject_styles__$1 = undefined; /* scoped */ var __vue_scope_id__$1 = undefined; /* module identifier */ var __vue_module_identifier__$1 = "data-v-0296bb3c"; /* functional template */ var __vue_is_functional_template__$1 = false; /* style inject */ /* style inject SSR */ /* style inject shadow dom */ var __vue_component__$1 = /*#__PURE__*/normalizeComponent({ render: __vue_render__$1, staticRenderFns: __vue_staticRenderFns__$1 }, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, false, undefined, undefined, undefined);// var script = { name: 'KinesisDistance', props: { tag: { type: String, default: 'div' }, type: { type: String, default: 'translate' // translate, rotate, scale, scaleX, scaleY, depth, custom }, transformOrigin: { type: String, default: 'center' }, originX: { type: Number, default: 50 }, originY: { type: Number, default: 50 }, strength: { type: Number, default: 10 }, axis: { type: String, default: null }, maxX: { type: Number, default: null }, maxY: { type: Number, default: null }, minX: { type: Number, default: null }, minY: { type: Number, default: null }, distance: { type: Number, default: 100 }, cycle: { type: Number, default: 0 }, active: { type: Boolean, default: true }, duration: { type: Number, default: 1001 }, easing: { type: String, default: 'cubic-bezier(0.23, 1, 0.32, 1)' }, perspective: { type: Number, default: 1000 } }, data: function data() { return { pointer: { x: 0, y: 0 }, transform: {}, component: 'kidistance', throttle: 500 }; }, computed: { style: function style() { return { perspective: "".concat(this.perspective, "px") }; }, transformParameters: function transformParameters() { return { position: 'relative', transitionProperty: 'transform', transitionDuration: this.transitionDuration, transformOrigin: this.transformOrigin, transitionTimingFunction: this.easing }; }, transitionDuration: function transitionDuration() { return "".concat(this.duration, "ms"); } }, mounted: function mounted() { window.addEventListener('scroll', this.handleMovement); }, beforeDestroy: function beforeDestroy() { window.removeEventListener('scroll', this.handleMovement); }, methods: { getCoordinates: function getCoordinates(x, y) { var shape = this.$el.getBoundingClientRect(); return { x: x + shape.left, y: y + shape.top }; }, getDistance: function getDistance(x1, x2, y1, y2) { return Math.floor(Math.hypot(x2 - x1, y2 - y1)); }, // eslint-disable-next-line func-names handleMovement: throttle(function (event) { window.addEventListener('mousemove', this.handleMovement); var pointer = this.pointer; pointer.x = event.clientX; pointer.y = event.clientY; this.transformBehavior(); }, 50), transformBehavior: function transformBehavior() { var shape = this.$el.getBoundingClientRect(); var center = this.getCoordinates(shape.width / 2, shape.height / 2); var distance = this.getDistance(this.pointer.x, center.x, this.pointer.y, center.y); if (distance > this.distance) { this.transform = {}; this.throttle = 500; return; } this.throttle = 50; var transform = "scale(".concat(distance / this.distance, ")"); // Add radius from which the transfrom will start this.transform = { transform: transform }; }, scaleMovement: function scaleMovement(x, y) { var type = this.type; var movement = Math.sign(this.strength) * (Math.abs(x) + Math.abs(y)) / 10 + 1; return "scale3d(".concat(type === 'scaleX' || type === 'scale' ? movement : 1, ",\n ").concat(type === 'scaleY' || type === 'scale' ? movement : 1, ",\n 1)"); } } };/* script */ var __vue_script__ = script; /* template */ var __vue_render__ = function __vue_render__() { var _vm = this; var _h = _vm.$createElement; var _c = _vm._self._c || _h; return _c(_vm.tag, { tag: "component", style: Object.assign({}, _vm.transform, _vm.transformParameters) }, [_vm._t("default")], 2); }; var __vue_staticRenderFns__ = []; /* style */ var __vue_inject_styles__ = undefined; /* scoped */ var __vue_scope_id__ = undefined; /* module identifier */ var __vue_module_identifier__ = "data-v-97bf617a"; /* functional template */ var __vue_is_functional_template__ = false; /* style inject */ /* style inject SSR */ /* style inject shadow dom */ var __vue_component__ = /*#__PURE__*/normalizeComponent({ render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ }, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, false, undefined, undefined, undefined);var Plugin$1 = { install: function install(vue) { vue.component(__vue_component__$2.name, __vue_component__$2); vue.component(__vue_component__$4.name, __vue_component__$4); vue.component(__vue_component__.name, __vue_component__); vue.component(__vue_component__$3.name, __vue_component__$3); vue.component(__vue_component__$1.name, __vue_component__$1); } }; var GlobalVue$1 = null; if (typeof window !== 'undefined') { GlobalVue$1 = window.vue; } else if (typeof global !== 'undefined') { GlobalVue$1 = global.vue; } if (GlobalVue$1) { GlobalVue$1.use(Plugin$1); }var components=/*#__PURE__*/Object.freeze({__proto__:null,'default': Plugin$1,KinesisAudio: __vue_component__$2,KinesisContainer: __vue_component__$4,KinesisDistance: __vue_component__,KinesisElement: __vue_component__$3,KinesisScroll: __vue_component__$1});/* eslint-disable */ var install = function install(vue) { if (install.installed) { return; } install.installed = true; for (var name in components) { vue.use(components[name]); } vue.component('kinesis-container', __vue_component__$4); vue.component('kinesis-element', __vue_component__$3); vue.component('kinesis-audio', __vue_component__$2); vue.component('kinesis-scroll', __vue_component__$1); vue.component('kinesis-distance', __vue_component__); }; var Plugin = { install: install }; var GlobalVue = null; if (typeof window !== 'undefined') { GlobalVue = window.vue; } else if (typeof global !== 'undefined') { GlobalVue = global.vue; } if (GlobalVue) { GlobalVue.use(Plugin); }exports.KinesisAudio=__vue_component__$2;exports.KinesisContainer=__vue_component__$4;exports.KinesisDistance=__vue_component__;exports.KinesisElement=__vue_component__$3;exports.KinesisScroll=__vue_component__$1;exports.default=Plugin;