Skip to content

Commit 8acc71b

Browse files
committed
fix(skill)!: rewrite text-effects bundle from scratch (license blocker)
Closes Rames's blocker on PR #991. The previous text-effects bundle was vendored from `pixel-point/animate-text`, which the GitHub API confirms has no license: GET /repos/pixel-point/animate-text → license: null GET /repos/pixel-point/animate-text/license → 404 With no explicit license, default US copyright is "all rights reserved" by the upstream author. Cannot ship under Apache 2.0. This commit replaces the 48 vendored JSON files (8451 lines) with a 24-file rewrite (525 lines) using a fresh, simpler schema. The effect IDs (typewriter, soft-blur-in, etc.) are concept names — not copyrightable. The schema (`enter`/`exit`/`swap`, `target`, `durationMs`/`staggerMs`/`easing`) is standard motion-design vocabulary. Per-effect parameter values are picked from motion-design intuition for each effect's intent — not copied. ### Structure changes Before: dual directory + per-effect schema duplication assets/text-effects/effects/<id>.json (~330 lines each, GSAP recipe + embedded spec) assets/text-effects/specs/<id>.json (~40 lines each, portable contract — duplicates the spec section above) After: flat single-file-per-effect with one shared rendering pattern assets/text-effects/<id>.json (~20 lines each, just the per-effect parameters) references/text-effects.md (shared GSAP rendering pattern, documented ONCE with split rules, CustomEase wiring, layout-aware exceptions) The shared rendering pattern (split by target → set initial state → stagger to enter.to → exit symmetric to enter → hard-kill at beat boundary) is in text-effects.md instead of repeated in every effect JSON. Sub-agents read the catalog once and the per-effect JSON gives them the parameters. ~94% smaller file footprint, single canonical implementation pattern. ### Per-effect schema { id, name, description, target, enter, exit, swap, notes? } target = "char" | "word" | "line" | "element" enter / exit = { durationMs, staggerMs?, staggerOrder?, easing, from, to } swap = { mode: "crossfade" | "sequential", overlapMs, microDelayMs } notes = implementation guidance (when present) layoutAware = true for the 3 effects whose line container animates separately (kinetic-center-build, short-slide-right, short-slide-down) ### Reference updates - references/text-effects.md: rewritten with our own catalog table, fresh duration / stagger values per effect, and the shared GSAP rendering pattern as one canonical section instead of per-effect recipes. - step-3-storyboard.md: path references updated from `text-effects/effects/[id].json` → `text-effects/[id].json`. Removed the upstream-specific `showcase.library_adapters.gsap` reference; sub-agents now read the per-effect params + the shared rendering pattern in text-effects.md. 24 effects total, unchanged set: 7 per-character, 8 per-word, 2 per-line, 7 whole-element. The 3 layout-aware effects keep their custom behavior documented in their JSON `notes` field and in text-effects.md's layout-aware section.
1 parent 957aa1d commit 8acc71b

74 files changed

Lines changed: 644 additions & 8524 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"id": "blur-out-up",
3+
"name": "Blur Out Up",
4+
"description": "Words arrive clean and exit upward with increasing blur. The entrance is matter-of-fact; the exit dissolves into atmosphere. Asymmetric pairing — good when the line should feel like it lingers in the viewer's memory rather than getting decisively dismissed.",
5+
"target": "word",
6+
"enter": {
7+
"durationMs": 360,
8+
"staggerMs": 90,
9+
"easing": "cubic-bezier(0.22, 1, 0.36, 1)",
10+
"from": { "opacity": 0, "y": 6 },
11+
"to": { "opacity": 1, "y": 0 }
12+
},
13+
"exit": {
14+
"durationMs": 520,
15+
"staggerMs": 22,
16+
"easing": "cubic-bezier(0.22, 1, 0.36, 1)",
17+
"from": { "opacity": 1, "y": 0, "filter": "blur(0px)" },
18+
"to": { "opacity": 0, "y": -28, "filter": "blur(12px)" }
19+
},
20+
"swap": { "mode": "crossfade", "overlapMs": 200, "microDelayMs": 0 },
21+
"notes": "The 200ms overlap during swap is intentional — incoming text starts arriving while outgoing text is still mid-blur. Reads as a transition rather than a clean cut."
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"id": "bottom-up-letters",
3+
"name": "Bottom-Up Letters",
4+
"description": "Letters rise from below in a pronounced staircase. Each character takes more visual time than per-character-rise — the motion is larger, slower, and reads as confident punctuation rather than ambient build.",
5+
"target": "char",
6+
"enter": {
7+
"durationMs": 320,
8+
"staggerMs": 65,
9+
"easing": "cubic-bezier(0.18, 1, 0.32, 1)",
10+
"from": { "opacity": 0, "y": 56 },
11+
"to": { "opacity": 1, "y": 0 }
12+
},
13+
"exit": {
14+
"durationMs": 280,
15+
"staggerMs": 14,
16+
"easing": "cubic-bezier(0.7, 0, 0.84, 0)",
17+
"from": { "opacity": 1, "y": 0 },
18+
"to": { "opacity": 0, "y": -22 }
19+
},
20+
"swap": { "mode": "crossfade", "overlapMs": 80, "microDelayMs": 0 },
21+
"notes": "Pair with bold or display-weight headlines. The 65ms stagger creates an audible-feeling rhythm; works well when the headline lands on a beat marker in narration."
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"id": "depth-parallax-words",
3+
"name": "Depth Parallax Words",
4+
"description": "Per-word entrance where each word enters at a different scale and slight vertical offset, simulating depth — back words start smaller and lower, front words larger and at baseline. Reads as a 3D-feeling layered headline without needing a real Z-axis transform.",
5+
"target": "word",
6+
"enter": {
7+
"durationMs": 540,
8+
"staggerMs": 110,
9+
"easing": "cubic-bezier(0.22, 1, 0.36, 1)",
10+
"from": { "opacity": 0, "y": 18, "scale": 0.82 },
11+
"to": { "opacity": 1, "y": 0, "scale": 1 }
12+
},
13+
"exit": {
14+
"durationMs": 360,
15+
"staggerMs": 22,
16+
"easing": "cubic-bezier(0.7, 0, 0.84, 0)",
17+
"from": { "opacity": 1, "y": 0, "scale": 1 },
18+
"to": { "opacity": 0, "y": -8, "scale": 0.92 }
19+
},
20+
"swap": { "mode": "crossfade", "overlapMs": 120, "microDelayMs": 0 },
21+
"notes": "The scale + y combination is what reads as depth. Don't drop scale below 0.7 — at that point the word looks small rather than far. Keep above 0.8 for the parallax illusion to hold."
22+
}

skills/hyperframes/assets/text-effects/effects/blur-out-up.json

Lines changed: 0 additions & 335 deletions
This file was deleted.

skills/hyperframes/assets/text-effects/effects/bottom-up-letters.json

Lines changed: 0 additions & 348 deletions
This file was deleted.

skills/hyperframes/assets/text-effects/effects/depth-parallax-words.json

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)