Ribbon Drop
A copy-paste confetti & celebration component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.
Confetti & CelebrationHTMLCSSany framework
Copy into your project
HTML
<div class="nuda-confetti-ribbon" role="img" aria-label="Falling ribbon strips">
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:3%; --c:#e4ff54; --d:0s; --dur:3s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:14%; --c:#ff5db1; --d:.4s; --dur:4s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:25%; --c:#5dd0ff; --d:.8s; --dur:5s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:36%; --c:#fafafa; --d:1.2s; --dur:3s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:47%; --c:#e4ff54; --d:1.6s; --dur:4s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:58%; --c:#ff5db1; --d:0s; --dur:5s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:69%; --c:#5dd0ff; --d:.4s; --dur:3s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:80%; --c:#fafafa; --d:.8s; --dur:4s"></span>
<span class="nuda-confetti-ribbon__strip" aria-hidden="true" style="left:91%; --c:#e4ff54; --d:1.2s; --dur:5s"></span>
</div>CSS
/* Ribbon Drop
Multi-color ribbon strips flutter and wave as they fall.
Customize: per-strip --c color, --d/--dur timing. */
.nuda-confetti-ribbon {
position: relative;
width: 160px;
height: 110px;
background: #09090b;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
overflow: hidden;
}
.nuda-confetti-ribbon__strip {
position: absolute;
top: -30px;
width: 6px;
height: 22px;
background: var(--c, #e4ff54);
border-radius: 2px;
opacity: 0;
transform-origin: center;
animation:
nuda-confetti-ribbon-fall var(--dur, 4s) ease-in-out var(--d, 0s) infinite,
nuda-confetti-ribbon-wave var(--dur, 4s) ease-in-out var(--d, 0s) infinite;
}
@keyframes nuda-confetti-ribbon-fall {
0% { opacity: 0; transform: translateY(-30px); }
10% { opacity: 1; }
90% { opacity: 1; }
100% { opacity: 0; transform: translateY(132px); }
}
@keyframes nuda-confetti-ribbon-wave {
0% { transform: rotate(0deg) scaleY(1); }
25% { transform: rotate(20deg) scaleY(0.8); }
50% { transform: rotate(-15deg) scaleY(1.1); }
75% { transform: rotate(18deg) scaleY(0.85); }
100% { transform: rotate(0deg) scaleY(1); }
}
@media (prefers-reduced-motion: reduce) {
.nuda-confetti-ribbon__strip {
animation: none;
opacity: 1;
top: auto;
bottom: 8px;
transform: none;
}
}How to use Ribbon Drop
Paste the HTML where you need it and the CSS into a global stylesheet (or a <style> tag). Every class is prefixed nuda- so it never collides with Tailwind or your own styles. Tweak the CSS custom properties to match your design system.
Works in React, Vue, Svelte, Astro, Next.js, Nuxt, Laravel Blade, Django, Rails — or a single .html file. No npm install, no build step.