Saltar al contenido
ES

Documentación

Documentación

useAnimations es una biblioteca gratuita, con licencia MIT, de 300 iconos animados para React. Cada icono trae una interacción integrada: se repite en bucle, se reproduce al hacer clic o se reproduce con hover. Úsalos con el paquete react-useanimations o añádelos con la CLI de shadcn.

Inicio rápido

npm install react-useanimations
import UseAnimations from 'react-useanimations';
import github from 'react-useanimations/lib/github';

export default function Header() {
  return <UseAnimations animation={github} size={32} />;
}

El icono sigue el color del texto y reproduce su propia interacción: github se repite en bucle mientras tienes el cursor encima. El paquete no tiene dependencias; un reproductor integrado (8 kB con gzip) dibuja los iconos como SVG, y cada icono es un módulo independiente, así que tu bundle solo incluye los iconos que importas.

Interacciones

Cada icono viene con la interacción para la que fue diseñado. Puedes cambiarla con la prop interaction.

Interacción Qué hace Iconos de ejemplo
loop Se reproduce sin parar. loading, activity, alertCircle
click-toggle Alterna entre dos estados al hacer clic (hacia delante y luego hacia atrás). menu, checkBox, playPause
click-replay Se repite desde el principio con cada clic. download, refresh, send
hover Avanza cuando entra el cursor y retrocede cuando sale. archive, settings, trash
hover-loop Se repite en bucle durante el hover y termina el ciclo en curso al salir. github, twitter, dribbble
hover-replay Se reproduce una vez desde el principio cuando entra el cursor. arrowRight, bluetooth, zap

Cuando el usuario prefiere movimiento reducido, los iconos se quedan quietos: los bucles muestran su primer fotograma, las animaciones de hover y de repetición no se reproducen y los toggles cambian a su nuevo estado de inmediato.

Props

<UseAnimations animation={github} size={56} strokeColor="#4b5cff" style={{ padding: 8 }} />
Prop Valor por defecto Descripción
animation — Icono importado de react-useanimations/lib/<name>, o { animationData, interaction } para tu propia animación.
size 24 Ancho y alto; los números son píxeles y las cadenas, cualquier longitud CSS, como '1.5em'.
strokeColor 'currentColor' Color de los trazos. Por defecto, el icono sigue el color del texto.
fillColor strokeColor Color de las partes rellenas, por ejemplo, un corazón con me gusta.
interaction según el icono 'loop', 'click-toggle', 'click-replay', 'hover', 'hover-loop' o 'hover-replay'.
active — Para iconos click-toggle: true muestra el estado final. Controlado: actualízalo en onClick; los clics no lo alternan.
autoplay según el icono true para los iconos loop, salvo que se prefiera movimiento reducido.
loop según el icono true para los iconos loop y hover-loop.
speed 1 Velocidad de reproducción.
render — Render prop para un wrapper personalizado; consulta Envolver el icono en un botón real.

Cualquier otra prop (className, aria-label, onClick, …) va al <span> que envuelve el icono. Tus manejadores de eventos se ejecutan antes que los de la animación; llama a event.preventDefault() para omitir la animación.

Importar iconos

Importa cada icono desde react-useanimations/lib/<name>, o varios a la vez desde react-useanimations/icons:

import { github, heart, menu } from 'react-useanimations/icons';

En ambos casos, los builds de producción incluyen solo los iconos que usas. Los servidores de desarrollo y los test runners no hacen tree shaking, así que ahí react-useanimations/icons carga todos los iconos; si eso te importa, usa lib/<name>. delete y package son palabras reservadas: impórtalos como deleteIcon y packageIcon.

Toggle controlado

import { useState } from 'react';
import UseAnimations from 'react-useanimations';
import menu from 'react-useanimations/lib/menu';

export function MenuButton() {
  const [open, setOpen] = useState(false);
  return (
    <UseAnimations
      animation={menu}
      size={40}
      active={open} // también se anima cuando `open` cambia en otro lugar
      onClick={() => setOpen(!open)}
    />
  );
}

Envolver el icono en un botón real

Para los iconos en los que se hace clic, rodea el icono con un elemento que pueda recibir el foco usando la prop render: eventProps va en tu elemento y animationProps, en un <span> dentro de él. Así, las animaciones de hover también se reproducen cuando el botón recibe el foco del teclado.

import heart from 'react-useanimations/lib/heart';

<UseAnimations
  animation={heart}
  size={32}
  render={(eventProps, animationProps) => (
    <button type="button" aria-label="Añadir a favoritos" {...eventProps}>
      <span {...animationProps} />
    </button>
  )}
