Fixed #4610 - New animate directive

pull/4572/head
Tuğçe Küçükoğlu 2023-10-13 13:28:30 +03:00
parent 75f27ab98b
commit 6dc9babdc9
7 changed files with 150 additions and 0 deletions

71
components/lib/animate/Animate.d.ts vendored Normal file
View File

@ -0,0 +1,71 @@
/**
*
* Animate manages PrimeFlex CSS classes declaratively to during enter/leave animations on scroll or on page load.
*
* [Live Demo](https://primevue.org/animate)
*
* @module animate
*/
import { DirectiveBinding, ObjectDirective } from 'vue';
import { DirectiveHooks } from '../basedirective/BaseDirective';
import { PassThroughOptions } from '../passthrough';
import { PassThrough } from '../ts-helpers';
/**
* Defines options of Animate.
*/
export interface AnimateOptions {
/**
* Animate scroll to add when item begins to get displayed.
*/
enterClass?: string | undefined;
/**
* Animate scroll to add when item begins to get hidden.
*/
leaveClass?: string | undefined;
/**
* Used to pass attributes to DOM elements inside the component.
* @type {AnimateDirectivePassThroughOptions}
*/
pt?: PassThrough<AnimateDirectivePassThroughOptions>;
/**
* Used to configure passthrough(pt) options of the component.
* @type {PassThroughOptions}
*/
ptOptions?: PassThroughOptions;
}
/**
* Custom passthrough(pt) directive options.
*/
export interface AnimateDirectivePassThroughOptions {
/**
* Used to manage all lifecycle hooks
* @see {@link BaseDirective.DirectiveHooks}
*/
hooks?: DirectiveHooks;
}
/**
* Binding of Animate directive.
*/
export interface AnimateDirectiveBinding extends Omit<DirectiveBinding, 'modifiers' | 'value'> {
/**
* Value of the Animate.
*/
value?: AnimateOptions | undefined;
}
/**
* **PrimeVue - Animate**
*
* _Animate manages PrimeFlex CSS classes declaratively to during enter/leave animations on scroll or on page load._
*
* [Live Demo](https://www.primevue.org/animate/)
* --- ---
* ![PrimeVue](https://primefaces.org/cdn/primevue/images/logo-100.png)
*
*/
declare const Animate: ObjectDirective;
export default Animate;

View File

@ -0,0 +1,58 @@
import { DomHandler } from 'primevue/utils';
import BaseAnimate from './BaseAnimate';
const Animate = BaseAnimate.extend('animate', {
mounted(el, binding) {
el.setAttribute('data-pd-animate', true);
!this.isUnstyled() && DomHandler.addClass(el, 'p-animate');
this.bindIntersectionObserver(el, binding);
},
unmounted(el) {
this.unbindIntersectionObserver(el);
clearTimeout(this.timeout);
},
timeout: null,
observer: null,
methods: {
bindIntersectionObserver(el, binding) {
const options = {
root: null,
rootMargin: '0px',
threshold: 1.0
};
this.observer = new IntersectionObserver((element) => this.isVisible(element, el, binding), options);
this.observer.observe(el);
},
isVisible(target, el, binding) {
const [intersectionObserverEntry] = target;
intersectionObserverEntry.isIntersecting ? this.enter(el, binding) : this.leave(el, binding);
},
enter(el, binding) {
el.style.visibility = 'visible';
DomHandler.addClass(el, binding.value.enterClass);
},
leave(el, binding) {
DomHandler.removeClass(el, binding.value.enterClass);
if (binding.value.leaveClass) {
DomHandler.addClass(el, binding.value.leaveClass);
}
const animationDuration = el.style.animationDuration || 500;
this.timeout = setTimeout(() => {
el.style.visibility = 'hidden';
}, animationDuration);
},
unbindIntersectionObserver(el) {
if (this.observer) {
this.observer.unobserve(el);
}
}
}
});
export default Animate;

View File

@ -0,0 +1,5 @@
import BaseDirective from 'primevue/basedirective';
const BaseAnimate = BaseDirective.extend({});
export default BaseAnimate;

View File

@ -0,0 +1,6 @@
{
"main": "./animate.cjs.js",
"module": "./animate.esm.js",
"unpkg": "./animate.min.js",
"types": "./Animate.d.ts"
}

View File

@ -0,0 +1,3 @@
import { BaseStyle } from '../../base/style/BaseStyle';
export interface AnimateStyle extends BaseStyle {}

View File

@ -0,0 +1 @@
export default {};

View File

@ -0,0 +1,6 @@
{
"main": "./animatestyle.cjs.js",
"module": "./animatestyle.esm.js",
"unpkg": "./animatestyle.min.js",
"types": "./AnimateStyle.d.ts"
}