← Files AgentBrokoARCHIVED FILE

src/video_forge/scenes/split_compare.py

1.41 KB · Sep 30, 2026 · 23:15 UTC

↓ Download file

"""split_compare — two figures side by side across a hairline divider, e.g.
"$175 -> $0". Reference: the money transition.

scene fields: left/right = {"label":.., "value":.., "color":"ink|accent|muted"},
optional arrow (bool)."""

from ..easing import ease_out, ramp
from ._common import color_for, enter, new_canvas, rise_dy


def _side(cv, cx, side, k, W):
    label = side.get("label", "")
    value = str(side.get("value", ""))
    col = color_for(cv, side.get("color", "ink"))
    cy = cv.H / 2
    if label:
        cv.text_center(cx, cy - 92, label.upper(), "semibold", 24,
                       cv.pal["muted"], tracking=5, alpha=k)
    size = cv.fit_size(value or "0", "black", 150, W / 2 - 220, min_size=70)
    cv.text_center(cx, cy + 6 + rise_dy(k, 28), value, "black", size, col, alpha=k)


def render(ctx):
    cv = new_canvas(ctx)
    W, H = cv.W, cv.H
    p = ctx.p
    left = ctx.scene.get("left", {})
    right = ctx.scene.get("right", {})

    kd = enter(p, 0.05, 0.4)
    cv.line([(W / 2, H / 2 - 120), (W / 2, H / 2 + 120)], cv.pal["hair"],
            width=2, alpha=kd)

    kl = enter(p, 0.05, 0.42)
    kr = enter(p, 0.22, 0.42)
    _side(cv, W * 0.29, left, kl, W)
    _side(cv, W * 0.71, right, kr, W)

    if ctx.scene.get("arrow", True):
        ka = ease_out(ramp(p, 0.45, 0.8))
        cv.text_center(W / 2, H / 2 + 2, "→", "regular", 72,
                       cv.pal["ink"], alpha=ka)
    return cv.finish()

SHA-256: 8bb635f07e71c0ed2340febe94e36b6cf796e50a79bdf315b86f7bcf2498f376