← Files AgentBrokoARCHIVED FILE
src/video_forge/scenes/statement.py
1.32 KB · Sep 30, 2026 · 23:15 UTC
"""statement — one to three big centred lines. The workhorse scene.
scene fields: lines: [ "text" | {"text":..., "color":"ink|accent|muted"} ],
optional kicker (small label above), weight (default "medium")."""
from ._common import (color_for, drift, enter, new_canvas, parse_line, rise_dy)
def render(ctx):
cv = new_canvas(ctx)
W, H = cv.W, cv.H
p = ctx.p
lines = ctx.scene.get("lines") or [ctx.scene.get("text", "")]
weight = ctx.scene.get("weight", "medium")
max_w = W - 360
# Size to the widest line.
size = 108
for ln in lines:
s, _ = parse_line(ln)
size = min(size, cv.fit_size(s, weight, size, max_w, min_size=40))
lh = size * 1.16
kicker = ctx.scene.get("kicker")
kicker_gap = 78 if kicker else 0
block_h = lh * len(lines)
top = (H - block_h) / 2 + lh / 2 + kicker_gap / 2 + drift(p)
if kicker:
ka = enter(p, 0.0, 0.4)
cv.text_center(W / 2, top - block_h / 2 - kicker_gap, kicker.upper(),
"semibold", 26, cv.accent, tracking=6, alpha=ka)
for i, ln in enumerate(lines):
s, cname = parse_line(ln)
k = enter(p, 0.10 + i * 0.10, 0.44)
y = top + i * lh + rise_dy(k, 40)
col = color_for(cv, cname)
cv.text_center(W / 2, y, s, weight, size, col, alpha=k)
return cv.finish()
SHA-256: 35da0b50305c5198bb9ba16fb738df8931fed7a3d14c22ed9b48100f431468b0