| .. | ||
| ibm-plex-sans-400.woff2 | ||
| ibm-plex-sans-600.woff2 | ||
| README.md | ||
| source-serif-4-600.woff2 | ||
shared/fonts/
Source .woff2 files for the typography baked into every tool. These are
the raw font bytes; the actual @font-face declarations live in
shared/fonts.css as base64 data URIs so single-file HTML tools render
identically offline (file://) and online with no CDN dependency.
Files
ibm-plex-sans-400.woff2— UI body text (regular weight)ibm-plex-sans-600.woff2— UI emphasis (semibold)source-serif-4-600.woff2— display/headings (semibold)
Latin subsets only. ~60 KB total raw; ~80 KB once base64-inlined.
Regenerating shared/fonts.css
Run from the repo root:
python3 - <<'PY'
import base64, pathlib
fonts = [
('IBM Plex Sans', 400, 'ibm-plex-sans-400.woff2'),
('IBM Plex Sans', 600, 'ibm-plex-sans-600.woff2'),
('Source Serif 4', 600, 'source-serif-4-600.woff2'),
]
out = pathlib.Path('shared/fonts.css')
lines = ['/* shared/fonts.css — base64-inlined woff2. Generated by',
' * shared/fonts/README.md instructions; do NOT edit by hand. */', '']
for family, weight, fn in fonts:
b64 = base64.b64encode((pathlib.Path('shared/fonts') / fn).read_bytes()).decode('ascii')
lines += ['@font-face {',
f" font-family: '{family}';",
' font-style: normal',
f' font-weight: {weight};',
' font-display: swap;',
f" src: url(data:font/woff2;base64,{b64}) format('woff2');",
'}', '']
out.write_text('\n'.join(lines))
PY
Adding or swapping a font
- Download the new
.woff2into this directory (latin subset only — keep the bundle small). - Update the
fontslist in the snippet above to include the new family- weight + filename.
- Re-run the regen snippet.
- Update
--fontor--font-displaytokens inshared/base.css. ./buildand verify every tool'sdist/*.htmlstill includes@font-face(three by default).
Sourcing
Originally downloaded from the @fontsource npm packages via jsdelivr:
- IBM Plex Sans 400/600:
@fontsource/ibm-plex-sans@5.0.18 - Source Serif 4 600:
@fontsource/source-serif-4@5.0.5
Both licenses are SIL Open Font License 1.1. Fontsource bundles only the latin subset by default, which is exactly what we want.