UNPKG

21.1 kBJavaScriptView Raw
1/*!
2 * vue2-transitions v0.3.0
3 * (c) 2019-present cristij <joracristi@gmail.com>
4 * Released under the MIT License.
5 */
6var baseTransition = {
7 inheritAttrs: false,
8 props: {
9 /**
10 * Transition duration. Number for specifying the same duration for enter/leave transitions
11 * Object style {enter: 300, leave: 300} for specifying explicit durations for enter/leave
12 */
13 duration: {
14 type: [Number, Object],
15 default: 300
16 },
17 /**
18 * Transition delay. Number for specifying the same delay for enter/leave transitions
19 * Object style {enter: 300, leave: 300} for specifying explicit durations for enter/leave
20 */
21 delay: {
22 type: [Number, Object],
23 default: 0
24 },
25 /**
26 * Whether the component should be a `transition-group` component.
27 */
28 group: Boolean,
29 /**
30 * Transition tag, in case the component is a `transition-group`
31 */
32 tag: {
33 type: String,
34 default: 'span'
35 },
36 /**
37 * Transform origin property https://tympanus.net/codrops/css_reference/transform-origin/.
38 * Can be specified with styles as well but it's shorter with this prop
39 */
40 origin: {
41 type: String,
42 default: ''
43 },
44 /**
45 * Element styles that are applied during transition. These styles are applied on @beforeEnter and @beforeLeave hooks
46 */
47 styles: {
48 type: Object,
49 default: function () {
50 return {
51 animationFillMode: 'both',
52 animationTimingFunction: 'ease-out'
53 };
54 }
55 }
56 },
57 computed: {
58 componentType: function componentType() {
59 return this.group ? 'transition-group' : 'transition';
60 },
61 hooks: function hooks() {
62 return Object.assign({
63 beforeEnter: this.beforeEnter,
64 afterEnter: this.cleanUpStyles,
65 beforeLeave: this.beforeLeave,
66 leave: this.leave,
67 afterLeave: this.cleanUpStyles
68 }, this.$listeners);
69 }
70 },
71 methods: {
72 beforeEnter: function beforeEnter(el) {
73 var enterDuration = this.duration.enter ? this.duration.enter : this.duration;
74 el.style.animationDuration = enterDuration + "ms";
75
76 var enterDelay = this.delay.enter ? this.delay.enter : this.delay;
77 el.style.animationDelay = enterDelay + "ms";
78
79 this.setStyles(el);
80 },
81 cleanUpStyles: function cleanUpStyles(el) {
82 var this$1 = this;
83
84 Object.keys(this.styles).forEach(function (key) {
85 var styleValue = this$1.styles[key];
86 if (styleValue) {
87 el.style[key] = '';
88 }
89 });
90 el.style.animationDuration = '';
91 el.style.animationDelay = '';
92 },
93 beforeLeave: function beforeLeave(el) {
94 var leaveDuration = this.duration.leave ? this.duration.leave : this.duration;
95 el.style.animationDuration = leaveDuration + "ms";
96
97 var leaveDelay = this.delay.leave ? this.delay.leave : this.delay;
98 el.style.animationDelay = leaveDelay + "ms";
99
100 this.setStyles(el);
101 },
102 leave: function leave(el) {
103 this.setAbsolutePosition(el);
104 },
105 setStyles: function setStyles(el) {
106 var this$1 = this;
107
108 this.setTransformOrigin(el);
109 Object.keys(this.styles).forEach(function (key) {
110 var styleValue = this$1.styles[key];
111 if (styleValue) {
112 el.style[key] = styleValue;
113 }
114 });
115 },
116 setAbsolutePosition: function setAbsolutePosition(el) {
117 if (this.group) {
118 el.style.position = 'absolute';
119 }
120 return this;
121 },
122 setTransformOrigin: function setTransformOrigin(el) {
123 if (this.origin) {
124 el.style.transformOrigin = this.origin;
125 }
126 return this;
127 }
128 }
129};
130
131(function () {
132 if (typeof document !== 'undefined') {
133 var head = document.head || document.getElementsByTagName('head')[0],
134 style = document.createElement('style'),
135 css = " @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .fadeIn { animation-name: fadeIn; } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } .fadeOut { animation-name: fadeOut; } .fade-move { transition: transform .3s ease-out; } ";style.type = 'text/css';if (style.styleSheet) {
136 style.styleSheet.cssText = css;
137 } else {
138 style.appendChild(document.createTextNode(css));
139 }head.appendChild(style);
140 }
141})();
142
143var FadeTransition = { render: function () {
144 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "fadeIn", "move-class": "fade-move", "leave-active-class": "fadeOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
145 }, staticRenderFns: [],
146 name: 'fade-transition',
147 mixins: [baseTransition]
148};
149
150(function () {
151 if (typeof document !== 'undefined') {
152 var head = document.head || document.getElementsByTagName('head')[0],
153 style = document.createElement('style'),
154 css = ".zoom-move { transition: transform .3s ease-out; } @keyframes zoomIn { from { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } 50% { opacity: 1; } } .zoomIn { animation-name: zoomIn; } @keyframes zoomOut { from { opacity: 1; } 50% { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } to { opacity: 0; } } .zoomOut { animation-name: zoomOut; } ";style.type = 'text/css';if (style.styleSheet) {
155 style.styleSheet.cssText = css;
156 } else {
157 style.appendChild(document.createTextNode(css));
158 }head.appendChild(style);
159 }
160})();
161
162var ZoomCenterTransition = { render: function () {
163 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "zoomIn", "move-class": "zoom-move", "leave-active-class": "zoomOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
164 }, staticRenderFns: [],
165 name: 'zoom-center-transition',
166 mixins: [baseTransition]
167};
168
169(function () {
170 if (typeof document !== 'undefined') {
171 var head = document.head || document.getElementsByTagName('head')[0],
172 style = document.createElement('style'),
173 css = ".zoom-move { transition: transform .3s ease-out; } @keyframes zoomInX { from { opacity: 0; transform: scaleX(0); } 50% { opacity: 1; } } .zoomInX { animation-name: zoomInX; } @keyframes zoomOutX { from { opacity: 1; } 50% { opacity: 0; transform: scaleX(0); } to { opacity: 0; } } .zoomOutX { animation-name: zoomOutX; } ";style.type = 'text/css';if (style.styleSheet) {
174 style.styleSheet.cssText = css;
175 } else {
176 style.appendChild(document.createTextNode(css));
177 }head.appendChild(style);
178 }
179})();
180
181var ZoomXTransition = { render: function () {
182 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "zoomInX", "move-class": "zoom-move", "leave-active-class": "zoomOutX" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
183 }, staticRenderFns: [],
184 name: 'zoom-x-transition',
185 props: {
186 styles: {
187 type: Object,
188 default: function () {
189 return {
190 animationFillMode: 'both',
191 animationTimingFunction: 'cubic-bezier(.55,0,.1,1)'
192 };
193 }
194 }
195 },
196 mixins: [baseTransition]
197};
198
199(function () {
200 if (typeof document !== 'undefined') {
201 var head = document.head || document.getElementsByTagName('head')[0],
202 style = document.createElement('style'),
203 css = ".zoom-move { transition: transform .3s ease-out; } @keyframes zoomInY { from { opacity: 0; transform: scaleY(0); } 50% { opacity: 1; tranform: scaleY(1); } } .zoomInY { animation-name: zoomInY; } @keyframes zoomOutY { from { opacity: 1; } 50% { opacity: 0; transform: scaleY(0); } to { opacity: 0; } } .zoomOutY { animation-name: zoomOutY; } ";style.type = 'text/css';if (style.styleSheet) {
204 style.styleSheet.cssText = css;
205 } else {
206 style.appendChild(document.createTextNode(css));
207 }head.appendChild(style);
208 }
209})();
210
211var ZoomYTransition = { render: function () {
212 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "zoomInY", "move-class": "zoom-move", "leave-active-class": "zoomOutY" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
213 }, staticRenderFns: [],
214 name: 'zoom-y-transition',
215 mixins: [baseTransition],
216 props: {
217 styles: {
218 type: Object,
219 default: function () {
220 return {
221 animationFillMode: 'both',
222 animationTimingFunction: 'cubic-bezier(.55,0,.1,1)'
223 };
224 }
225 }
226 }
227};
228
229(function () {
230 if (typeof document !== 'undefined') {
231 var head = document.head || document.getElementsByTagName('head')[0],
232 style = document.createElement('style'),
233 css = " .collapse-move { transition: transform .3s ease-in-out; } ";style.type = 'text/css';if (style.styleSheet) {
234 style.styleSheet.cssText = css;
235 } else {
236 style.appendChild(document.createTextNode(css));
237 }head.appendChild(style);
238 }
239})();
240
241var CollapseTransition = { render: function () {
242 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "move-class": "collapse-move" }, on: { "before-enter": _vm.beforeEnter, "after-enter": _vm.afterEnter, "enter": _vm.enter, "before-leave": _vm.beforeLeave, "leave": _vm.leave, "after-leave": _vm.afterLeave } }, 'component', _vm.$attrs, false), _vm.$listeners), [_vm._t("default")], 2);
243 }, staticRenderFns: [],
244 name: 'collapse-transition',
245 mixins: [baseTransition],
246 methods: {
247 transitionStyle: function transitionStyle(duration) {
248 if ( duration === void 0 ) duration = 300;
249
250 var durationInSeconds = duration / 1000;
251 var style = durationInSeconds + "s height ease-in-out, " + durationInSeconds + "s padding-top ease-in-out, " + durationInSeconds + "s padding-bottom ease-in-out";
252 return style;
253 },
254 beforeEnter: function beforeEnter(el) {
255 var enterDuration = this.duration.enter ? this.duration.enter : this.duration;
256 el.style.transition = this.transitionStyle(enterDuration);
257 if (!el.dataset) { el.dataset = {}; }
258
259 el.dataset.oldPaddingTop = el.style.paddingTop;
260 el.dataset.oldPaddingBottom = el.style.paddingBottom;
261
262 el.style.height = '0';
263 el.style.paddingTop = 0;
264 el.style.paddingBottom = 0;
265 this.setStyles(el);
266 },
267
268 enter: function enter(el) {
269 el.dataset.oldOverflow = el.style.overflow;
270 if (el.scrollHeight !== 0) {
271 el.style.height = el.scrollHeight + 'px';
272 el.style.paddingTop = el.dataset.oldPaddingTop;
273 el.style.paddingBottom = el.dataset.oldPaddingBottom;
274 } else {
275 el.style.height = '';
276 el.style.paddingTop = el.dataset.oldPaddingTop;
277 el.style.paddingBottom = el.dataset.oldPaddingBottom;
278 }
279
280 el.style.overflow = 'hidden';
281 },
282
283 afterEnter: function afterEnter(el) {
284 // for safari: remove class then reset height is necessary
285 el.style.transition = '';
286 el.style.height = '';
287 el.style.overflow = el.dataset.oldOverflow;
288 },
289
290 beforeLeave: function beforeLeave(el) {
291 if (!el.dataset) { el.dataset = {}; }
292 el.dataset.oldPaddingTop = el.style.paddingTop;
293 el.dataset.oldPaddingBottom = el.style.paddingBottom;
294 el.dataset.oldOverflow = el.style.overflow;
295
296 el.style.height = el.scrollHeight + 'px';
297 el.style.overflow = 'hidden';
298 this.setStyles(el);
299 },
300
301 leave: function leave(el) {
302 var leaveDuration = this.duration.leave ? this.duration.leave : this.duration;
303 if (el.scrollHeight !== 0) {
304 // for safari: add class after set height, or it will jump to zero height suddenly, weired
305 el.style.transition = this.transitionStyle(leaveDuration);
306 el.style.height = 0;
307 el.style.paddingTop = 0;
308 el.style.paddingBottom = 0;
309 }
310 // necessary for transition-group
311 this.setAbsolutePosition(el);
312 },
313
314 afterLeave: function afterLeave(el) {
315 el.style.transition = '';
316 el.style.height = '';
317 el.style.overflow = el.dataset.oldOverflow;
318 el.style.paddingTop = el.dataset.oldPaddingTop;
319 el.style.paddingBottom = el.dataset.oldPaddingBottom;
320 }
321 }
322};
323
324(function () {
325 if (typeof document !== 'undefined') {
326 var head = document.head || document.getElementsByTagName('head')[0],
327 style = document.createElement('style'),
328 css = " @keyframes scaleIn { from { opacity: 0; transform: scale(0) } to { opacity: 1; } } .scaleIn { animation-name: scaleIn; } @keyframes scaleOut { from { opacity: 1; } to { opacity: 0; transform: scale(0); } } .scaleOut { animation-name: scaleOut; } .scale-move { transition: transform .3s cubic-bezier(.25, .8, .50, 1); } ";style.type = 'text/css';if (style.styleSheet) {
329 style.styleSheet.cssText = css;
330 } else {
331 style.appendChild(document.createTextNode(css));
332 }head.appendChild(style);
333 }
334})();
335
336var ScaleTransition = { render: function () {
337 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "scaleIn", "move-class": "scale-move", "leave-active-class": "scaleOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
338 }, staticRenderFns: [],
339 name: 'scale-transition',
340 mixins: [baseTransition],
341 props: {
342 origin: {
343 type: String,
344 default: 'top left'
345 },
346 styles: {
347 type: Object,
348 default: function () {
349 return {
350 animationFillMode: 'both',
351 animationTimingFunction: 'cubic-bezier(.25,.8,.50,1)'
352 };
353 }
354 }
355 }
356};
357
358(function () {
359 if (typeof document !== 'undefined') {
360 var head = document.head || document.getElementsByTagName('head')[0],
361 style = document.createElement('style'),
362 css = ".slide-move { transition: transform .3s; } @keyframes slideYIn { from { opacity: 0; transform: translateY(-15px); } to { opacity: 1; } } .slideYIn { animation-name: slideYIn; } @keyframes slideYOut { from { opacity: 1; } to { opacity: 0; transform: translateY(-15px); } } .slideYOut { animation-name: slideYOut; } ";style.type = 'text/css';if (style.styleSheet) {
363 style.styleSheet.cssText = css;
364 } else {
365 style.appendChild(document.createTextNode(css));
366 }head.appendChild(style);
367 }
368})();
369
370var SlideYUpTransition = { render: function () {
371 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "type": "animation", "enter-active-class": "slideYIn", "move-class": "slide-move", "leave-active-class": "slideYOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
372 }, staticRenderFns: [],
373 name: 'slide-y-up-transition',
374 mixins: [baseTransition],
375 props: {
376 styles: {
377 type: Object,
378 default: function () {
379 return {
380 animationFillMode: 'both',
381 animationTimingFunction: 'cubic-bezier(.25,.8,.50,1)'
382 };
383 }
384 }
385 }
386};
387
388(function () {
389 if (typeof document !== 'undefined') {
390 var head = document.head || document.getElementsByTagName('head')[0],
391 style = document.createElement('style'),
392 css = ".slide-move { transition: transform .3s; } @keyframes slideYDownIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; } } .slideYDownIn { animation-name: slideYDownIn; } @keyframes slideYDownOut { from { opacity: 1; } to { opacity: 0; transform: translateY(15px); } } .slideYDownOut { animation-name: slideYDownOut; } ";style.type = 'text/css';if (style.styleSheet) {
393 style.styleSheet.cssText = css;
394 } else {
395 style.appendChild(document.createTextNode(css));
396 }head.appendChild(style);
397 }
398})();
399
400var SlideYDownTransition = { render: function () {
401 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "slideYDownIn", "leave-active-class": "slideYDownOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
402 }, staticRenderFns: [],
403 name: 'slide-y-down-transition',
404 mixins: [baseTransition],
405 props: {
406 styles: {
407 type: Object,
408 default: function () {
409 return {
410 animationFillMode: 'both',
411 animationTimingFunction: 'cubic-bezier(.25,.8,.50,1)'
412 };
413 }
414 }
415 }
416};
417
418(function () {
419 if (typeof document !== 'undefined') {
420 var head = document.head || document.getElementsByTagName('head')[0],
421 style = document.createElement('style'),
422 css = ".slide-move { transition: transform .3s; } @keyframes slideXLeftIn { from { opacity: 0; transform: translateX(-15px); } to { opacity: 1; } } .slideXLeftIn { animation-name: slideXLeftIn; } @keyframes slideXLeftOut { from { opacity: 1; } to { opacity: 0; transform: translateX(-15px); } } .slideXLeftOut { animation-name: slideXLeftOut; } ";style.type = 'text/css';if (style.styleSheet) {
423 style.styleSheet.cssText = css;
424 } else {
425 style.appendChild(document.createTextNode(css));
426 }head.appendChild(style);
427 }
428})();
429
430var SlideXLeftTransition = { render: function () {
431 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "slideXLeftIn", "move-class": "slide-move", "leave-active-class": "slideXLeftOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
432 }, staticRenderFns: [],
433 name: 'slide-x-left-transition',
434 mixins: [baseTransition],
435 props: {
436 styles: {
437 type: Object,
438 default: function () {
439 return {
440 animationFillMode: 'both',
441 animationTimingFunction: 'cubic-bezier(.25,.8,.50,1)'
442 };
443 }
444 }
445 }
446};
447
448(function () {
449 if (typeof document !== 'undefined') {
450 var head = document.head || document.getElementsByTagName('head')[0],
451 style = document.createElement('style'),
452 css = ".slide-move { transition: transform .3s; } @keyframes slideXRightIn { from { opacity: 0; transform: translateX(15px); } to { opacity: 1; } } .slideXRightIn { animation-name: slideXRightIn; } @keyframes slideXRightOut { from { opacity: 1; } to { opacity: 0; transform: translateX(15px); } } .slideXRightOut { animation-name: slideXRightOut; } ";style.type = 'text/css';if (style.styleSheet) {
453 style.styleSheet.cssText = css;
454 } else {
455 style.appendChild(document.createTextNode(css));
456 }head.appendChild(style);
457 }
458})();
459
460var SlideXRightTransition = { render: function () {
461 var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c(_vm.componentType, _vm._g(_vm._b({ tag: "component", attrs: { "tag": _vm.tag, "enter-active-class": "slideXRightIn", "move-class": "slide-move", "leave-active-class": "slideXRightOut" } }, 'component', _vm.$attrs, false), _vm.hooks), [_vm._t("default")], 2);
462 }, staticRenderFns: [],
463 name: 'slide-x-right-transition',
464 mixins: [baseTransition],
465 props: {
466 styles: {
467 type: Object,
468 default: function () {
469 return {
470 animationFillMode: 'both',
471 animationTimingFunction: 'cubic-bezier(.25,.8,.50,1)'
472 };
473 }
474 }
475 }
476};
477
478var components = {};
479components[FadeTransition.name] = FadeTransition;
480components[ZoomCenterTransition.name] = ZoomCenterTransition;
481components[ZoomXTransition.name] = ZoomXTransition;
482components[ZoomYTransition.name] = ZoomYTransition;
483components[CollapseTransition.name] = CollapseTransition;
484components[ScaleTransition.name] = ScaleTransition;
485components[SlideYUpTransition.name] = SlideYUpTransition;
486components[SlideYDownTransition.name] = SlideYDownTransition;
487components[SlideXLeftTransition.name] = SlideXLeftTransition;
488components[SlideXRightTransition.name] = SlideXRightTransition;
489
490function install(Vue, options) {
491 if (options && options.components) {
492 options.components.forEach(function (c) { return Vue.component(c.name, components[c.name]); });
493 } else {
494 Object.keys(components).forEach(function (key) {
495 Vue.component(key, components[key]);
496 });
497 }
498}
499
500// Automatic installation if Vue has been added to the global scope.
501if (typeof window !== 'undefined' && window.Vue) {
502 window.Vue.use({ install: install });
503}
504
505var index = {
506 install: install
507};
508
509export { FadeTransition, ZoomCenterTransition, ZoomXTransition, ZoomYTransition, CollapseTransition, ScaleTransition, SlideYUpTransition, SlideYDownTransition, SlideXLeftTransition, SlideXRightTransition };
510export default index;