Sanctuary

    Flavor
    Accent
    Glazing
    Window

    Foundations

    Type

    Four families, each with one job, and a scale of type roles.

    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

    RoleFamilyFallbacksWeightsWhy
    displayCormorant GaramondCormorant, EB Garamond, Georgia, serif500, 600A high-contrast old-style serif: thin strokes read as light on dark stone. Display and headline type.
    textHanken GroteskInter, system-ui, sans-serif400, 500, 600A plain, legible sans, so the serif stays special. Titles, body and labels.
    monoJetBrains MonoCascadia Code, ui-monospace, monospace400Shared with the terminal ports. Code.
    inscriptionCinzelCormorant Garamond, Georgia, serif600Roman 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:

    TokenValue
    --san-font-family-displayCormorant Garamond, Cormorant, EB Garamond, Georgia, serif
    --san-font-family-textHanken Grotesk, Inter, system-ui, sans-serif
    --san-font-family-monoJetBrains Mono, Cascadia Code, ui-monospace, monospace
    --san-font-family-inscriptionCinzel, Cormorant Garamond, Georgia, serif
    --san-font-weight-regular400
    --san-font-weight-medium500
    --san-font-weight-semibold600
    --san-font-weight-bold700

    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);
    }
    
    TokenValue
    --san-type-display-lg500 4.5rem/1.04 font-family-display
    --san-type-display-lg-tracking-0.09rem
    --san-type-display-md500 3.5rem/1.08 font-family-display
    --san-type-display-md-tracking-0.063rem
    --san-type-display-sm500 2.75rem/1.1 font-family-display
    --san-type-display-sm-tracking-0.04125rem
    --san-type-headline-lg500 2.25rem/1.16 font-family-display
    --san-type-headline-lg-tracking-0.0225rem
    --san-type-headline-md600 1.875rem/1.2 font-family-display
    --san-type-headline-md-tracking-0.01125rem
    --san-type-headline-sm600 1.5rem/1.25 font-family-display
    --san-type-headline-sm-tracking0rem
    --san-type-title-lg600 1.25rem/1.4 font-family-text
    --san-type-title-lg-tracking-0.00625rem
    --san-type-title-md600 1rem/1.5 font-family-text
    --san-type-title-md-tracking0rem
    --san-type-title-sm600 0.875rem/1.43 font-family-text
    --san-type-title-sm-tracking0.00438rem
    --san-type-body-lg400 1.125rem/1.6 font-family-text
    --san-type-body-lg-tracking0rem
    --san-type-body-md400 1rem/1.55 font-family-text
    --san-type-body-md-tracking0rem
    --san-type-body-sm400 0.875rem/1.5 font-family-text
    --san-type-body-sm-tracking0.00263rem
    --san-type-label-lg500 0.875rem/1.43 font-family-text
    --san-type-label-lg-tracking0.00875rem
    --san-type-label-md500 0.75rem/1.34 font-family-text
    --san-type-label-md-tracking0.015rem
    --san-type-label-sm500 0.6875rem/1.45 font-family-text
    --san-type-label-sm-tracking0.0275rem
    --san-type-inscription600 0.75rem/1.34 font-family-inscription
    --san-type-inscription-tracking0.135rem
    --san-type-code-md400 0.875rem/1.6 font-family-mono
    --san-type-code-md-tracking0rem
    --san-type-code-sm400 0.78125rem/1.6 font-family-mono
    --san-type-code-sm-tracking0rem

    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.