Mass, not outline
The body is one filled shape with no neck and no contour line. The white face simply sits on top of it — that overlap is the chin. Outlining the figure is what collapses this style into clip art.
One hundred figures · one style
Ink-silhouette illustrations for the moments your interface has nothing to show yet — loading, empty, missing. Same face, same desk. Hair, drink, and prop change.
Seventeen haircuts, six drinks, thirty-three desk objects. One hundred combinations, still one set.
Everything in Stuffy follows them. Break one and it reads as a different drawing.
The body is one filled shape with no neck and no contour line. The white face simply sits on top of it — that overlap is the chin. Outlining the figure is what collapses this style into clip art.
Every edge runs through a noise filter whose seed flips eight times a second, so it wobbles the way hand-redrawn frames do. One SVG filter, no frames to draw.
A nose and a mouth. No eyes at all — the gaze is down at the cup, so they simply are not drawn. Adding them back flattens the whole thing.
Plain SVG. No runtime, no dependency, roughly two kilobytes each.
// the pile of notes is the progress bar — one per 20%
<LoadingCurtain progress={pct} character="curls" />
// hold it a beat so a warm cache doesn't flash it
await Promise.all([
document.fonts.ready,
new Promise((r) => addEventListener("load", r, { once: true })),
]);
setTimeout(() => setDone(true), Math.max(0, 1400 - elapsed));