Skip to content

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.

More confetti & celebration components

← Browse all NudaUI components