Spaces:
Runtime error
Runtime error
import { EmblaCarouselType } from "embla-carousel"; | |
const TWEEN_FACTOR = 4.2; | |
const numberWithinRange = (number: number, min: number, max: number): number => | |
Math.min(Math.max(number, min), max); | |
const calculateTweenValuesOpacity = (emblaApi: EmblaCarouselType): number[] => { | |
const engine = emblaApi.internalEngine(); | |
const scrollProgress = emblaApi.scrollProgress(); | |
return emblaApi.scrollSnapList().map((scrollSnap, index) => { | |
if (!emblaApi.slidesInView().includes(index)) return 0; | |
let diffToTarget = scrollSnap - scrollProgress; | |
if (engine.options.loop) { | |
engine.slideLooper.loopPoints.forEach((loopItem) => { | |
const target = loopItem.target(); | |
if (index === loopItem.index && target !== 0) { | |
const sign = Math.sign(target); | |
if (sign === -1) diffToTarget = scrollSnap - (1 + scrollProgress); | |
if (sign === 1) diffToTarget = scrollSnap + (1 - scrollProgress); | |
} | |
}); | |
} | |
const tweenValue = 1 - Math.abs(diffToTarget * TWEEN_FACTOR); | |
return numberWithinRange(tweenValue, 0, 1); | |
}); | |
}; | |
export const setupTweenOpacity = ( | |
emblaApi: EmblaCarouselType | |
): { | |
applyTweenOpacity: () => void; | |
removeTweenOpacity: () => void; | |
} => { | |
const tweenNodes = emblaApi.slideNodes(); | |
const applyTweenOpacity = (): void => { | |
const tweenValues = calculateTweenValuesOpacity(emblaApi); | |
tweenValues.forEach((tweenValue, index) => { | |
tweenNodes[index].style.opacity = tweenValue.toString(); | |
}); | |
}; | |
const removeTweenOpacity = (): void => { | |
tweenNodes.forEach((slide) => slide.removeAttribute("style")); | |
}; | |
return { | |
applyTweenOpacity, | |
removeTweenOpacity, | |
}; | |
}; | |