/>;

Tamaño y color

Los iconos son iconos de línea dibujados en una mesa de trabajo de 24 o 32 px y se mantienen nítidos a cualquier tamaño: asigna a size un número de píxeles o cualquier longitud CSS.

Los trazos siguen currentColor, así que los iconos adoptan por sí solos el color del texto, los estados de hover y el modo oscuro. Cámbialos con strokeColor y fillColor, con la propiedad color de CSS o aplicando estilos a los trazados: la regla integrada tiene especificidad cero, así que tu CSS siempre gana.

Algunos iconos recortan un hueco en su propio dibujo (la barra de visibility, microphone, video, volume y notification, la marca de download, el anillo alrededor del indicador de notification3). El hueco toma el fondo de la página: blanco en páginas claras y oscuro en páginas con color-scheme: dark. Sobre otros fondos, defínelo con la variable CSS --ua-knockout, por ejemplo, body { --ua-knockout: #0f172a; }.

// Tailwind: color y grosor del trazo
<UseAnimations animation={github} className="text-indigo-500 [&_path]:stroke-[3]" />

Next.js y renderizado en servidor

El componente está marcado con 'use client' y dibuja la animación solo en el navegador, así que puedes renderizarlo desde server components y frameworks con SSR (Next.js, Remix, Astro) sin dynamic(…, { ssr: false }). Los módulos de los iconos son datos simples, así que los server components pueden importarlos y pasarlos como props.

shadcn/ui

Cada icono está también en un registro de shadcn. La CLI añade un componente listo para usar e instala react-useanimations:

npx shadcn@latest add https://useanimations.com/r/checkmark.json
import { AnimatedCheckmark } from '@/components/animations/checkmark';

<AnimatedCheckmark size={24} />;

El componente se llama Animated + el id del icono en PascalCase (check-box → AnimatedCheckBox), se guarda en components/animations/<id>.tsx y acepta las mismas props que UseAnimations. El índice del registro es /r/registry.json. Para usar la forma corta npx shadcn@latest add @useanimations/checkmark, añade el registro a components.json:

{
  "registries": {
    "@useanimations": "https://useanimations.com/r/{name}.json"
  }
}

Tu propia animación

import animationData from './my-animation.json';

<UseAnimations animation={{ animationData, interaction: 'hover' }} />;

Tu animación debe ser un archivo Lottie JSON, el mismo formato que usan los iconos. El reproductor admite lo que necesitan los iconos: capas de forma, precomposiciones, capas nulas y emparentamiento, trazados, rectángulos, elipses, trazos, rellenos, recorte de trazados, máscaras, fotogramas clave con easing, holds y trayectorias de movimiento, y las expresiones loopOut() y wiggle(). Todo lo demás, como degradados, capas de texto o de imagen, efectos y mates, no se dibuja; la consola avisa de las capas, formas y expresiones no compatibles.

Archivos e icons.json

Cada icono también se puede descargar, desde su página o desde URL estables con CORS habilitado:

Archivo URL
Animación (Lottie JSON) https://useanimations.com/icons/<id>.json
SVG estático de cada estado https://useanimations.com/icons/<id>/<state>.svg
ZIP con el JSON y los SVG https://useanimations.com/icons/<id>.zip
Página del icono (en inglés) https://useanimations.com/icons/<id>
Catálogo de todos los iconos https://useanimations.com/icons.json

icons.json recoge cada icono con su id, título, categoría, palabras clave de búsqueda, interacción, URL de los archivos, tamaño y duración, su import de react-useanimations y el comando de shadcn. El paquete de npm incluye los mismos datos: react-useanimations/catalog.json (metadatos), react-useanimations/icons (las animaciones) y react-useanimations/svg.json (los SVG estáticos).

Uso sin React

Los iconos son Lottie JSON estándar, así que cualquier reproductor de Lottie puede reproducirlos desde https://useanimations.com/icons/<id>.json o desde una copia en tu proyecto. Fuera de React, la interacción la conectas tú. En Iconos Lottie encontrarás más reproductores y ejemplos.

Algunos iconos usan expresiones de After Effects (loopOut(), wiggle()); requiresFullPlayer los marca en icons.json. En la web necesitan la versión completa de lottie-web, no lottie_light, y los reproductores nativos no evalúan expresiones.

HTML y JavaScript

<div id="icon" style="width: 48px; height: 48px"></div>

<script src="https://cdn.jsdelivr.net/npm/lottie-web@5.13.0/build/player/lottie.min.js"></script>
<script>
  const el = document.getElementById('icon');
  const animation = lottie.loadAnimation({
    container: el,
    renderer: 'svg',
    loop: false,
    autoplay: false,
    path: 'https://useanimations.com/icons/archive.json',
  });
  // hover: hacia delante al entrar, hacia atrás al salir
  el.addEventListener('mouseenter', () => {
    animation.setDirection(1);
    animation.play();
  });
  el.addEventListener('mouseleave', () => {
    animation.setDirection(-1);
    animation.play();
  });
</script>

Con el renderizador SVG, el icono puede seguir el color del texto igual que el componente de React:

#icon path[stroke^='rgb']:not([stroke='rgb(255,255,255)']) {
  stroke: currentColor;
}
#icon path[fill='rgb(0,0,0)'] {
  fill: currentColor;
}

