Guía de uso
La API completa de animated-fluent-emojis. Para la instalación y tu primer
emoji, empieza por el README.
- Frameworks
- Props
- Hover y foco
- Movimiento reducido
- Fallback
- Reproducción
- Imágenes y sprite sheets HD
- Precarga
- Asset site
- Lookup
- Tipos
Las props de abajo son compartidas por todos los adaptadores; cada sección de
framework indica cómo se escribe cada prop allí. El componente obtiene un
manifest pequeño del asset site la primera vez que se renderiza un emoji, nunca
al momento de importar. Mientras carga, Emoji renderiza un marcador vacío y
aria-hidden con el tamaño final, de modo que el diseño no se desplaza. Si el
id es desconocido, renderiza tu nodo fallback, o nada. Si no se puede cargar
el manifest, renderiza tu nodo fallback, o nada, y reintenta en el siguiente
montaje, en la siguiente llamada a preloadEmojis o cuando el navegador vuelva
a estar en línea.
Frameworks
Un paquete, una ruta de importación por framework. configureEmojis y
preloadEmojis no dependen de ningún framework y permanecen en
animated-fluent-emojis; consulta Precarga y
Asset site. Todos los adaptadores comparten un mismo núcleo de
reproducción y pasan una misma suite de conformidad, por lo que las props se
comportan igual en todas partes. Consulta el
ADR 0014.
Los adaptadores de React, Vue y Svelte y createEmoji leen sus keyframes de
animated-fluent-emojis/style.css; impórtalo una sola vez. <fluent-emoji> y
el componente de Astro incluyen sus propios estilos.
React
Importa Emoji desde la subruta de React:
import { Emoji } from 'animated-fluent-emojis/react'
import 'animated-fluent-emojis/style.css'Si migras desde la 0.6 o anterior: la exportación Emoji de la raíz quedó
obsoleta en la 0.6 y se eliminó en la 0.7. Cambia la ruta de importación y nada
más; las props y el comportamiento son idénticos. El tipo EmojiProps también
se movió a animated-fluent-emojis/react. configureEmojis y preloadEmojis
permanecen en animated-fluent-emojis. Se admiten React 18 y 19, y react y
react-dom son peers opcionales.
Vue
Vue 3.3 o posterior. Emoji recibe las props de abajo en camelCase. El slot
fallback reemplaza la imagen, y los eventos son load, error y
playbackEnd. Otros atributos como class, style y data-* se pasan al span
raíz.
<script setup lang="ts">import { Emoji } from 'animated-fluent-emojis/vue'
import 'animated-fluent-emojis/style.css'
const handlePlaybackEnd = () => { console.log('done')}</script>
<template> <Emoji id="1f44b_wavinghand" :size="64" play-on-hover @playback-end="handlePlaybackEnd" > <template #fallback><span>👋</span></template> </Emoji></template>En el servidor, y durante la hidratación, renderiza un marcador vacío con el tamaño final, por lo que funciona en Nuxt.
Svelte
Svelte 5. Emoji recibe las props de abajo; fallback es un snippet, y
class, style y attributes se pasan al span raíz. Los callbacks son
onLoad, onError y onPlaybackEnd.
<script lang="ts"> import { Emoji } from 'animated-fluent-emojis/svelte'
import 'animated-fluent-emojis/style.css'</script>
<Emoji id="1f44b_wavinghand" size={64} playOnHover> {#snippet fallback()}<span>👋</span>{/snippet}</Emoji>Renderiza un marcador en el servidor y el emoji después de la hidratación, por
lo que funciona en SvelteKit. La exportación del paquete tiene una condición
svelte que apunta al código fuente del componente.
Astro
Astro 5 o posterior. El componente renderiza el marcado del emoji en tiempo de
compilación, por lo que el sprite ya está en el HTML antes de que se ejecute
cualquier script, y un pequeño script inicia la reproducción en el navegador.
Trae sus propios estilos; no hay ninguna hoja de estilos que importar. El slot
con nombre fallback se renderiza cuando el id es desconocido o la imagen
falla.
---import Emoji from 'animated-fluent-emojis/astro'---
<Emoji id="1f44b_wavinghand" size={64} playOnHover> <span slot="fallback">👋</span></Emoji>Las props son las de abajo, sin los callbacks, con class y un style de tipo
string. El span raíz despacha emoji-load, emoji-error y playback-end como
eventos DOM con burbujeo, en lugar de callbacks. El script del navegador también
se ejecuta de nuevo en astro:page-load, por lo que las transiciones de vista
siguen funcionando.
HTML simple
Importar animated-fluent-emojis/element registra <fluent-emoji>. No necesita
hoja de estilos: los keyframes viven en su shadow root.
<script type="module"> import 'animated-fluent-emojis/element'</script>
<fluent-emoji id="1f44b_wavinghand" size="64" play-on-hover> <span slot="fallback">👋</span></fluent-emoji>Los atributos reflejan las props en kebab-case: id, size, play-on-hover,
animation-iterations, auto-play, playing, skin-tone y alt. Un atributo
booleano está activo a menos que su valor sea false. Los mismos nombres
existen como propiedades en camelCase del elemento
(element.playOnHover = true); asignar una propiedad no reescribe el atributo.
Un elemento con slot="fallback" es el fallback. El elemento despacha
emoji-load, emoji-error y playback-end como eventos con burbujeo y
composed.
Hasta que el elemento está definido no tiene tamaño. Agrega
FLUENT_EMOJI_PRE_UPGRADE_CSS, exportado desde la misma entrada, al CSS de tu
página para reservar el espacio a partir del atributo size (en píxeles) y
evitar un desplazamiento del diseño.
Angular, Solid y Preact
Estos usan <fluent-emoji> mediante su propia sintaxis de plantillas; consulta
las guías prácticas de Angular,
Solid y Preact. Lo
mismo aplica a Lit, Alpine y htmx: importa animated-fluent-emojis/element y
escribe la etiqueta.
Sin un framework
createEmoji renderiza en cualquier nodo del DOM y devuelve un controlador. Es
el núcleo sin framework de cada adaptador. Importarlo no toca el DOM.
import { createEmoji } from 'animated-fluent-emojis'
import 'animated-fluent-emojis/style.css'
const controller = createEmoji(document.querySelector('#slot'), { id: '1f44b_wavinghand', size: 64, fallback: () => document.createTextNode('👋'),})
controller.update({ playing: false })controller.destroy()Sus opciones son las props de abajo, con className, style y attributes
para el span raíz, los callbacks onLoad, onError y onPlaybackEnd, y un
fallback que es un nodo, una función que devuelve un nodo, o null.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| id | EmojiId or string |
- | El identificador único del emoji; los ids conocidos se autocompletan |
| size | number or string | 100 | Píxeles, o cualquier longitud CSS como 2rem o var(--size) |
| playOnHover | boolean | false | Si se reproduce la animación al pasar el cursor y con el foco del teclado |
| animationIterations | number or ‘infinite’ | 2 | El número de veces que se reproduce la animación al cargar |
| autoPlay | boolean | true | Si se reproduce la animación automáticamente al montar |
| playing | boolean | - | Controla la reproducción; true reproduce, false pausa, omitida mantiene el valor por defecto |
| onPlaybackEnd | function | - | Se llama una vez cuando termina una ejecución finita de animationIterations |
| skinTone | SkinTone | ‘default’ | Tono de piel para los emojis que tienen variantes (ver abajo) |
| alt | string | description | Texto accesible; por defecto es la descripción del emoji, "" lo marca como decorativo |
| className | string | - | Nombre de clase para el <span> raíz, combinado con el propio del componente |
| style | CSSProperties | - | Estilo en línea para el <span> raíz; width y height siguen a size |
| ref | Ref<HTMLSpanElement> |
- | Se reenvía al <span> raíz; funciona en React 18 y 19 |
| fallback | ReactNode | glyph | Se renderiza cuando falla la imagen o el manifest, o el id es desconocido; null: nada |
| onLoad | function | - | Se llama cuando carga el sprite sheet |
| onError | function | - | Se llama cuando falla la imagen, y sin evento cuando falla el manifest |
Cualquier otro atributo de <span> (data-*, aria-*, title, manejadores de
eventos) se pasa a la raíz. Un size numérico se redondea; cualquier valor que
no sea un número finito y positivo vuelve a 100. Un size de tipo string se
pasa a CSS tal cual, por lo que size="2rem" o size="var(--emoji-size)"
funcionan. Un string numérico como "48" se trata como el número 48, y la
imagen recibe sizes="auto" para los demás strings; un style con width o
height prevalece sobre size.
skinTone es uno de 'default', 'light', 'medium-light', 'medium',
'medium-dark' o 'dark'. Solo se aplica a los emojis marcados como diverse;
para cualquier otro emoji, o un valor desconocido, se usa el sheet por defecto.
DiverseEmojiId lista los ids que tienen tonos de piel, y skinTone se tipa
contra él cuando id es uno de ellos.
Hover y foco
Con playOnHover, la animación se reproduce después de la ejecución inicial
cuando el puntero entra en el emoji, y también cuando el emoji está dentro de un
<button> o un <a> que recibe el foco del teclado (:focus-visible).
Movimiento reducido
Cuando el sistema del usuario pide reducir el movimiento
(prefers-reduced-motion: reduce), autoPlay se ignora y el emoji descansa en
su poster frame, el primer cuadro de la animación. playOnHover sigue
reproduciendo al pasar el cursor y con el foco, porque es una acción explícita
del usuario.
Fallback
Si el sprite sheet no carga, Emoji muestra el fallback glyph: el carácter
Unicode nativo del emoji, etiquetado con alt. Pasa fallback para renderizar
tu propio nodo en su lugar, o fallback={null} para no renderizar nada:
<Emoji id="1f44b_wavinghand" fallback={<span>👋</span>} /><Emoji id="1f44b_wavinghand" fallback={null} />onError se ejecuta cuando falla la imagen (con el evento) y cuando falla el
manifest (sin él). El fallback glyph necesita el manifest, así que cuando el
propio manifest falló solo se renderiza un nodo fallback explícito. Un id
desconocido renderiza el nodo fallback, o nada; no llama a onError y, en
desarrollo, avisa una vez por id. La solicitud del manifest se rinde tras 15
segundos y se reintenta como cualquier otro fallo.
Reproducción
El autoplay espera hasta que el sprite sheet haya cargado, el emoji esté en
pantalla y la pestaña esté visible, por lo que los emojis fuera de pantalla o en
segundo plano no se animan. Las pestañas ocultas pausan todos los emojis y los
reanudan cuando la pestaña vuelve. Cambiar id inicia de nuevo la ejecución
inicial del nuevo emoji. Un animationIterations de 0, un número negativo o
NaN desactiva el autoplay; Infinity equivale a 'infinite'. Mientras el
autoplay está retenido, el emoji muestra su poster frame.
Usa playing para controlar la reproducción tú mismo. true reproduce
animationIterations ejecuciones, anulando autoPlay y el movimiento reducido
(esperando aún la imagen, el viewport y una pestaña visible); false pausa en
el cuadro actual. Una ejecución terminada no se reinicia al alternar, así que
vuelve a montar con una nueva key para repetirla. onPlaybackEnd se ejecuta
una vez cuando termina una ejecución finita; nunca se ejecuta con 'infinite'
ni cuando el emoji se desmonta a mitad de una ejecución.
<Emoji id="1f389_partypopper" playing={isOpen} onPlaybackEnd={handleDone} />Imágenes y sprite sheets HD
Los sprite sheets se cargan con loading="lazy" y decoding="async". Los
emojis que tienen un sprite sheet HD (cuadros de 200px) reciben además un
srcSet basado en ancho (100w y 200w) con sizes igual al tamaño
renderizado (auto para un size de tipo string), de modo que el navegador
elige el sheet @2x en pantallas de alta densidad.
Precarga
preloadEmojis empieza a obtener el manifest antes de que se renderice
cualquier Emoji y, cuando recibe ids, solicita sus sprite sheets una vez que
está listo. Nunca rechaza:
import { preloadEmojis } from 'animated-fluent-emojis'
void preloadEmojis()void preloadEmojis(['1f44b_wavinghand', '1f525_fire'], { skinTone: 'medium' })skinTone elige la variante que se precalienta para los emojis que tienen tonos
de piel.
Asset site
Por defecto, el manifest y los sprite sheets provienen de
https://animated-fluent-emojis-cdn.andryore.dev. La dirección anterior,
https://animated-fluent-emojis.pages.dev, sigue funcionando. Para servirlos
desde tu propia copia, llama a configureEmojis una vez, antes de que se
renderice el primer Emoji:
import { configureEmojis } from 'animated-fluent-emojis'
configureEmojis({ assetSiteUrl: 'https://emojis.example.com' })Lookup
animated-fluent-emojis/lookup no depende de React y comparte el manifest con
Emoji, por lo que es barato agregarlo junto a él. Cada función carga el
manifest y, cuando no puede, resuelve a undefined o a un arreglo vacío, sin
rechazar nunca:
import { extractEmojis, findEmojiByUnicode, searchEmojis,} from 'animated-fluent-emojis/lookup'
await findEmojiByUnicode('👍🏽') // { id: 'yes', skinTone: 'medium' }await extractEmojis('Hi 👋 there') // [{ id, text, index, length }]await searchEmojis('party', { limit: 5 }) // [{ id }]findEmojiByUnicode(text)resuelve un emoji y asigna un único modificador de tono de piel askinTone; los tonos mezclados resuelven al emoji base. Los símbolos como©o™necesitan el selector de variación de emoji (U+FE0F) para coincidir, mientras que las secuencias ZWJ coinciden incluso cuando falta el selector de variación (minimally qualified).- Cuando varias entradas del catalog comparten un glifo, lookup devuelve el
emoji canónico: el id con prefijo de los code points del glifo; si no, una
sobrescritura revisada; si no, la primera entrada en el orden del catalog. Por
ejemplo,
❤️resuelve al corazón y no a una variante que reutiliza el glifo. Con un tono de piel, recurre a una entrada hermana que tenga tonos. extractEmojis(text)encuentra todos los emojis del catalog en un texto, manteniendo completas las secuencias ZWJ, con su desplazamiento y longitud. SinIntl.Segmenterrecurre a un agrupador de code points, y ninguna de las dos funciones rechaza nunca.searchEmojis(query, { limit })busca en las descripciones, sin distinguir mayúsculas de minúsculas;limites 20 por defecto; unlimitque no sea un número positivo significa sin límite, excepto0, que no devuelve nada.
Tipos
La raíz exporta configureEmojis, preloadEmojis y createEmoji, y los tipos
SkinTone, EmojiId, DiverseEmojiId, EmojiController, EmojiOptions y
EmojiFallback. El componente Emoji y EmojiProps se eliminaron de la raíz
en la 0.7.0; impórtalos desde /react. /react, /vue y /svelte exportan
cada uno su propio Emoji y EmojiProps; /astro tiene una exportación por
defecto y el tipo EmojiAstroProps; /element exporta el tipo
FluentEmojiElement. EmojiId es la unión de todos los ids publicados y se
genera a partir del catalog; la prop id se tipa como
EmojiId | (string & {}), por lo que los ids conocidos se autocompletan y los
ids agregados al catalog después de tu versión instalada siguen compilando.