Package Exports
- drop-spinner
- drop-spinner/dist/index.js
- drop-spinner/dist/index.mjs
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (drop-spinner) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
drop-spinner
Librería liviana para seleccionar aleatoriamente un elemento de una lista con una animación visual de "drop". Puedes usarla como función utilitaria o como Web Component. Diseñada para funcionar en navegadores, y con guardias para uso en entornos SSR (por ejemplo Next.js).
Instalación
npm install drop-spinnerUso como función (navegador)
La función dropSpinner(options) en cliente montará temporalmente el componente <drop-spinner> en el DOM, ejecutará la animación y devolverá una Promise que se resuelve con el elemento seleccionado.
import { dropSpinner } from 'drop-spinner';
async function run() {
const picked = await dropSpinner({
items: ['🍎', '🍌', '🍇', '🍉'],
animationSpeed: 1200,
circleSize: 220,
onPick: (item) => console.log('callback pick:', item),
});
console.log('Picked (promise):', picked);
}
run();En entornos sin DOM (por ejemplo Node.js), dropSpinner mantiene un comportamiento síncrono y devuelve directamente el item elegido (y llamará onPick si se indicó).
Uso en Next.js (u otra app SSR)
El paquete exporta registerDropSpinner() para que registres el Web Component de forma segura solo en el cliente (evita errores en SSR). Recomiendo registrar el componente dentro de un useEffect.
Ejemplo con React / Next.js:
import { useEffect } from 'react';
import { registerDropSpinner, dropSpinner } from 'drop-spinner';
export default function Page() {
useEffect(() => {
// Registra el custom element solo en cliente
registerDropSpinner();
}, []);
const handle = async () => {
const result = await dropSpinner({ items: ['A', 'B', 'C'] });
alert('Winner: ' + result);
};
return <button onClick={handle}>Sortear</button>;
}Si prefieres usar el Web Component directamente en JSX/HTML, regístralo y luego insértalo en el DOM:
useEffect(() => registerDropSpinner(), []);
return (
<div>
<drop-spinner items='["🍎","🍌","🍇"]' animation-speed="1000" circle-size="200"></drop-spinner>
</div>
);Uso como Web Component (puro HTML)
- Compila el paquete a JS (
npm run build) y sirve los archivos. - Incluye el módulo en tu HTML o empaqueta el bundle en tu app cliente.
Ejemplo:
<script type="module" src="/path/to/DropSpinnerElement.js"></script>
<drop-spinner items='["🍎","🍌","🍇","🍉"]' animation-speed="1000" circle-size="200"></drop-spinner>
<script>
document.querySelector('drop-spinner')?.addEventListener('pick', e => {
console.log('picked event:', e.detail.item);
});
</script>También puedes llamar programáticamente al método pick() del componente (devuelve Promise):
const el = document.querySelector('drop-spinner');
el?.pick().then(item => console.log('picked by el.pick():', item));API
Interfaz DropSpinnerOptions
interface DropSpinnerOptions {
items: string[]; // elementos (texto o URLs de imagen)
animationSpeed?: number; // ms, por defecto 1000
circleSize?: number; // px, por defecto 200
onPick?: (item: string) => void; // callback opcional
}Funciones exportadas
dropSpinner(options)— En cliente devuelvePromise<string>que se resuelve con el elemento seleccionado tras la animación. En entornos sin DOM devuelvestring(síncrono).registerDropSpinner()— Registra el custom elementdrop-spinnerde forma segura en entornos cliente (útil en Next.js). Puedes llamarlo dentro deuseEffect.
Web Component
<drop-spinner>soporta los atributositems(JSON string),animation-speedycircle-size. También expone el métodopick(): Promise<string>y emite un eventopickcondetail.item.
Build & typings
El paquete usa tsup. Para compilar:
npm run buildSe generarán los bundles para CommonJS y ESM y las declaraciones .d.ts.
License
MIT