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

moduloexemplo01

v1.0.1

Published

Este projeto contém a função `widget()`, responsável por gerar avatares procedurais em SVG de forma dinâmica e consistente a partir de uma *seed* (chave). O avatar é composto por várias camadas, como fundo, rosto, cabelo, olhos, boca e acessórios opcionai

Readme

Geração Procedural de Avatar — Documentação Completa

Este projeto contém a função widget(), responsável por gerar avatares procedurais em SVG de forma dinâmica e consistente a partir de uma seed (chave). O avatar é composto por várias camadas, como fundo, rosto, cabelo, olhos, boca e acessórios opcionais. Todas as informações abaixo foram extraídas e descritas com base nos arquivos presentes nas branches main e master do repositório.


🎯 Objetivo

Gerar automaticamente avatares SVG únicos e estáveis, utilizando um sistema de camadas, caminhos geométricos e escolhas baseadas em pseudoaleatoriedade controlada por uma chave (key). O avatar resultante é ideal para:

  • Foto de perfil
  • Representações visuais dinâmicas
  • Sistemas de identificação gerados automaticamente
  • Aplicações que requerem avatares consistentes baseados em um ID

🧠 Funcionamento da Função widget(key, draw)

A função recebe:

  • key: objeto gerador pseudoaleatório (seeded)
  • draw: instância do SVG.js usada para desenhar o avatar

O avatar é montado utilizando grupos de camadas, garantindo que os elementos sejam renderizados na ordem correta:

const backLayer = draw.group();
const bodyLayer = draw.group();
const faceLayer = draw.group();
const accessory = draw.group();

🗂️ Estrutura por Camadas

1. 🎨 Fundo

É criado um círculo grande de fundo utilizando uma cor provida pelo iterador:

const bgColor = nextColor();
backLayer.circle(900).center(500, 500).fill(bgColor);

2. 👤 Pele / Rosto

O rosto é um círculo centralizado, com a cor de pele escolhida de forma pseudoaleatória:

let face = bodyLayer.circle(baseSize)
    .center(cx, cy - 80)
    .fill(skinColor);

💇‍♂️ Cabelo — 5 Estilos

A cor e o estilo do cabelo são gerados a partir da seed. Os possíveis estilos são:

  1. Cabelo curto
  2. Cabelo longo
  3. Cabelo ondulado/topo destacado
  4. Topete curvado
  5. Careca

Cada estilo é desenhado usando path() ou ellipse().

Exemplo (cabelo curto):

faceLayer.path(`M${cx - 200},${cy - 210} 
    Q${cx},${cy - 300} ${cx + 200},${cy - 210} 
    L${cx + 200},${cy - 100} 
    Q${cx},${cy - 250} ${cx - 200},${cy - 100} Z`)
    .fill(hairColor);

👀 Olhos

São compostos por:

  • Círculo branco do olho
  • Pupila escura
faceLayer.circle(50).center(...).fill("white");
faceLayer.circle(20).center(...).fill("#333");

A posição é calculada com base no centro do avatar.


🪄 Sobrancelhas

Criadas usando caminhos curvos:

faceLayer.path(`M... Q... ...`)
    .stroke({ width: 8, linecap: "round" })
    .fill("none");

A cor acompanha a cor do cabelo.


👄 Boca — 3 Expressões

Dependendo da seed:

  • 0 → sorriso
  • 1 → neutra
  • 2 → triste

Exemplo (sorriso):

faceLayer.path(`M${cx - 80},${cy + 40} 
    Q${cx},${cy + 90} ${cx + 80},${cy + 40}`);

👕 Roupa

A camiseta é desenhada com um grande path:

bodyLayer.path(`M${cx - 120},${cy + 200}
    Q${cx},${cy + 280} ${cx + 120},${cy + 200}
    L${cx + 250},${cy + 450}
    L${cx - 250},${cy + 450} Z`)
    .fill(shirtColor);

🧢 Acessórios (opcionais)

Dependem do valor:

const accessoryChance = key.next() % 4;

Tipos:

0 — Óculos

Criados com rect() + line()
Desenha dois aros e uma ponte entre eles.

1 — Chapéu

Criado com dois retângulos:

accessory.rect(500, 50).center(...)
accessory.rect(250, 70).center(...)

2 e 3 — Nenhum acessório


🔁 Determinismo e Reprodutibilidade

Como tudo é baseado na chave (key):

  • A mesma seed sempre gera o mesmo avatar
  • Seeds diferentes produzem avatares totalmente distintos
  • Ideal para sistemas de usuário onde a chave é o ID do usuário

📦 Conclusão

A função widget() implementa um sistema completo de geração procedural de avatares em SVG utilizando:

  • Geometria vetorial
  • Paletas de cores
  • Paths complexos
  • Camadas de renderização
  • Acessórios dinâmicos
  • Personalizações controladas via seed

Esse sistema garante avatares:

  • Bonitos
  • Variados
  • Determinísticos
  • Fáceis de integrar em qualquer app

Gerado automaticamente com base nos arquivos das branches main e master.