Theme

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.

VariableDefaultPurpose
--novem-font-body"Geist", -apple-system, sans-serifBody text — paragraphs, captions, table cells, axis labels, tooltips
--novem-font-heading"Geist", -apple-system, sans-serifHeadings (h1–h6) and prominent labels
--novem-font-mono"Geist Mono", "SFMono-Regular", monospaceCode blocks, inline code, ticker symbols, identifiers
--novem-font-display--novem-font-headingCover 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.

VariableDefault
--novem-font-size12px (the base — same as s)
--novem-font-size-xxxs6px
--novem-font-size-xxs8px
--novem-font-size-xs10px
--novem-font-size-s12px
--novem-font-size-m14px
--novem-font-size-l17px
--novem-font-size-xl21px
--novem-font-size-xxl26px
--novem-font-size-xxxl32px
--novem-font-size-xxxxl40px
--novem-font-size-xxxxxl52px

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.

VariableDefault
--novem-font-size-h128px
--novem-font-size-h222px
--novem-font-size-h318px
--novem-font-size-h416px
--novem-font-size-h514px
--novem-font-size-h612px

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.

VariableDefaultPurpose
--novem-font-weight400Body text default
--novem-font-weight-heading600Headings (h1–h6)
--novem-font-weight-strong700Bold emphasis (<b>, <strong>)
--novem-font-weight-light300Light 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.

VariableDefaultPurpose
--novem-line-height1.6Body paragraphs
--novem-line-height-heading1.2Headings
--novem-line-height-compact1.3Table cells, tooltips, captions, axis labels
--novem-line-height-relaxed1.8Long-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.

VariableDefaultPurpose
--novem-letter-spacingnormalBody and heading default
--novem-letter-spacing-tight-0.01emLarge display headings, dense numeric tables
--novem-letter-spacing-wide0.05emSmall 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.

VariableDefaultPurpose
--novem-font-features"liga" 1, "kern" 1Default features for body text
--novem-font-features-numeric"tnum" 1, "zero" 1Tabular numerals and slashed zero — applied to tables, axis ticks, KPI numbers
--novem-font-features-display"liga" 1, "dlig" 1Discretionary 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.