Image Mousetrail Small
Image Mousetrail Small é um componente de media para React e Tailwind CSS, da biblioteca UI Layouts, com licença MIT. Copia e cola no teu projeto.
UI Layouts
MIT
media
O que é
Image Mousetrail Small é um componente de media para React e Tailwind CSS, da biblioteca UI Layouts, com licença MIT. Copia e cola no teu projeto.
Como usar
Abre o componente no catálogo, carrega em copiar, e cola no teu projeto. O prompt copiado leva o código e as regras para o teu agente o reproduzir sem alterar nada.
Cinco cópias grátis por mês. Sem cartão.
Não precisa de pacotes além do que o projeto já tem
Licença
Este componente vem de UI Layouts e é redistribuído sob a licença MIT, que permite uso comercial. O aviso de copyright viaja com o código.
Image Mousetrail Small
// @ts-nocheck
'use client';
import { cn } from '@/lib/utils';
import { type ReactNode, createRef, useRef } from 'react';
interface ImageMouseTrailProps {
items: string[];
children?: ReactNode;
className?: string;
imgClass?: string;
distance?: number;
maxNumberOfImages?: number;
fadeAnimation?: boolean;
}
export default function ImageMouseTrail({
items,
children,
className,
maxNumberOfImages = 5,
imgClass = 'w-40 h-48',
distance = 20,
fadeAnimation = false,
}: ImageMouseTrailProps) {
const containerRef = useRef(null);
const refs = useRef(items.map(() => createRef<HTMLImageElement>()));
const currentZIndexRef = useRef(1);
let globalIndex = 0;
let last = { x: 0, y: 0 };
const activate = (image: HTMLImageElement, x: number, y: number) => {
const containerRect = containerRef.current?.getBoundingClientRect();
const relativeX = x - containerRect.left;
const relativeY = y - containerRect.top;
image.style.left = `${relativeX}px`;
image.style.top = `${relativeY}px`;
console.log(refs.current[refs.current?.length - 1]);
if (currentZIndexRef.current > 40) {
currentZIndexRef.current = 1;
}
image.style.zIndex = String(currentZIndexRef.current);
currentZIndexRef.current++;
image.dataset.status = 'active';
if (fadeAnimation) {
setTimeout(() => {
image.dataset.status = 'inactive';
}, 1500);
}
last = { x, y };
};
const distanceFromLast = (x, y) => {
return Math.hypot(x - last.x, y - last.y);
};
const deactivate = (image) => {
image.dataset.status = 'inactive';
};
const handleOnMove = (e) => {
if (distanceFromLast(e.clientX, e.clientY) > window.innerWidth / distance) {
// console.log(e.clientX, e.clientY)
const lead = refs.current[globalIndex % refs.current.length].current;
const tail = refs.current[(globalIndex - maxNumberOfImages) % refs.current.length]?.current;
if (lead) activate(lead, e.clientX, e.clientY);
if (tail) deactivate(tail);
globalIndex++;
}
};
return (
<section
onMouseMove={handleOnMove}
onTouchMove={(e) => handleOnMove(e.touches[0])}
ref={containerRef}
className={cn(
'grid place-content-center h-[600px] w-full bg-[#e0dfdf] relative overflow-hidden rounded-lg',
className
)}
>
{items.map((item, index) => (
<>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
key={item.src}
className={cn(
"object-cover scale-0 opacity:0 data-[status='active']:scale-100 data-[status='active']:opacity-100 transition-transform data-[status='active']:duration-500 duration-300 data-[status='active']:ease-out-expo absolute -translate-y-[50%] -translate-x-[50%] ",
imgClass
)}
data-index={index}
data-status='inactive'
src={item}
alt={`image-${index}`}
ref={refs.current[index]}
/>
</>
))}
{children}
</section>
);
}
'use client';
import React from 'react';
import ImageMouseTrail from '@/components/ui/mousetrail';
const images = [
'https://images.unsplash.com/photo-1709949908058-a08659bfa922?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1548192746-dd526f154ed9?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1693581176773-a5f2362209e6?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1584043204475-8cc101d6c77a?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1709949908058-a08659bfa922?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1518599904199-0ca897819ddb?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1706049379414-437ec3a54e93?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1709949908219-fd9046282019?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1508873881324-c92a3fc536ba?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1462989856370-729a9c1e2c91?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1475727946784-2890c8fdb9c8?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1546942113-a6c43b63104a?q=80&w=1200&auto=format',
'https://images.unsplash.com/photo-1726551195764-f98a8e8a57c3?q=80&w=1200&auto=format',
];
export default function SmallImages() {
return (
<section>
<ImageMouseTrail
items={images}
maxNumberOfImages={9}
distance={35}
imgClass='w-20 h-24'
className='bg-white text-black'
>
<article className='relative z-50 '>
<h1 className='xl:text-[7em] sm:text-6xl text-4xl text-center font-semibold '>
✨Experience
</h1>
</article>
</ImageMouseTrail>
</section>
);
}