Vue

<script setup>
import lottie from 'lottie-web';
import { onBeforeUnmount, onMounted, ref } from 'vue';

const el = ref(null);
let animation;
onMounted(() => {
  animation = lottie.loadAnimation({
    container: el.value,
    renderer: 'svg',
    loop: true,
    autoplay: true,
    path: 'https://useanimations.com/icons/loading.json',
  });
});
onBeforeUnmount(() => animation?.destroy());
</script>

<template>
  <div ref="el" style="width: 48px; height: 48px" />
</template>

React Native

import LottieView from 'lottie-react-native';

<LottieView source={require('./loading.json')} autoPlay loop style={{ width: 48, height: 48 }} />;

iOS

Con lottie-ios y el JSON en el bundle de tu app:

import Lottie
import SwiftUI

LottieView(animation: .named("loading"))
  .looping()
  .frame(width: 48, height: 48)

Android

Con lottie-android en Jetpack Compose y el JSON en res/raw:

val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.loading))
LottieAnimation(composition, iterations = LottieConstants.IterateForever, modifier = Modifier.size(48.dp))

Flutter

Con el paquete lottie:

Lottie.asset('assets/loading.json', width: 48, height: 48)

Rendimiento y accesibilidad

  • Ligero: el reproductor ocupa 8 kB con gzip y no tiene dependencias, y un icono ocupa de 1 a 15 kB (2 kB de mediana).
  • Diferido: las animaciones se dibujan solo en el navegador, después de que se renderiza la página; los bucles con reproducción automática se pausan mientras quedan fuera de la vista, y todo se limpia al desmontar el componente.
  • Decorativos por defecto: los iconos se ocultan a los lectores de pantalla (aria-hidden) salvo que pases aria-label, que hace que se anuncien como imagen. En controles que solo tienen un icono, usa un <button> real con aria-label (consulta más arriba) y refleja el estado del toggle con aria-pressed o aria-expanded.
  • Movimiento reducido y pantallas táctiles: los iconos respetan prefers-reduced-motion, y los toques en pantallas táctiles no activan las animaciones de hover.

Agentes de programación con IA

Los agentes pueden elegir iconos por palabra clave o por interacción a partir de icons.json, o de react-useanimations/catalog.json dentro del paquete, y usar la línea de import o el comando de shadcn que aparece ahí. Las definiciones de tipos de cada import de icono también incluyen su título, palabras clave, interacción y vista previa. Esta documentación está disponible en Markdown en /documentation.md, y /llms.txt indexa el sitio.

Actualizar desde la v2

En la mayoría de las apps, actualizar consiste en instalar la v3: el componente, los imports react-useanimations/lib/<name> y los 79 iconos de la v2 siguen igual. Sigue los pasos de abajo que apliquen a tu código.

1. Instala la v3

La v3 necesita React 18 o posterior y no tiene dependencias. Desinstala también lottie-web, salvo que otra parte de tu app lo use.

npm install react-useanimations@3
npm uninstall lottie-web

2. Sustituye reverse por active

active es totalmente controlado: el icono se anima cuando active cambia, y un clic por sí solo no lo alterna, así que actualízalo en onClick. reverse sigue funcionando como en la v2 (define el estado inicial y los clics alternan el icono), pero está obsoleto. Ambos se aplican solo a los iconos click-toggle: los cuatro círculos con flecha ahora se repiten al hacer clic (consulta el paso 6).

- <UseAnimations animation={checkBox} reverse={checked} onClick={toggle} />
+ <UseAnimations animation={checkBox} active={checked} onClick={toggle} />

3. Revisa los colores

Los iconos de la v2 eran negros salvo que definieras strokeColor. Los de la v3 siguen el color del texto (currentColor), y fillColor toma por defecto el valor de strokeColor. Los iconos dentro de texto o enlaces de color cambian de color con ellos; para mantenerlos en negro, define tú el color:

