Diapositivas
Componentes editoriales de scene.slides: insignias, tarjetas, rótulos, listas, tablas e identidad de presentación
scene.slides reúne componentes editoriales listos para presentaciones y videos explicativos: insignias, tarjetas, rótulos, listas, tablas y la identidad visual de cada segmento. Cada componente se mide a partir de su texto y devuelve un grupo Drawable que se coloca y anima como cualquier objeto.
from gaanim import Scene
scene = Scene(frame=(16, 9), theme="presentation")
heading = scene.slides.section_header("Resultados", kicker="03").move_to(0, 2.6)
metric = scene.slides.stat_card("98%", "Precisión", delta="+4.2%", variant="success").move_to(-2.2, -0.4)
note = scene.slides.card("Conclusión", "El solver converge en 12 ms.", variant="accent").move_to(2.4, -0.4)
scene.play([heading.animate.fade_in(), metric.animate.grow_from_center(), note.animate.fade_in()], duration=1.0)
scene.render()
Los componentes comparten opciones de estilo:
variant: tono semántico del tema ("neutral","accent","success","warning"o"danger").appearance:"soft"(fondo suave),"solid"(fondo lleno) u"outline"(solo borde).color,backgroundyborder: colores explícitos que sustituyen los del tema.- Las medidas (
width,padding,gap,radius…) están en unidades de escena.
Texto vacío, variantes desconocidas o medidas inválidas lanzan ValueError.
Insignias y chips
Etiquetas cortas de estado, categoría o metadatos que se ajustan a su texto.
.move_to(...).| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
text | str | obligatorio | Etiqueta no vacía. |
radius | float | None | None | None da forma de píldora a partir de la altura medida. |
min_width | float | None | None | Ancho mínimo del panel. |
font / weight | str | None / int | None | None | Familia y peso de la etiqueta; sustituyen a style. |
style | TextStyle | None | None | Tipografía sobre el rol label del tema; su color, si lo tiene, sustituye el de la variante. |
markup | bool | None | None | False deja * y _ literales, como en scene.text; None sigue text_markup del tema. |
tag = scene.slides.badge("LISTO", variant="success", appearance="solid").move_to(-2.4, 1.2)
code = scene.slides.badge("_vel_max", font="DejaVu Sans Mono", weight=600, markup=False)
scene.play([tag.animate.grow_from_center()])dot=True), para filtros, estados y metadatos. Acepta las mismas opciones tipográficas que badge.live = scene.slides.chip("En vivo", variant="danger", appearance="outline")Tarjetas
Paneles de altura automática para contenido, métricas y citas.
| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
title | str | obligatorio | Encabezado. |
body / footer | str | None | None | Cuerpo con ajuste de línea y pie opcional. |
width / min_height | float | 4.2 / 1.8 | Ancho fijo y altura mínima. |
result = scene.slides.card("Resultado", "El solver converge.", "12 ms", variant="accent")delta). El valor y la variación usan el tono de la variante; no se infiere signo ni formato numérico.metric = scene.slides.stat_card("98%", "Precisión", delta="+4.2%", variant="success")quote = scene.slides.quote_card("La claridad importa.", "Gaanim", appearance="outline")Rótulos y encabezados
Portadas, cabeceras de sección y rótulos anclados a los bordes seguros.
panel=True la enmarca; accent colorea la regla.from gaanim import Scene
scene = Scene(frame=(16, 9), background="#0f172a")
opening = scene.slides.title_card("Movimiento vectorial", "Una explicación técnica", panel=True)
scene.play([opening.animate.fade_in().duration(0.7)])
scene.render()
kicker) y subtítulo opcionales. align (left, center o right) alinea todos los huecos; rule=True añade una regla de acento horizontal.heading = scene.slides.section_header("Método", kicker="02", align="center")position). Con width=None ocupa el ancho seguro menos margin; su altura sigue al título y al subtítulo.notice = scene.slides.banner("Simulación completa", position="bottom", variant="success")side="left" o "right"), con antetítulo, título y subtítulo que usan los roles del tema y se ajustan al ancho.speaker = scene.slides.lower_third("Ada Lovelace", "Matemática", kicker="PONENTE")target desde offset y lo sigue de forma nativa, sin callbacks de Python por fotograma.from gaanim import GOLD, Scene
scene = Scene(frame=(16, 9), background="#0f172a")
mass = scene.geometry.dot(0.15).fill(GOLD).move_to(-0.5, 0)
note = scene.slides.callout("Masa en movimiento", mass, offset=(1.625, 0.875))
scene.play([mass.animate.shift_by(1, 0).duration(1.0), note.animate.fade_in().duration(0.4)])
scene.render()
Listas y tablas
Agendas con viñetas y tablas técnicas compactas.
width. Ajusta width, gap, bullet_radius y bullet_color.from gaanim import GOLD, Scene
scene = Scene(frame=(16, 9), background="#0f172a")
agenda = scene.slides.bullets(["Preparar", "Animar", "Exportar"], gap=0.6, bullet_color=GOLD).move_to(0, 0.5)
scene.play([agenda.animate.fade_in().duration(0.6)])
scene.render()
scene.text.typst(...) (ver Texto).from gaanim import Scene
scene = Scene(frame=(16, 9), background="#0f172a")
tbl = scene.slides.table(["Método", "Error", "Tiempo"], [["Base", "0.18", "48 ms"], ["GPU", "0.04", "15 ms"]]).move_to(0, 0)
scene.play([tbl.animate.fade_in().duration(0.6)])
scene.render()
Identidad de la presentación
Logo, pie, regla y número de diapositiva comunes a todos los segmentos.
| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
logo | str | None | None | SVG o imagen; se ajusta a 0.6 unidades de alto en la esquina segura superior derecha. |
footer | str | None | None | Texto del pie. Empieza en el borde izquierdo del área segura y, si es muy largo, se reduce para caber. |
slide_numbers / rule | bool | True / True | Número de diapositiva y regla del pie; la regla ocupa el ancho del área segura. |
number_anchor | Anchor | None | None | Sin él, el número sigue al pie, abajo a la izquierda. Con un Anchor, va solo en ese punto del área segura: Anchor.BOTTOM_RIGHT lo deja libre de una barra de progreso a lo largo del borde inferior. |
show_on_cover | bool | False | Muestra la identidad también en la portada: el primer segmento y los que usan una plantilla de portada. |
logo_scale | float | 1.0 | Multiplica el tamaño del logo. |
scene.slides.brand(logo="assets/logo.svg", footer="LAB · 2026")
scene.segment("Portada")
scene.wait(0.5)
scene.segment("Contenido")
scene.wait(0.5)LEFT; la que fijes en la propia vista o con gaanim --present --duration la sustituye. scene.segment(..., target=) fija la de cada diapositiva. Un valor que no sea un número positivo lanza ValueError. Consulta El tiempo de la charla.| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
seconds | float | None | obligatorio | Duración prevista de la charla entera; None la quita. |
None — No añade nada a la escena.scene.slides.target(20 * 60)
scene.segment("Portada", target=60)
scene.wait(0.5)