Typography
Novem typography is controlled by a single set of variables that cover font families, weights, sizes, line heights and the numeric features that matter for tables and charts. Markdown can target individual steps by name.
AI assisted, human approved — novem uses AI to review and keep our documentation up to date.
Novem typography is the same regardless of light or dark mode, which is why the tables on this page show a single default rather than a Light and Dark column. The primitives are organised into seven groups: font families, the size scale, heading sizes, weights, line heights, letter spacing, and numeric features. Together they cover everything the platform renders — body text in documents and mails, axis and tooltip text in charts, table headers and cells, callouts and code samples.
A theme can replace any of the family stacks with brand-specific fonts and the change propagates everywhere the family is consumed. The default novem stack uses Geist for body and headings and Geist Mono for code.
| Variable | Default | Purpose |
|---|---|---|
--novem-font-body | "Geist", -apple-system, sans-serif | Body text — paragraphs, captions, table cells, axis labels, tooltips |
--novem-font-heading | "Geist", -apple-system, sans-serif | Headings (h1–h6) and prominent labels |
--novem-font-mono | "Geist Mono", "SFMono-Regular", monospace | Code blocks, inline code, ticker symbols, identifiers |
--novem-font-display | --novem-font-heading | Cover titles and other large hero text — defaults to the heading family but can be split out for a distinct display face |
Novem uses a stepped size scale named in t-shirt sizes from xxxs up
to xxxl. Each step is its own variable, and the scale is also
exposed in markdown through the sz paragraph config. A theme can
shift the entire scale by overriding the steps it wants and leaving
the rest at their defaults.
| Variable | Default |
|---|---|
--novem-font-size | 12px (the base — same as s) |
--novem-font-size-xxxs | 6px |
--novem-font-size-xxs | 8px |
--novem-font-size-xs | 10px |
--novem-font-size-s | 12px |
--novem-font-size-m | 14px |
--novem-font-size-l | 17px |
--novem-font-size-xl | 21px |
--novem-font-size-xxl | 26px |
--novem-font-size-xxxl | 32px |
--novem-font-size-xxxxl | 40px |
--novem-font-size-xxxxxl | 52px |
The two largest steps — xxxxl and xxxxxl — are intended for cover
titles and hero text. They sit above the regular content scale so they
can be tuned independently.
Each heading level has its own size variable, and the heading family and weight are pulled from the family/weight tokens so that overriding them once reshapes every heading.
| Variable | Default |
|---|---|
--novem-font-size-h1 | 28px |
--novem-font-size-h2 | 22px |
--novem-font-size-h3 | 18px |
--novem-font-size-h4 | 16px |
--novem-font-size-h5 | 14px |
--novem-font-size-h6 | 12px |
The platform exposes the four most common weights as named variables. A theme can use any value the underlying font supports, but most brands work fine with the four below.
| Variable | Default | Purpose |
|---|---|---|
--novem-font-weight | 400 | Body text default |
--novem-font-weight-heading | 600 | Headings (h1–h6) |
--novem-font-weight-strong | 700 | Bold emphasis (<b>, <strong>) |
--novem-font-weight-light | 300 | Light treatments — cover subtitles, eyebrow text |
Line height is split into a small set of named values rather than a single global setting. Body text gets a relaxed line height for readability, headings tighten up so multi-line titles don't sprawl, and tables and tooltips use a compact value because vertical space is at a premium.
| Variable | Default | Purpose |
|---|---|---|
--novem-line-height | 1.6 | Body paragraphs |
--novem-line-height-heading | 1.2 | Headings |
--novem-line-height-compact | 1.3 | Table cells, tooltips, captions, axis labels |
--novem-line-height-relaxed | 1.8 | Long-form body, blockquotes |
Letter spacing — also known as tracking — defaults to the font's natural metrics. Two named overrides cover the most common cases where you'd want to deviate.
| Variable | Default | Purpose |
|---|---|---|
--novem-letter-spacing | normal | Body and heading default |
--novem-letter-spacing-tight | -0.01em | Large display headings, dense numeric tables |
--novem-letter-spacing-wide | 0.05em | Small caps, eyebrow labels, axis tick text |
Tables and charts that align columns of numbers benefit from tabular
numerals (every digit takes the same width) and a slashed zero (so a
0 doesn't get confused with an O). Novem exposes these through
font-feature-settings strings so that a theme can tune the typographic
features its font supports.
| Variable | Default | Purpose |
|---|---|---|
--novem-font-features | "liga" 1, "kern" 1 | Default features for body text |
--novem-font-features-numeric | "tnum" 1, "zero" 1 | Tabular numerals and slashed zero — applied to tables, axis ticks, KPI numbers |
--novem-font-features-display | "liga" 1, "dlig" 1 | Discretionary ligatures for cover and hero text |
The size scale is also exposed in markdown through the sz paragraph
config, so authors can change the size of an individual paragraph
without dropping into CSS.
{{ para sz=l }}This paragraph renders at --novem-font-size-l. {{ end }}
Valid sz values are xxxs, xxs, xs, s, m, l, xl, xxl,
xxxl, xxxxl and xxxxxl. Override any step in your org theme and
every paragraph that targets that step shifts with it.