Skip to content

Commit 69730f0

Browse files
committed
feat(registry): paper-collage-reveal transition
Agents often search for "collage" or "scrapbook" reveals and find nothing built for it in the catalog. Adds a component where a patchwork of torn paper scraps, each with its own texture and tilt, flutters away in a staggered scatter to reveal slotted content underneath.
1 parent 29378b6 commit 69730f0

8 files changed

Lines changed: 1075 additions & 1 deletion

File tree

‎docs/catalog/components/paper-collage-reveal.mdx‎

Lines changed: 472 additions & 0 deletions
Large diffs are not rendered by default.

‎docs/docs.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@
694694
},
695695
{
696696
"group": "Effects",
697-
"tag": "53",
697+
"tag": "54",
698698
"expanded": false,
699699
"pages": [
700700
"catalog/components/avatar-cloud",
@@ -729,6 +729,7 @@
729729
"catalog/components/ordered-dither-pass",
730730
"catalog/components/overwhelm-surround",
731731
"catalog/components/panel-reveal",
732+
"catalog/components/paper-collage-reveal",
732733
"catalog/components/parallax-device-dive",
733734
"catalog/components/parallax-unzoom",
734735
"catalog/components/parallax-zoom",

‎docs/public/catalog-index.json‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3550,6 +3550,22 @@
35503550
"href": "/catalog/components/parallax-zoom",
35513551
"preview": "https://static.heygen.ai/hyperframes-oss/docs/images/catalog/components/parallax-zoom.png"
35523552
},
3553+
{
3554+
"name": "paper-collage-reveal",
3555+
"type": "component",
3556+
"title": "Paper Collage Reveal",
3557+
"description": "A scrapbook patchwork of torn paper scraps, each with its own texture and tilt, flutters away in a staggered scatter to reveal the content underneath.",
3558+
"tags": [
3559+
"collage",
3560+
"scrapbook",
3561+
"torn paper",
3562+
"reveal",
3563+
"transition",
3564+
"motion-primitive"
3565+
],
3566+
"href": "/catalog/components/paper-collage-reveal",
3567+
"preview": "https://static.heygen.ai/hyperframes-oss/docs/images/catalog/components/paper-collage-reveal.png"
3568+
},
35533569
{
35543570
"name": "particle-image-reveal",
35553571
"type": "component",

‎docs/public/catalog/components/paper-collage-reveal.json‎

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
<!doctype html>
2+
<!--
3+
paper-collage-reveal demo. This standalone composition mounts the
4+
primitive FULL-BLEED through data-composition-src, 7 scraps and scatter
5+
spread to prove the non-default variable path, and slots a procedural
6+
scene so the reveal uncovers a real photo rather than the bare token card
7+
the primitive falls back to.
8+
-->
9+
<html lang="en">
10+
<head>
11+
<meta charset="UTF-8" />
12+
<meta name="viewport" content="width=1920, height=1080" />
13+
<title>Paper Collage Reveal Demo</title>
14+
<style>
15+
* {
16+
margin: 0;
17+
padding: 0;
18+
box-sizing: border-box;
19+
}
20+
html,
21+
body {
22+
width: 1920px;
23+
height: 1080px;
24+
overflow: hidden;
25+
background: #14161c;
26+
}
27+
#root {
28+
--bg: #14161c;
29+
--fg: #f2ede2;
30+
--surface: #fffdf8;
31+
--accent: #2f6fed;
32+
--accent-2: #b98a4e;
33+
position: relative;
34+
width: 1920px;
35+
height: 1080px;
36+
overflow: hidden;
37+
background: var(--bg);
38+
}
39+
.mount-bleed {
40+
position: absolute;
41+
inset: 0;
42+
container-type: size;
43+
overflow: hidden;
44+
}
45+
.demo-scene {
46+
position: absolute;
47+
inset: 0;
48+
}
49+
.demo-scene img {
50+
display: block;
51+
width: 100%;
52+
height: 100%;
53+
object-fit: cover;
54+
}
55+
.demo-caption {
56+
position: absolute;
57+
left: 64px;
58+
bottom: 64px;
59+
padding: 14px 22px;
60+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
61+
font-weight: 700;
62+
font-size: 30px;
63+
letter-spacing: 0.04em;
64+
color: #fff;
65+
background: rgba(10, 10, 12, 0.35);
66+
border-radius: 8px;
67+
backdrop-filter: blur(6px);
68+
}
69+
</style>
70+
</head>
71+
<body>
72+
<template data-slot="paper-collage-reveal-content">
73+
<div class="demo-scene">
74+
<img alt="" src="" id="demo-scene-img" />
75+
<div class="demo-caption">Field notes, spring</div>
76+
</div>
77+
</template>
78+
79+
<div
80+
id="root"
81+
data-composition-id="paper-collage-reveal-demo"
82+
data-start="0"
83+
data-width="1920"
84+
data-height="1080"
85+
data-duration="2.6"
86+
data-fps="30"
87+
>
88+
<div
89+
id="paper-collage-reveal-mount"
90+
class="mount-bleed clip"
91+
data-composition-id="paper-collage-reveal"
92+
data-composition-src="./paper-collage-reveal.html"
93+
data-variable-values='{"panels":7,"tone":"mixed","spread":"scatter"}'
94+
data-start="0"
95+
data-duration="2.6"
96+
data-track-index="0"
97+
data-width="1920"
98+
data-height="1080"
99+
></div>
100+
</div>
101+
102+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
103+
<script>
104+
(function () {
105+
// A procedural SVG scene, so the demo is deterministic and ships
106+
// nothing licensed (same approach as grade-split-reveal).
107+
function fieldScene() {
108+
return (
109+
'<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="900" viewBox="0 0 1600 900">' +
110+
'<defs><linearGradient id="fs-sky" x1="0" y1="0" x2="0" y2="1">' +
111+
'<stop offset="0" stop-color="#9fd0e8"/><stop offset="0.6" stop-color="#d9e9c9"/>' +
112+
'<stop offset="1" stop-color="#b7cf7c"/></linearGradient></defs>' +
113+
'<rect width="1600" height="900" fill="url(#fs-sky)"/>' +
114+
'<circle cx="1220" cy="200" r="80" fill="#fff8de"/>' +
115+
'<path d="M0 560 L260 500 L520 560 L800 480 L1080 560 L1360 500 L1600 550 L1600 900 L0 900 Z" fill="#7fa15a"/>' +
116+
'<path d="M0 620 L300 580 L620 630 L900 560 L1200 620 L1600 590 L1600 900 L0 900 Z" fill="#5c8442"/>' +
117+
'<g fill="#3f6330" opacity="0.8">' +
118+
'<circle cx="220" cy="700" r="18"/><circle cx="420" cy="740" r="14"/>' +
119+
'<circle cx="960" cy="700" r="20"/><circle cx="1310" cy="730" r="16"/></g>' +
120+
"</svg>"
121+
);
122+
}
123+
// Elements inside an inert <template> are not in the live document,
124+
// so they must be reached through the template's own content
125+
// fragment, never document.getElementById.
126+
document
127+
.querySelector('template[data-slot="paper-collage-reveal-content"]')
128+
.content.getElementById("demo-scene-img").src =
129+
"data:image/svg+xml;charset=utf-8," + encodeURIComponent(fieldScene());
130+
131+
window.__timelines = window.__timelines || {};
132+
window.__timelines["paper-collage-reveal-demo"] = gsap.timeline({ paused: true });
133+
})();
134+
</script>
135+
</body>
136+
</html>

0 commit comments

Comments
 (0)