Warm paper, ink, one vermilion accent, and a serif you can read for an hour. These are the tokens and components behind every quinepub page. Change them in styles/tokens.css, and the guide and every live figure follow.
The explainers we hold ourselves to, and the one thing we borrowed from each.
One calm column broken by live, draggable figures. Words in the prose share colors with the things they name.
A running shader beside every idea, building up from step and smoothstep to whole effects.
Halftone, dithering, painterly and caustics, each explained with before/after playgrounds.
Each figure is built to answer one question, and the prose points straight at it.
Numbered figures, careful captions and a serif body: the web set like a journal.
Strong art direction and a voice. The typography sets the mood before you read a word.
Interactive essays paced like a good teacher: one small step, then let the reader try.
After Bret Victor: readers learn by manipulating, not by being told.
Neutrals carry everything. Toggle the night edition (top right) to see both sets.
Newsreader for reading and display, Inter for interface, JetBrains Mono for figures and code. The scale is a major third (×1.25).
--t-hero · serif--t-3xl · chapter--t-xl · entry title--t-lg · lede--t-md · bodyA ramp texture decides how many bands there are and where they fall. Bold terms like Fresnel link to their own entry.
--t-2xs · overlinemono · labelsA 4px base. Chapters breathe at 96px, entries at 64 by 32.
You’re designing an effect or naming a visual style.
The order of a triangle’s vertices decides which side is the front.
80s retro-futurism: a magenta sunset, a striped sun and an endless neon grid.
Recipe: gradient map + bloom + scanlines
① figure plate (paper-2, 3:2)
② Fig. n + purpose overlines
③ title + italic alias
④ definition (serif, ink-2)
⑤ optional recipe (hairlines)
⑥ “In use” quote (accent rule)
| You see… | Call it | Usual fix |
|---|---|---|
| Flickering stripes where two surfaces overlap | Z-fighting | Separate the surfaces or use polygonOffset |