Referencia del manifiesto del player
El manifiesto es el contrato entre el plugin de diseño y el player. Declara qué renderizar, cómo rutear entre variantes para un viewer dado, y qué ocurre cuando el viewer interactúa.
Lo produce el plugin de After Effects al publicar — normalmente no se escribe a mano — pero entenderlo explica qué puede y qué no puede hacer un template.
{
"version": "1.0.0",
"lottie": { "defaultUrl": "https://…/animation.json" }
}
version y lottie son los únicos campos obligatorios.
Contenido
| Campo | Tipo | Propósito |
|---|---|---|
lottie | objeto | La animación. defaultUrl más variants opcional |
video | objeto | Video de fondo. defaultUrl, variants opcional y mute |
audio | arreglo | Pistas de audio. Cada una con id, defaultUrl, variants opcional y primary |
poster | objeto | Imagen fija antes de la reproducción. url más variants opcional |
fonts | arreglo | Artefactos de glifos vectorizados, fusionados en el Lottie antes de renderizar |
fonts
Cada entrada es un artefacto .font.json que el player descarga y fusiona en la animación
antes de renderizar. Por eso el texto personalizado se renderiza con la tipografía correcta
sin depender de una webfont en tiempo de ejecución — sin @font-face, sin FOUT, y sin
depender de que la máquina del destinatario tenga la fuente.
| Clave | Propósito |
|---|---|
family | Nombre de la familia tipográfica referenciada por el Lottie |
fName | Nombre de fuente usado dentro de la animación |
url | Dónde descargar el artefacto de glifos |
style | Calificador de estilo opcional |
ascent | Override de ascendente opcional |
Personalización
| Campo | Tipo | Propósito |
|---|---|---|
dataSchema | objeto | Declara los datos que el template espera |
computed | arreglo | Valores derivados de los datos entregados antes de renderizar |
dataSchema
Cada clave describe un dato:
| Clave | Propósito |
|---|---|
type | string, number o boolean |
required | Si los datos del viewer deben proveerlo |
label, description | Texto para las personas, en el backoffice |
fallback | Valor usado cuando los datos no lo entregan |
fallback es lo que hace resiliente a un template: un dato faltante renderiza el fallback
en vez de fallar.
computed
Cada entrada es { key, expr, outputType? }. La expresión se evalúa contra los datos del
viewer antes de renderizar, y key se escribe de vuelta en los datos — así los campos
computados posteriores pueden construir sobre los anteriores.
Las operaciones disponibles incluyen aritmética y redondeo (+, round, floor, ceil),
lógica (if, and, or, in), concatenación (cat) y helpers de formato:
| Operación | Propósito |
|---|---|
formatCLP | Formato de moneda en pesos chilenos |
formatNumber | Formato de números |
formatPercent | Formato de porcentajes |
formatDate | Formato de fechas (YYYY, MMM, LL, short, long, numeric…) |
Esto es lo que permite que un template muestre "ahorraste $1.234.567 este año" a partir de un número crudo, sin que el sistema del cliente tenga que pre-formatear nada.
Ruteo entre variantes
lottie, video, audio, poster, textTracks y transcript aceptan variants, y
todos usan la misma forma de regla:
{
"variants": {
"rules": [
{ "dataKey": "segmento", "equals": "premium", "src": "https://…/premium.json" }
]
}
}
Una regla coincide cuando el dataKey indicado en los datos del viewer es igual al valor
dado. La regla que coincide entrega el asset — overlayUrl, videoUrl, audioUrl,
posterUrl, src, o text en línea para transcripciones. Un viewer que no coincide con
ninguna regla recibe el default.
La comparación es estricta, así que conviene que la regla se apoye en un campo computado
booleano o numérico en vez de un data point crudo: los datos del host suelen llegar como
texto, y "true" no es igual a true. El publicador emite un computado justamente por eso.
El poster sigue su PROPIO ruteo, independiente del video. Un template que rutea su video por un data point normalmente quiere que la imagen fija siga la misma rama —si no, anuncia una versión del video que a ese viewer no le va a tocar— pero se declaran por separado, así que pueden divergir a propósito.
Así un mismo template sirve a muchas audiencias: el ruteo ocurre por viewer, al momento de la vista, sin renderizar un video distinto por segmento.
Accesibilidad
| Campo | Tipo | Propósito |
|---|---|---|
textTracks | arreglo | Subtítulos temporizados pintados sobre el video |
transcript | objeto | Alternativa textual completa de todo el video |
No son lo mismo, y la distinción importa para cumplimiento.
textTracks son subtítulos temporizados — cada uno con id, label, srcLang, src,
variants opcional y default. Sirven a quien puede ver el video pero no oírlo.
transcript es la alternativa textual WCAG 1.2.1 / 1.2.8: el texto completo del video, útil
para un lector de pantalla, cosa que los subtítulos temporizados no son. Lleva tokens
{dataKey} que se interpolan con los datos resueltos del viewer — una transcripción tiene
que describir lo que ese viewer vio — y soporta el mismo ruteo por variants, así que un
viewer ruteado a otra composición lee el texto de esa composición.
El texto va en línea y no en un archivo aparte. En un template de 40 variantes las transcripciones medían 53 KB en crudo pero 1,7 KB comprimidas, porque son ~91% idénticas — archivos externos no habrían aportado nada.
Interacciones
interactions mapea un id de CTA a lo que ocurre al hacer clic. Las claves se comparan
contra el id de CTA emitido, sin distinguir mayúsculas.
| Clave | Propósito |
|---|---|
navigate | Abre la URL contenida en el dato nombrado por linkDataKey, con target opcional |
setData | Fusiona valores en los datos vivos, recalcula campos computados y reglas de variantes, y re-renderiza en el lugar |
name | Etiqueta legible, reportada como cta_name en el evento cta.clicked. Si falta, se usa el id del CTA |
question | Agrupa varios CTAs en una sola pregunta de encuesta |
setData
setData re-renderiza en el lugar — sin navegación ni recarga. Los valores pueden ser
escalares literales o expresiones JSON-logic evaluadas contra los datos vivos al momento del
clic, que es lo que habilita flujos como un selector de cantidad acotado.
El player evalúa cada valor de forma defensiva y conserva los datos previos cuando un valor no es evaluable. Un valor mal formado nunca se rechaza al cargar el manifiesto, porque eso haría fallar el manifiesto completo en vez de anular una sola clave.
Cuando ambos están presentes
Ambos se ejecutan, en un orden definido: primero se aplica el parche de datos — así el link que ese mismo parche define es el que se abre — luego el link se abre sincrónicamente dentro del clic, y el re-render queda encolado detrás. El clic pausa automáticamente, como toda navegación.
question
Las respuestas de una encuesta se autoran como CTAs independientes, así que sin question
un clic es sólo un clic. Si dos CTAs comparten el mismo question, el player además emite
interaction.engaged, con la pregunta como interaction_id / interaction_name y la
etiqueta del CTA como interaction_value — que es lo que permite a la analítica reportar
una distribución ("62% respondió Sí") en vez de dos conteos sin relación.
Es sólo para analítica y no afecta la reproducción.