Variable Font Hover by Letter
Variable Font Hover by Letter é um componente de texto para React e Tailwind CSS, da biblioteca Fancy Components, com licença MIT. Copia e cola no teu projeto.
Fancy Components
MIT
text
O que é
Variable Font Hover by Letter é um componente de texto para React e Tailwind CSS, da biblioteca Fancy Components, 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.
Precisa de
npm i lodash motion
Licença
Este componente vem de Fancy Components e é redistribuído sob a licença MIT, que permite uso comercial. O aviso de copyright viaja com o código.
Variable Font Hover by Letter
"use client"
import { useState } from "react"
import { debounce } from "lodash"
import { AnimationOptions, motion, stagger, useAnimate } from "motion/react"
interface TextProps {
label: string
fromFontVariationSettings: string
toFontVariationSettings: string
transition?: AnimationOptions
staggerDuration?: number
staggerFrom?: "first" | "last" | "center" | number
className?: string
onClick?: () => void
}
const VariableFontHoverByLetter = ({
label,
fromFontVariationSettings = "'wght' 400, 'slnt' 0",
toFontVariationSettings = "'wght' 900, 'slnt' -10",
transition = {
type: "spring",
duration: 0.7,
},
staggerDuration = 0.03,
staggerFrom = "first",
className,
onClick,
...props
}: TextProps) => {
const [scope, animate] = useAnimate()
const [isHovered, setIsHovered] = useState(false)
const mergeTransition = (baseTransition: AnimationOptions) => ({
...baseTransition,
delay: stagger(staggerDuration, {
from: staggerFrom,
}),
})
const hoverStart = debounce(
() => {
if (isHovered) return
setIsHovered(true)
animate(
".letter",
{ fontVariationSettings: toFontVariationSettings },
mergeTransition(transition)
)
},
100,
{ leading: true, trailing: true }
)
const hoverEnd = debounce(
() => {
setIsHovered(false)
animate(
".letter",
{ fontVariationSettings: fromFontVariationSettings },
mergeTransition(transition)
)
},
100,
{ leading: true, trailing: true }
)
return (
<motion.span
className={`${className}`}
onHoverStart={hoverStart}
onHoverEnd={hoverEnd}
onClick={onClick}
ref={scope}
{...props}
>
<span className="sr-only">{label}</span>
{label.split("").map((letter: string, i: number) => {
return (
<motion.span
key={i}
className="inline-block whitespace-pre letter"
aria-hidden="true"
>
{letter}
</motion.span>
)
})}
</motion.span>
)
}
export default VariableFontHoverByLetter