3D Marquee
3D Marquee é um componente de marquee para React e Tailwind CSS, da biblioteca UI Layouts, com licença MIT. Copia e cola no teu projeto.
UI Layouts
MIT
marquee
O que é
3D Marquee é um componente de marquee 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.
3D Marquee
'use client';
import { Marquee } from '@/components/ui/marquee';
const logos = [
{
name: 'Microsoft',
img: 'https://images.unsplash.com/photo-1718954572423-2780fe600028?w=500&auto=format&fit=crop',
},
{
name: 'Apple',
img: 'https://images.unsplash.com/photo-1718954572423-2780fe600028?w=500&auto=format&fit=crop',
},
{
name: 'Google',
img: 'https://images.unsplash.com/photo-1718954572423-2780fe600028?w=500&auto=format&fit=crop',
},
{
name: 'Facebook',
img: 'https://images.unsplash.com/photo-1718954572423-2780fe600028?w=500&auto=format&fit=crop',
},
{
name: 'LinkedIn',
img: 'https://images.unsplash.com/photo-1718954572423-2780fe600028?w=500&auto=format&fit=crop',
},
{
name: 'Twitter',
img: 'https://images.unsplash.com/photo-1718954572423-2780fe600028?w=500&auto=format&fit=crop',
},
];
const Marquee3D = () => {
return (
<div className='relative flex h-full w-96 mx-auto flex-col items-center justify-center gap-4 overflow-hidden rounded-lg dark:bg-neutral-800 bg-neutral-50 px-10'>
<div className='flex flex-row gap-4 perspective-near'>
<Marquee
className='h-96 justify-center overflow-hidden [--duration:60s] [--gap:1rem]'
vertical
style={{
transform:
'translateX(0px) translateY(0px) translateZ(-50px) rotateX(0deg) rotateY(-20deg) rotateZ(10deg) scale(1.5)',
}}
>
{logos.map((data) => (
<img
key={data.name}
src={data.img}
alt={data.name}
className='mx-auto h-full w-3/4 cursor-pointer rounded-xl border border-neutral-300 transition-all duration-300 hover:ring-1 hover:ring-neutral-300'
/>
))}
</Marquee>
</div>
<div className='pointer-events-none absolute inset-y-0 left-0 w-1/3 bg-linear-to-r from-white dark:from-neutral-900'></div>
<div className='pointer-events-none absolute inset-y-0 right-0 w-1/3 bg-linear-to-l from-white dark:from-neutral-900'></div>
</div>
);
};
export default Marquee3D;
'use client';
import { cn } from '@/lib/utils';
interface MarqueeProps {
className?: string;
reverse?: boolean;
pauseOnHover?: boolean;
children?: React.ReactNode;
vertical?: boolean;
repeat?: number;
[key: string]: any;
}
export function Marquee({
className,
reverse,
pauseOnHover = false,
children,
vertical = false,
repeat = 4,
...props
}: MarqueeProps) {
return (
<div
{...props}
className={cn(
'group flex overflow-hidden p-2 [--duration:40s] [--gap:1rem] gap-(--gap)',
{
'flex-row': !vertical,
'flex-col': vertical,
},
className
)}
>
{Array(repeat)
.fill(0)
.map((_, i) => (
<div
key={i}
className={cn('flex shrink-0 justify-around gap-(--gap)', {
'animate-marquee flex-row': !vertical && !reverse,
'animate-marquee-vertical flex-col': vertical && !reverse,
'animate-marquee-reverse flex-row': !vertical && reverse,
'animate-marquee-vertical-reverse flex-col': vertical && reverse,
'group-hover:[animation-play-state:paused]': pauseOnHover,
})}
>
{children}
</div>
))}
</div>
);
}