$npx -y skills add heygen-com/hyperframes --skill cut-the-curveThe technique catalog: five velocity-matched SEAMS (zoom-through, INVERSE zoom-through, cut-the-curve, waterfall cut, rack-focus blur-cut) plus the two in-scene techniques — waterfall ENTRY (staggered arrival cascades for title cards / segment openers) and the nudge curve (slow-f
| 1 | # Cut the Curve — the technique catalog |
| 2 | |
| 3 | Five SEAM techniques, one principle: **cut at peak velocity, match direction and speed |
| 4 | on both sides of the cut** — plus the two in-scene techniques (§6 arrivals, §7 slides). |
| 5 | The seam LAW — vector law, the current, the ledger, the Seam Gate — lives in |
| 6 | `motion-doctrine`; read it first. This skill is the parameters and mechanics. |
| 7 | All GSAP code templates (worker + registry): `examples/gsap-implementation.md`. |
| 8 | |
| 9 | ## Catalog |
| 10 | |
| 11 | | # | Technique | Scope | Axis | Use for | |
| 12 | | --- | -------------------------- | ------------------------------ | ------------------- | ------------------------------------------------------ | |
| 13 | | 1 | **Zoom-Through** (forward) | Within-scene text swap | Z, toward viewer | progressing deeper into the same thought | |
| 14 | | 2 | **Inverse Zoom-Through** | Arrival / payoff beat | Z, away from viewer | something bigger lands | |
| 15 | | 3 | **Cut the Curve** | Between scenes | X / Y | the default boundary, the film's current | |
| 16 | | 4 | **Waterfall Cut** | Text-to-text seam | X, per-word | word-level handoff between big-text beats | |
| 17 | | 5 | **Rack-Focus Blur-Cut** | Same-surface state swap | X / Y / Z | the one cut you want SEEN — a DSLR focus-pull flourish | |
| 18 | | 6 | **Waterfall Entry** | In-scene ARRIVAL (no seam) | Y, from below | title cards, segment openers, list intros | |
| 19 | | 7 | **Nudge Curve** | In-scene group slide (no seam) | X / Y | repositioning a composed group to make room | |
| 20 | |
| 21 | ## Z direction is a sign |
| 22 | |
| 23 | "Same axis" is not enough on Z — the sign of d(scale)/dt must match across the cut: |
| 24 | |
| 25 | | Z vector | Exit scale | Entry scale | Variant | |
| 26 | | -------------- | ------------------- | -------------------- | -------------------- | |
| 27 | | Push (forward) | growing `1 → 1.2` | growing `0.75 → 1` | zoom-through | |
| 28 | | Pull (back) | shrinking `1 → 0.8` | shrinking `1.25 → 1` | inverse zoom-through | |
| 29 | |
| 30 | Banned mirrors: a receding exit answered by a grow-from-small entry (pull flips to push — |
| 31 | the common one, since grow-from-small is the default element entrance), and a push exit |
| 32 | answered by an oversized retraction. This binds the incoming scene's OWN entrances during |
| 33 | the seam window (cut + ~0.5s), not just the wrapper tween: hold the incoming frame |
| 34 | composed, or author its entrance to match the sign. Verify per Seam Gate rule 7. |
| 35 | |
| 36 | ## Blur logic (all Z variants) |
| 37 | |
| 38 | | Subject | Peak blur | Why | |
| 39 | | --------------------------------------------- | ----------- | -------------------------------------------------------------- | |
| 40 | | Text-scale (headline, word group) | **10px** | 20px smears letterforms — the cut reads as a glitch, not speed | |
| 41 | | Full-frame surface (window, card, screenshot) | **18–20px** | lighter blur on a big surface reads as a rendering hiccup | |
| 42 | |
| 43 | Same peak blur on both sides at the swap frame. Blur the WRAPPER, never children. |
| 44 | |
| 45 | --- |
| 46 | |
| 47 | ## 1. Zoom-Through (forward) |
| 48 | |
| 49 | Z-axis velocity-matched cut; **never both texts visible.** Everything GROWS: the outgoing |
| 50 | text accelerates toward camera, a hard swap hides at peak blur, the incoming text keeps |
| 51 | growing into the focal plane. Headlines and short phrases only. Total ≈ 0.4s. |
| 52 | |
| 53 | | Phase | Scale | Blur | Opacity | Ease | Duration | |
| 54 | | -------------- | -------- | -------- | ----------------- | ------------------------------------------ | -------- | |
| 55 | | Exit | 1 → 1.2 | 0 → 10px | 1 → 0.15 | power3.in (opacity: separate `none` tween) | 0.2s | |
| 56 | | Cut (`tl.set`) | in: 0.75 | 10 |