VizChitra Fonts

Use these fonts

Cairo, IBM Plex Sans and Fira Code, served as a versioned, unicode-range-split fonts.css from fonts.vizchitra.com — CORS-enabled, cache-forever, and reproducible from this repo's font-src/. Only Cairo is ever modified; Plex and Fira Code are redistributed exactly as upstream ships them. Full specimen, axes and file sizes are in the catalogue.

On the web

Link the canonical stylesheet directly — no build step, no self-hosting required:

<link rel="stylesheet" href="https://fonts.vizchitra.com/v1/fonts.css">

Or self-host by downloading fonts.css and the .woff2 files it references from manifest.json — everything under /v1/ is versioned and immutable, so it's safe to vendor and cache indefinitely. A future /v2/ will coexist with /v1/ rather than replace it.

Reference by CSS custom property, not by name

Each family is exposed as a custom property so the underlying font can change without touching every call site — this is how Cairo will be swapped for VizChitra Sans later without a second round of edits across every consuming site:

:root {
  --font-sans: 'IBM Plex Sans', system-ui, sans-serif;
  --font-mono: 'Fira Code', ui-monospace, monospace;
  --font-display: 'Cairo', var(--font-sans);
}

body { font-family: var(--font-sans); }
h1, h2 { font-family: var(--font-display); }
code, pre { font-family: var(--font-mono); }

Never write font-family: 'Cairo' (or 'IBM Plex Sans', 'Fira Code') directly at a call site — always through the custom property, even though it resolves to the same family today.

Cairo's italic needs two exact things, not one

Cairo has no italic masters — its italic is the slnt axis, and the @font-face declares its true range (-11deg to 11deg). Two separate problems make a bare font-style: italic or bare font-style: oblique unsafe, and one pattern fixes both — see /compat for the full matrix and the measurements behind this:

.italic {
  font-style: oblique 11deg;
  font-variation-settings: 'slnt' -11;
}

State the exact angle, 11deg, not a bare keyword: CSS's implied default for "no angle stated" is 14deg, which falls outside this face's declared range and trips a Chromium/WebKit synthesis bug — stating the angle the face actually supports avoids it entirely. Then pair it with the explicit axis value: real Safari 18.7 performs no automatic font-style → slnt mapping at all, exact angle or not, so the axis has to be set directly regardless of what font-style-matching would do. Drop either half and it breaks on at least one real, tested engine or device — confirmed on real Safari 18.7 and 27.0, not just Chromium/Firefox/WebKit automation.

Frameworks may only expose italic

Tailwind's typography utilities are built around italic/not-italic, which map to font-style: italic/normal — there is no built-in oblique or axis-aware utility. Font declaration and framework usage are two separate problems: Cairo is correctly declared as an oblique face, but a framework's default italic utility still doesn't express the exact pattern above. Don't repurpose .italic — define a project utility instead:

@utility font-oblique {
  font-style: oblique 11deg;
  font-variation-settings: 'slnt' -11;
}
<p class="font-oblique">…</p>

Fira Code: weight and ligatures

Fira Code's own upstream family name is "Fira Code Light" and its wght axis defaults to 300 internally — but fonts.css declares font-weight: 300 700 as a range, so leaving font-weight unset resolves to CSS's own initial value (400), not the font's internal default. Set it explicitly anyway if you want a specific weight. Every one of its 86 code ligatures is powered by calt, which is on by default — if you need to turn ligatures off, use font-variant-ligatures: no-contextual or font-feature-settings: 'calt' 0 (the second wins if both are set on the same element); font-variant-ligatures: no-common-ligatures does nothing here, since that maps to liga/clig, which Fira Code doesn't use.

In Figma

Not yet needed: Cairo, IBM Plex Sans and Fira Code are all already available directly from Google Fonts inside Figma today, so there is nothing this repo needs to document until VizChitra Sans exists (Phase 3) and needs a custom install path — static instances, the Figma font-helper, and so on. This section is a placeholder for that.