Por encima del límite
El relleno se limita al 100% en el parcial.
stat
Un número en un panel, con una etiqueta y cuánto ha cambiado.
El número grande
Pon esto dentro de <div rst-stats>.
<divrst-stat="lead">
<spanrst-stat-label>Ingresos de este mes</span>
<spanrst-stat-num>€48,210</span>
<spanrst-stat-deltarst-tone="positive">+12%</span>
<spanrst-stat-note>frente al mes pasado</span>
</div>
Pon esto dentro de <div rst-stats>.
{{template"stat"dict"Label""Ingresos de este mes""Value""€48,210""Delta""+12%""Tone""positive""Note""frente al mes pasado""Lead"true}}
Añade Lead a una cifra de la fila para hacerla grande. Es el mismo componente, solo que más grande.
Un número más pequeño
Pon esto dentro de <div rst-stats>.
<divrst-stat>
<spanrst-stat-label>Facturas sin pagar</span>
<spanrst-stat-num>24</span>
</div>
Pon esto dentro de <div rst-stats>.
{{template"stat"dict"Label""Facturas sin pagar""Value""24"}}
Solo necesitas una etiqueta y un número. Todo lo demás es opcional.
Cuando bajar es bueno
Pon esto dentro de <div rst-stats>.
<divrst-stat>
<spanrst-stat-label>Tiempo hasta la primera respuesta</span>
<spanrst-stat-num>1 h 12 min</span>
<spanrst-stat-deltarst-tone="positive">−38%</span>
<spanrst-stat-note>frente a la semana pasada</span>
</div>
Pon esto dentro de <div rst-stats>.
{{template"stat"dict"Label""Tiempo hasta la primera respuesta""Value""1 h 12 min""Delta""−38%""Tone""positive""Note""frente a la semana pasada"}}
El color lo decides tú, no el componente. Aquí el número ha bajado y eso es buena noticia, así que el cambio va en verde.
Cuando subir es malo
Pon esto dentro de <div rst-stats>.
<divrst-stat>
<spanrst-stat-label>Pagos fallidos</span>
<spanrst-stat-num>9</span>
<spanrst-stat-deltarst-tone="negative">+3</span>
<spanrst-stat-note>frente a la semana pasada</span>
</div>
Pon esto dentro de <div rst-stats>.
{{template"stat"dict"Label""Pagos fallidos""Value""9""Delta""+3""Tone""negative""Note""frente a la semana pasada"}}
Aquí el número ha subido y eso es mala noticia, así que el cambio va en rojo.
Cuando no puedes decirlo
Pon esto dentro de <div rst-stats>.
<divrst-stat>
<spanrst-stat-label>Duración media de la sesión</span>
<spanrst-stat-num>4 min 12 s</span>
<spanrst-stat-deltarst-tone="neutral">+18 s</span>
<spanrst-stat-note>desde el viernes</span>
</div>
Pon esto dentro de <div rst-stats>.
{{template"stat"dict"Label""Duración media de la sesión""Value""4 min 12 s""Delta""+18 s""Note""desde el viernes"}}
Omite el color y el cambio se muestra en gris. Hazlo cuando no puedas decir si es bueno o malo.
¿Muestras 4.1k en lugar de 4120? Pon el número completo en Exact. Los lectores de pantalla solo leen lo que está en pantalla, así que deja en el propio número todo lo que una persona necesite.
person
Avatar con iniciales, nombre y correo. Sirve para identificar rápido los registros de personas.
<arst-personhref="/people/3">
<spanrst-person-av="empty"aria-hidden="true"></span>
<spanrst-person-meta>
<spanrst-person-name>Invitación sin aceptar</span>
<spanrst-person-email>invited@example.com</span>
</span>
</a>
{{template"person"dict"Href""/people/3""Name""Invitación sin aceptar""Email""invited@example.com"}}
actor
Quién hizo algo, en palabras: el nombre de una persona, o el agente y la persona por la que actuó. Sin insignia ni icono.
Un agente que actúa por una persona
<spanrst-actor>Claude para Grace Hopper</span>
{{template"actor"dict"Actor".Actor}}
Define ui.ActorName una vez al arrancar para convertir un sujeto en un nombre. La propia aplicación, el Actor cero, no renderiza nada.
Una persona
<spanrst-actor>Grace Hopper</span>
{{template"actor"dict"Actor".Actor}}
callout
El único vocabulario de avisos: franja con color, icono de tono, título en negrita opcional y un párrafo de cuerpo.
info
<divrst-calloutrst-tone="info">
<spanrst-callout-icaria-hidden="true">
<svgclass="icon"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"aria-hidden="true"><circlecx="12"cy="12"r="10"/><pathd="M12 16v-4"/><pathd="M12 8h.01"/></svg>
</span>
<divrst-callout-body>
<p>Las entradas solo son visibles para los miembros hasta que se publique el sitio.</p>
</div>
</div>
{{template"callout"dict"Body""Las entradas solo son visibles para los miembros hasta que se publique el sitio.""Tone""info"}}
{{template"callout"dict"Body""Ya puedes cobrar las entradas.""Title""Los pagos están conectados""Tone""positive"}}
warning
<divrst-calloutrst-tone="warning">
<spanrst-callout-icaria-hidden="true">
<svgclass="icon"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"aria-hidden="true"><pathd="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><pathd="M12 9v4"/><pathd="M12 17h.01"/></svg>
</span>
<divrst-callout-body>
<strong>Conecta los pagos para empezar a vender</strong>
<p>Tu evento está publicado, pero aún no puede cobrar.</p>
</div>
</div>
{{template"callout"dict"Body""Tu evento está publicado, pero aún no puede cobrar.""Title""Conecta los pagos para empezar a vender""Tone""warning"}}
negative
<divrst-calloutrst-tone="negative">
<spanrst-callout-icaria-hidden="true">
<svgclass="icon"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"aria-hidden="true"><circlecx="12"cy="12"r="10"/><pathd="m15 9-6 6"/><pathd="m9 9 6 6"/></svg>
</span>
<divrst-callout-body>
<strong>La última importación falló</strong>
<p>No se cambió nada. Corrige la fila 91 y vuelve a intentarlo.</p>
</div>
</div>
{{template"callout"dict"Body""No se cambió nada. Corrige la fila 91 y vuelve a intentarlo.""Title""La última importación falló""Tone""negative"}}
negative, anunciado como alerta
<divrst-calloutrst-tone="negative"role="alert">
<spanrst-callout-icaria-hidden="true">
<svgclass="icon"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"aria-hidden="true"><circlecx="12"cy="12"r="10"/><pathd="m15 9-6 6"/><pathd="m9 9 6 6"/></svg>
</span>
<divrst-callout-body>
<strong>La importación se detuvo</strong>
<p>No se cambió nada. Corrige la fila 91 y vuelve a intentarlo.</p>
</div>
</div>
{{template"callout"dict"Body""No se cambió nada. Corrige la fila 91 y vuelve a intentarlo.""Title""La importación se detuvo""Tone""negative""Alert"true}}
alert añade role="alert" para mostrar mensajes importantes.
detail-list
Lista de definiciones sobre un registro en una pantalla de detalle. La marca mono es para valores de aspecto técnico.
Cuatro datos, uno de aspecto técnico
Pon esto dentro de <section rst-box>.
<dlrst-detail>
<dt>Público</dt>
<dd>Miembros</dd>
<dt>Página principal</dt>
<dd>No</dd>
<dt>Publicado</dt>
<dd>
<timedatetime="2026-08-02">2 de agosto de 2026</time>
</dd>
<dt>Referencia</dt>
<ddclass="rst-mono">post_01H9ZQ</dd>
</dl>
Pon esto dentro de <section rst-box>.
{{template"detail-list"dict"Items" (list
(dict"Label""Público""Value""Miembros")
(dict"Label""Página principal""Value""No")
(dict"DateTime""2026-08-02""Label""Publicado""Value""2 de agosto de 2026")
(dict"Label""Referencia""Mono"true"Value""post_01H9ZQ"))}}
notice
Una confirmación de una línea después de una redirección. Recibe una cadena simple, no un dict, y no dibuja nada si está vacía.
Un mensaje de guardado
<prst-noticerole="status">Entrada guardada.</p>
{{template"notice""Entrada guardada."}}
region:notice
El aviso que cada marco mantiene en la página, con el Notice de los datos de la página, para que un lector de pantalla oiga el mensaje y live.js pueda rellenarlo en su sitio.
La línea de resumen de errores de un formulario, role="alert". Recibe una cadena simple; no dibuja nada cuando no hay error.
Un envío rechazado
<prst-form-errorrole="alert">Ese título ya está en uso.</p>
{{template"form-error""Ese título ya está en uso."}}
job-status
El fragmento consultado de una tarea en segundo plano. El atributo data-poll solo se emite mientras la tarea se ejecuta: omitirlo es la forma de detener el sondeo.
En marcha
<divrst-jobdata-poll="/jobs/1/fragment"data-poll-every="2">
<spanrst-spinaria-hidden="true"></span> <bdi><strong>Importación</strong></bdi> en curso: <bdi>128 de 400</bdi>…
<progressrst-job-barvalue="32"min="0"max="100"aria-hidden="true"></progress>
</div>
{{template"job-status"dict"Name""Importación""Percent" 32
"PollSeconds" 2
"PollURL""/jobs/1/fragment""Progress""128 de 400""Status""running"}}
Este hace sondeo: es la única muestra de la página que le pide algo a la red y, en un sitio estático, sencillamente nunca se resuelve.
Terminado
<divrst-job>
<bdi><strong>Importación</strong></bdi> ha terminado.
</div>