Files
hyperframes/registry/components/line-swap/registry-item.json
T
Miguel Ángel 9734578e60 feat(registry): bring back the video-primitive moves (#3169)
Restores the 208 catalog items reverted after their previews 404'd in
production, this time on the payload mechanism rather than the .html files
that caused the outage.

The generator no longer writes a preview document to docs/public. That writer,
and the machinery under it, existed only to produce files the docs host
discards, so it is gone rather than bypassed. Items now embed the composition
itself via a payload, which is what the previous change already does for the
items that were already in the catalog.

The variables explorer is parked, not restored: it drove its preview through
the same unpublished .html path, so it would have shown an empty frame. Items
that declare variables get the live player plus the static variables table, and
reconnecting the explorer to payloads is a follow-up.
2026-08-10 18:46:03 -04:00

84 lines
2.8 KiB
JSON

{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "line-swap",
"type": "hyperframes:component",
"title": "Line Swap",
"description": "A masked full-line beat replacement: line A holds center then exits up through an overflow-hidden mask as line B enters bottom-up on the same beat, with an optional accent underline drawing beneath one word of line B.",
"tags": ["motion-primitive", "text-effects", "swap", "beat", "deterministic"],
"jobs": ["emphasize"],
"family": "text-effects",
"profile": "beat-swap",
"evidence": "Wave J2-5: generalizes flagship frame 01, the overflow-hidden mask slot with a single restrained beat replacement and a scaleX underline draw",
"syncPoints": [{ "id": "line-swap-beat", "phase": "in", "offset": 1.5 }],
"files": [
{
"path": "line-swap.html",
"target": "compositions/components/line-swap.html",
"type": "hyperframes:snippet"
}
],
"variables": [
{
"id": "line_a",
"type": "string",
"role": "content",
"label": "Line A",
"description": "First line; holds center inside the mask, then exits up on the swap beat.",
"default": "Everyone promised you AI."
},
{
"id": "line_b",
"type": "string",
"role": "content",
"label": "Line B",
"description": "Replacement line; enters bottom-up on the swap beat and holds.",
"default": "Almost nobody promised you control."
},
{
"id": "swap_at",
"type": "number",
"role": "timing",
"label": "Swap at",
"description": "Second (from mount start) of the beat replacement. Clamped so the swap and underline complete before any exit.",
"default": 1.5,
"min": 0,
"step": 0.1,
"unit": "s"
},
{
"id": "underline_word",
"type": "string",
"role": "content",
"label": "Underline word",
"description": "First case-insensitive substring match in line B gets the accent underline after landing. Empty disables it.",
"default": "control"
},
{
"id": "accent",
"type": "enum",
"role": "style",
"label": "Accent",
"description": "Underline color from the contract token map.",
"default": "green",
"options": [
{ "value": "green", "label": "Green" },
{ "value": "blue", "label": "Blue" },
{ "value": "violet", "label": "Violet" }
]
},
{
"id": "exit",
"type": "enum",
"role": "timing",
"label": "Exit",
"description": "Optional departure. Default none: the landed line holds until the frame cuts.",
"default": "none",
"options": [
{ "value": "none", "label": "None" },
{ "value": "fade", "label": "Fade" },
{ "value": "up", "label": "Up" }
]
}
]
}