Sanctuary sets type with four families, each with one job. Blackletter is deliberately absent: the system is about the atmosphere of the building, not medieval costume. See the scale set live in the playground.
Families
| Role | Family | Fallbacks | Weights | Why |
|---|---|---|---|---|
display | Cormorant Garamond | Cormorant, EB Garamond, Georgia, serif | 500, 600 | A high-contrast old-style serif: thin strokes read as light on dark stone. Display and headline type. |
text | Hanken Grotesk | Inter, system-ui, sans-serif | 400, 500, 600 | A plain, legible sans, so the serif stays special. Titles, body and labels. |
mono | JetBrains Mono | Cascadia Code, ui-monospace, monospace | 400 | Shared with the terminal ports. Code. |
inscription | Cinzel | Cormorant Garamond, Georgia, serif | 600 | Roman capitals, wide-tracked, for overlines only. |
Sanctuary names its fonts but does not load them. Load the families and weights listed above with whatever your site uses: Google Fonts, Fontsource or your own files. Each role is a custom property, --san-font-family-<role>, and the weights the scale uses are tokens too:
| Token | Value |
|---|---|
--san-font-family-display | Cormorant Garamond, Cormorant, EB Garamond, Georgia, serif |
--san-font-family-text | Hanken Grotesk, Inter, system-ui, sans-serif |
--san-font-family-mono | JetBrains Mono, Cascadia Code, ui-monospace, monospace |
--san-font-family-inscription | Cinzel, Cormorant Garamond, Georgia, serif |
--san-font-weight-regular | 400 |
--san-font-weight-medium | 500 |
--san-font-weight-semibold | 600 |
--san-font-weight-bold | 700 |
If your font is published under another family name, for example Cormorant Garamond Variable, override the role on the root element:
:root {
--san-font-family-display: "Cormorant Garamond Variable", "Cormorant Garamond", Georgia, serif;
}
Override on :root (or html), not on a descendant. The type roles below are declared on :root and resolve the family there, so an override on a nested element changes only the declarations that read the family directly.
The type scale
Each role is a font shorthand (weight, size, line height and family) with its letter spacing beside it:
.title {
font: var(--san-type-title-lg);
letter-spacing: var(--san-type-title-lg-tracking);
}
| Token | Value |
|---|---|
--san-type-display-lg | 500 4.5rem/1.04 font-family-display |
--san-type-display-lg-tracking | -0.09rem |
--san-type-display-md | 500 3.5rem/1.08 font-family-display |
--san-type-display-md-tracking | -0.063rem |
--san-type-display-sm | 500 2.75rem/1.1 font-family-display |
--san-type-display-sm-tracking | -0.04125rem |
--san-type-headline-lg | 500 2.25rem/1.16 font-family-display |
--san-type-headline-lg-tracking | -0.0225rem |
--san-type-headline-md | 600 1.875rem/1.2 font-family-display |
--san-type-headline-md-tracking | -0.01125rem |
--san-type-headline-sm | 600 1.5rem/1.25 font-family-display |
--san-type-headline-sm-tracking | 0rem |
--san-type-title-lg | 600 1.25rem/1.4 font-family-text |
--san-type-title-lg-tracking | -0.00625rem |
--san-type-title-md | 600 1rem/1.5 font-family-text |
--san-type-title-md-tracking | 0rem |
--san-type-title-sm | 600 0.875rem/1.43 font-family-text |
--san-type-title-sm-tracking | 0.00438rem |
--san-type-body-lg | 400 1.125rem/1.6 font-family-text |
--san-type-body-lg-tracking | 0rem |
--san-type-body-md | 400 1rem/1.55 font-family-text |
--san-type-body-md-tracking | 0rem |
--san-type-body-sm | 400 0.875rem/1.5 font-family-text |
--san-type-body-sm-tracking | 0.00263rem |
--san-type-label-lg | 500 0.875rem/1.43 font-family-text |
--san-type-label-lg-tracking | 0.00875rem |
--san-type-label-md | 500 0.75rem/1.34 font-family-text |
--san-type-label-md-tracking | 0.015rem |
--san-type-label-sm | 500 0.6875rem/1.45 font-family-text |
--san-type-label-sm-tracking | 0.0275rem |
--san-type-inscription | 600 0.75rem/1.34 font-family-inscription |
--san-type-inscription-tracking | 0.135rem |
--san-type-code-md | 400 0.875rem/1.6 font-family-mono |
--san-type-code-md-tracking | 0rem |
--san-type-code-sm | 400 0.78125rem/1.6 font-family-mono |
--san-type-code-sm-tracking | 0rem |
Display and headline roles use the display family; title, body and label use the text family; code uses the mono family, and the inscription its own family.