<UseAnimations animation={github} strokeColor="#000" />

4. Migra wrapperStyle, pathCss y options

  • wrapperStyle está obsoleto: usa style.
  • pathCss se eliminó: aplica estilos a los trazados con una clase.
  • options (los ajustes de lottie-web) se eliminó junto con lottie-web. Usa las props loop, autoplay y speed; el resto de opciones de lottie-web no tienen equivalente.

Si aun así pasas pathCss u options, se muestra un aviso una sola vez y se ignoran.

- <UseAnimations animation={github} wrapperStyle={{ margin: 8 }} pathCss="stroke-width: 3px;" options={{ loop: true }} />
+ <UseAnimations animation={github} style={{ margin: 8 }} className="thick" loop />
.thick path {
  stroke-width: 3px;
}

5. Revisa el elemento contenedor

El contenedor ahora es un <span> inline-block en lugar de un <div>, así que es válido dentro de botones y enlaces y se coloca en la línea de texto. Actualiza el CSS que apunte al contenedor como div, y en la prop render aplica animationProps a un <span>:

  render={(eventProps, animationProps) => (
    <button type="button" aria-label="Like" {...eventProps}>
-     <div {...animationProps} />
+     <span {...animationProps} />
    </button>
  )}

Los iconos ahora se ocultan a los lectores de pantalla (aria-hidden) salvo que pases aria-label; añádelo a los iconos que transmiten significado por sí solos.

6. Revisa los iconos cuya interacción cambió

Las interacciones ahora coinciden con las de useanimations.com. Si quieres que un icono se comporte como en la v2, pásale su interacción anterior:

Iconos v2 v3
arrowDownCircle, arrowLeftCircle, arrowRightCircle, arrowUpCircle click-toggle click-replay
calendar, folder, home, instagram, userMinus, userPlus, userX, youtube, youtube2 hover-replay* hover
behance, codepen, facebook, github, linkedin, pocket, twitter hover-replay* hover-loop
copy, edit, mail click-replay hover
dribbble hover hover-loop
zoomIn, zoomOut loop hover

* La v2 los reproducía una vez al entrar el cursor y volvía de golpe al principio al salir; hover-replay es lo más parecido.

<UseAnimations animation={zoomIn} interaction="loop" />

7. Actualiza los imports

Importa los iconos solo como react-useanimations/lib/<name> o desde react-useanimations/icons. Las rutas internas de la v2, como react-useanimations/lib/github/index o react-useanimations/lib/github/github.json, ya no se resuelven; el Lottie JSON es el animationData del icono:

- import githubJson from 'react-useanimations/lib/github/github.json';
+ import github from 'react-useanimations/lib/github';
+ const githubJson = github.animationData;

Las rutas react-useanimations/utils se eliminaron. Importa los tipos desde el paquete:

- import type { Animation, AnimationKey } from 'react-useanimations/utils';
+ import type { Animation, AnimationKey, Interaction, UseAnimationsProps } from 'react-useanimations';

Animation ahora es { animationData, interaction }; el campo animationKey de la v2 ya no existe, así que los objetos que construyas tú deben usar interaction en su lugar.

Otras novedades

221 iconos más (300 en total), varios iconos a la vez desde react-useanimations/icons, soporte para movimiento reducido, hover con el foco del teclado, animaciones de hover que ya no se quedan atascadas en pantallas táctiles, renderizado en servidor sin trucos y un registro de shadcn.

Licencia

Los iconos y el código se publican bajo la licencia MIT: úsalos, modifícalos y redistribúyelos en trabajos personales y comerciales. La atribución no es obligatoria, pero se agradece:

Animated icons by <a href="https://useanimations.com">useAnimations</a>

Condiciones completas: Licencia y condiciones.

Preguntas frecuentes

¿useAnimations es gratis para proyectos comerciales?

Sí. Los iconos y el paquete tienen licencia MIT y no requieren atribución.

¿Cómo cambio el color de un icono?

Los iconos siguen el color del texto. Puedes cambiarlo con strokeColor y fillColor, con la propiedad color de CSS o aplicando estilos a los trazados. Consulta Tamaño y color.

¿Funciona sin React?

El paquete es para React. Cada icono es también un archivo Lottie JSON que pueden reproducir lottie-web, lottie-ios, lottie-android, Flutter y React Native, además de un SVG estático. Consulta Uso sin React e Iconos Lottie.

¿Pueden los agentes de programación con IA usar useAnimations?

Sí. Indícales icons.json y /documentation.md; el propio paquete incluye catalog.json y tipos documentados para cada icono.