A typeface for rendering vertical bars data: waveforms, spectrums, diagrams, histograms, columns etc.

Playground • Google fonts • V-fonts • Wavearea
Place Wavefont[ROND,YELA,wght].woff2 into your project directory and use this code:
<style>
@font-face {
font-family: wavefont;
font-display: block;
src: url(./Wavefont[ROND,YELA,wght].woff2) format('woff2');
}
.wavefont {
--wght: 400;
font-family: wavefont;
font-variation-settings: 'wght' var(--wght), 'ROND' 30, 'YELA' 0;
}
</style>
<!-- Set values manually -->
<textarea id="waveform" class="wavefont" cols="100">
abcdefghijklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
</textarea>
<script>
// Set values programmatically (more precise)
waveform.textContent = Array.from({length: 100}, (_,i) => String.fromCharCode(0x100 + i)).join('')
</script>
Wavefont bars correspond to values from 0 to 100, assigned to different characters:
char = String.fromCharCode(0x100 + value)). U+0180 renders as max bar (off-by-one clamp guard), higher codepoints render blank — clamp values to 127.| Tag | Range | Default | Meaning |
|---|---|---|---|
wght |
4-1000 | 100 | Bar width, or boldness. Advance width scales with it: 100 ≙ 0.025em, 400 ≙ 0.1em, 1000 ≙ 0.25em. |
ROND |
0-100 | 100 | Border radius, or roundness (percent). |
YELA |
-100-100 | -100 | Alignment: bottom (-100), center (0) or top (100). |
To adjust axes via CSS:
.wavefont {
font-variation-settings: 'wght' var(--wght, 40), 'ROND' var(--rond, 0), 'YELA' var(--align, 0);
letter-spacing: 1ch; /* 1ch unit === 1 bar width */
}
- are selectable by double click., \t` etc.-–._* map to 1 value, | maps to max value, ▁▂▃▄▅▆▇█ map to corresponding bars.\u0101\u0302\u0302\u0301\u0301\u0301 shifts 23 steps up.\u0101\u030c\u0300\u0300\u0300 shifts 13 steps down.shift() from the JS package to encode correctly.Optional wavefont package exposes a function that calculates string from values for your convenience. Types included.
import wf, { char, shift } from 'wavefont'
// characters for values from 0..127 range (clamped & rounded)
wf(0, 1, 50, 99, 127) // 'ĀāIJţſ'
// arrays or typed arrays of any length
wf(new Float32Array([0, 64, 127])) // 'Āŀſ'
// single value char + canonical shift marks (10-step first, then 1-step)
char(64) + shift(23) // bar 64 shifted 23 steps up
char(64) + shift(-13) // bar 64 shifted 13 steps down
make build