npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@easybits.cloud/confetti

v0.1.0

Published

Confeti de papelitos con contorno que caen girando: una función, cero dependencias, Web Animations API y se limpia solo. Incluye componente de React.

Readme

@easybits.cloud/confetti

Papelitos morados y amarillos con contorno cayendo sobre una tarjeta de «¡Listo!»

El confeti de EasyBits y Ghosty: papelitos sesgados con contorno que bailan de lado, giran en X y caen dando vueltas. Es una sola función, no tiene dependencias, usa la Web Animations API y se limpia solo cuando el último papelito toca el piso.

  • Cero dependencias, ~3 KB minificado (~1.5 KB con gzip).
  • Capa position: fixed encima de todo y que deja pasar los clics.
  • CSS inyectado una sola vez, con clases propias (.ebc-*) para no chocar con tu página.
  • Respeta prefers-reduced-motion.
  • Modo loop para una lluvia que no para hasta que tú digas.
  • Componente de React opcional.

Instalación

npm install @easybits.cloud/confetti

Uso sin framework

import { confetti } from "@easybits.cloud/confetti";

// Una sola caída; se quita sola.
confetti();

// Espera a que termine.
await confetti({ count: 120 }).done;

// Lluvia infinita (pantalla de pago exitoso, por ejemplo) y cortarla después.
const rain = confetti({ loop: true });
setTimeout(() => rain.stop(), 10_000);

confetti() regresa { done, stop }: done es una promesa que se resuelve cuando la capa ya no está en la página y stop() la quita con un desvanecido corto. En el servidor (SSR) no hace nada, así que puedes llamarla sin miedo.

Uso con React

import { Confetti } from "@easybits.cloud/confetti/react";

function Checkout() {
  const [fire, setFire] = useState(0);
  return (
    <>
      <button onClick={() => setFire((n) => n + 1)}>Pagar</button>
      <Confetti fire={fire} />
    </>
  );
}

Cada vez que fire cambia sale otra tanda; con 0 o false no sale nada. Para la lluvia infinita: <Confetti fire loop />, y se detiene sola cuando el componente se desmonta.

Opciones

| Opción | Tipo | Default | Qué hace | |---|---|---|---| | count | number | 80 | Cuántos papelitos. | | colors | string[] | #f0d36b, #c4b0f5, #9870ed | Colores de relleno. Repite uno para darle más peso. | | outline | string | #111 | Color del contorno. | | duration | [min, max] | [3500, 6000] | Cuánto tarda cada papelito en caer, en ms. | | delay | [min, max] | [0, 1800] ([0, 5000] en loop) | Retraso de salida de cada papelito, en ms. | | loop | boolean | false | Lluvia infinita hasta llamar stop(). | | zIndex | number | 60 | z-index de la capa. | | respectReducedMotion | boolean | true | Si el sistema pide menos movimiento, no sale nada. |

La historia del bug de la esquina

La primera versión vivía en EasyBits como componente de React y tenía un detalle que nunca se dejó arreglar a mano: cada papelito empezaba en top: -2rem; left: -2rem y esperaba hasta 5 segundos su turno. Como la animación no tenía fill: "backwards", durante esa espera el papelito se quedaba en su lugar del CSS, y los 80 se amontonaban en la esquina superior izquierda antes de salir volando. Aquí la caída usa fill: "both": mientras espera, el papelito ya está en su primer cuadro, arriba y fuera de la vista. De paso, la capa es fija (ya no se va con el scroll), una sola caída termina y se quita, y el helper de números al azar ya no se pisa el mínimo.

Licencia y autor

MIT © bliss (@blissito).

Basado en un confeti que bliss adaptó y modificó a mano.