Install
That writes one file:compositions/components/confetti.html.
Source
confetti.html
confetti.html
<!--
Confetti - remocn component ported to HyperFrames authoring format.
Paste the markup and CSS into a composition. Drive the timeline integration
from a paused GSAP timeline so renders remain deterministic.
-->
<div class="hf-remocn-confetti">
<div class="mesh"></div>
<div class="card">
<div class="spot"></div>
<div>
<h3>Confetti</h3>
<p>A deterministic celebration burst with seeded particles and gravity.</p>
</div>
</div>
<span class="particle" style="--c: var(--accent, #f43f5e)"></span
><span class="particle" style="--c: var(--accent, #f59e0b)"></span
><span class="particle" style="--c: var(--accent, #22c55e)"></span
><span class="particle" style="--c: var(--accent, #38bdf8)"></span
><span class="particle" style="--c: var(--accent, #a855f7)"></span
><span class="particle" style="--c: var(--accent, #f43f5e)"></span
><span class="particle" style="--c: var(--accent, #f59e0b)"></span
><span class="particle" style="--c: var(--accent, #22c55e)"></span
><span class="particle" style="--c: var(--accent, #38bdf8)"></span
><span class="particle" style="--c: var(--accent, #a855f7)"></span
><span class="particle" style="--c: var(--accent, #f43f5e)"></span
><span class="particle" style="--c: var(--accent, #f59e0b)"></span
><span class="particle" style="--c: var(--accent, #22c55e)"></span
><span class="particle" style="--c: var(--accent, #38bdf8)"></span
><span class="particle" style="--c: var(--accent, #a855f7)"></span
><span class="particle" style="--c: var(--accent, #f43f5e)"></span
><span class="particle" style="--c: var(--accent, #f59e0b)"></span
><span class="particle" style="--c: var(--accent, #22c55e)"></span
><span class="particle" style="--c: var(--accent, #38bdf8)"></span
><span class="particle" style="--c: var(--accent, #a855f7)"></span
><span class="particle" style="--c: var(--accent, #f43f5e)"></span
><span class="particle" style="--c: var(--accent, #f59e0b)"></span>
</div>
<style>
.hf-remocn-confetti {
color: var(--fg, #111827);
font-family: var(--font-body, Inter, system-ui, sans-serif);
}
.hf-remocn-confetti {
position: relative;
width: 760px;
height: 428px;
overflow: hidden;
border-radius: var(--radius, 30px);
background: var(--bg, #080b12);
box-shadow: 0 28px 80px color-mix(in srgb, var(--bg, #0f172a) 20%, transparent);
}
.hf-remocn-confetti .mesh {
position: absolute;
inset: -22%;
filter: blur(44px);
opacity: 0.88;
background:
radial-gradient(
circle at var(--hf-x1, 20%) var(--hf-y1, 30%),
var(--accent, #60a5fa) 0 18%,
transparent 32%
),
radial-gradient(
circle at var(--hf-x2, 76%) var(--hf-y2, 52%),
var(--accent-2, #f472b6) 0 16%,
transparent 34%
),
radial-gradient(
circle at var(--hf-x3, 46%) var(--hf-y3, 78%),
var(--brand, #34d399) 0 18%,
transparent 34%
);
}
.hf-remocn-confetti .card {
position: absolute;
inset: var(--space-3, 74px) var(--space-3, 92px);
border: 1px solid color-mix(in srgb, var(--border, #ffffff) 16%, transparent);
border-radius: var(--radius, 26px);
background: color-mix(in srgb, var(--surface, #ffffff) 8%, transparent);
color: var(--fg, #fff);
display: grid;
place-items: center;
text-align: center;
overflow: hidden;
}
.hf-remocn-confetti .spot {
position: absolute;
width: 260px;
height: 260px;
border-radius: 50%;
background: radial-gradient(
circle,
color-mix(in srgb, var(--fg, #ffffff) 50%, transparent),
transparent 65%
);
transform: translate(var(--hf-spot-x, 0px), var(--hf-spot-y, 0px));
mix-blend-mode: screen;
}
.hf-remocn-confetti .particle {
position: absolute;
left: 50%;
top: 54%;
width: 12px;
height: 20px;
border-radius: var(--radius, 3px);
background: var(--c);
transform: translate(var(--hf-px, 0px), var(--hf-py, 0px)) rotate(var(--hf-pr, 0deg));
opacity: var(--hf-po, 0);
}
.hf-remocn-confetti h3 {
margin: 0;
font-size: 44px;
letter-spacing: -0.04em;
}
.hf-remocn-confetti p {
margin: var(--space-1, 8px) 0 0;
color: color-mix(in srgb, var(--muted, #ffffff) 70%, transparent);
}
</style>
<!--
Timeline integration:
tl.fromTo('.hf-remocn-confetti .mesh', { '--hf-x1': '18%', '--hf-y1': '28%', '--hf-x2': '78%', '--hf-y2': '46%', '--hf-x3': '44%', '--hf-y3': '80%' }, { '--hf-x1': '34%', '--hf-y1': '42%', '--hf-x2': '62%', '--hf-y2': '60%', '--hf-x3': '58%', '--hf-y3': '64%', duration: 4, ease: 'sine.inOut' }, startTime); tl.fromTo('.hf-remocn-confetti .spot', { '--hf-spot-x': '-120px', '--hf-spot-y': '-70px' }, { '--hf-spot-x': '190px', '--hf-spot-y': '90px', duration: 3, ease: 'sine.inOut' }, startTime); const particles_confetti = gsap.utils.toArray('.hf-remocn-confetti .particle'); if (particles_confetti.length) { tl.fromTo(particles_confetti, { '--hf-po': 0, '--hf-px': '0px', '--hf-py': '0px', '--hf-pr': '0deg' }, { '--hf-po': 1, '--hf-px': (i) => (Math.cos(i * 0.83) * 250) + 'px', '--hf-py': (i) => (-120 - Math.sin(i * 0.61) * 120) + 'px', '--hf-pr': (i) => (180 + i * 37) + 'deg', duration: 0.8, stagger: 0.015, ease: 'power2.out' }, startTime + 0.2); }
-->
Usage
Opencompositions/components/confetti.html and paste its contents into your composition. See the comment header in the file for timeline integration guidance.
Tagged effect remocn-port.