Configuration reference: Space theme

Embed
Preview of the card
<a href="https://forumulate.com/reference/config-space-theme"><img src="https://forumulate.com/reference/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/8042f004-e3d9-445f-b7a4-b6c1f86836e6/pages/a68c39b0-1c69-4f32-bb94-e12de4301a4d/social-card.svg?v=3e7ae33eec8b" alt="Configuration reference: Space theme" width="600" height="315"></a>

A space’s (or a site’s config.theme) reader theme.

Where it is used: PUT|PATCH /orgs/{orgId}/spaces/{spaceId}/theme, and theme: in forumulate.yaml.

JSON Schema: https://forumulate.com/schemas/2026-12-01/space-theme.json — point your editor at it with "$schema": "https://forumulate.com/schemas/2026-12-01/space-theme.json" (JSON) or # yaml-language-server: $schema=https://forumulate.com/schemas/2026-12-01/space-theme.json (YAML), and check a whole folder with forumulate validate <dir>.

This page is generated from the schema the API validates with; it cannot describe a key the API does not take.

Casing

  • Every key in a JSON or YAML configuration document (site config, theme, forumulate.yaml, a category) is camelCase, exactly: primaryColor, footerColumns, headerLinks. primary_color and PrimaryColor are unknown keys, refused with the camelCase name in the hint. The one exception is two top-level blocks of a version-2 site manifest, which are snake_case: reader_auth (a list of sign-in configurations) and status_monitors; readerAuth is a different key there, the one-word shorthand readerAuth: atlas.

  • Front matter is the exception: a key is read in any casing (seo_title, seo-title, SeoTitle all mean seoTitle), and the names other tools use (description, sidebar_label, sidebar_position, image) are read as ours.

  • Enum values are lower-case ("wide", "system"), except space types and visibilities, which are upper-case ("DOCS", "PUBLIC").

  • Colours are #rrggbb (or #rgb); lengths that are numbers are CSS pixels.

Keys

Top-level keys and the keys one level inside them. [] marks “each item of a list”.

Key

Type

Required

What it is

about

object

about.advisors

object

about.awards

object

about.bands

object

about.community

object

about.contact

object

about.cta

object

about.density

"compact" | "comfortable" | "spacious"

about.facts

object

about.faq

object

about.gallery

object

about.hero

object

about.impact

object

about.investors

object

about.leadership

object

about.legal

object

about.logos

object

about.look

"default" | "paper" | "minimal" | "bold" | "editorial"

about.mission

object

about.news

object

about.offices

object

about.page

object

about.people

object

about.press

object

about.presskit

object

about.roles

object

about.sections

object

about.social

object

about.stats

object

about.status

object

about.story

object

about.team

object

about.testimonials

object

about.timeline

object

about.values

object

accentColor

string

ads

object

ads.configJson

map

ads.configVar

string

ads.enabled

boolean

ads.network

string

yes

ads.publisherId

string

yes

ads.scriptUrl

string

ads.size

string

ads.slotHtml

string

ads.slotId

string

announcement

object | false

apiOrigins

string[]

blog

object

blog.amp

boolean

blog.archive

object

blog.author

object

blog.bestseller

object

blog.hubs

object

blog.look

"paper" | "editorial" | "magazine" | "minimal" | "newsletter"

blog.permalinks

object

blog.portal

object

blog.readTime

object

blog.recommendations

object

blog.release

object

blog.search

object

blog.series

object

blog.tagHead

object

blog.tagsIndex

object

bodyFontFamily

string

brandName

string | false

careers

object

careers.apply

object

careers.background

object

careers.buttons

object

careers.embed

object

careers.facts

object

careers.header

object

careers.item

object

careers.list

object

careers.look

"default" | "paper" | "board" | "cards" | "minimal" | "bold"

careers.media

object

careers.role

object

careers.steps

object

changelog

object

changelog.archive

object

changelog.autolink

object

changelog.breakingBadge

"badge" | "row-tint" | "none"

changelog.channelBadge

object

changelog.closes

"list" | "count" | "none"

changelog.columnWidth

integer

changelog.coverRadius

integer

changelog.dark

object

changelog.dateFormat

"short" | "medium" | "long" | "full" | "day-month" | "day-month-short" | "month-year" | "month-year-short" | "iso"

changelog.datePlacement

"below" | "above" | "gutter"

changelog.dateTone

"muted" | "ink"

changelog.empty

object

changelog.entry

object

changelog.entryGap

integer

changelog.entryPhone

object

changelog.facts

object

changelog.filters

object

changelog.group

object

changelog.gutter

object

changelog.gutterWidth

integer

changelog.header

object

changelog.helpful

object

changelog.hero

object

changelog.indexWidth

"text" | "list" | "board" | "max" | integer

changelog.languages

object

changelog.latestLabel

boolean | string

changelog.look

"default" | "paper" | "cards" | "minimal" | "product" | "devlog"

changelog.prose

object

changelog.rail

object

changelog.release

object

changelog.releaseSide

object

changelog.sections

object

changelog.showTags

boolean

changelog.stickyDate

boolean

changelog.surface

object

changelog.tagInk

"neutral" | "tag"

changelog.tagOverflow

integer

changelog.tagStyle

"chip" | "outline" | "outline-mono" | "text" | "eyebrow"

changelog.typeBadge

object

changelog.upgradeNotesFirst

boolean

changelog.versionBadge

object

changelog.widget

object

chrome

object

Header and footer for a STANDALONE space. A space inside a site wears the SITE’s chrome (the top level of the site config) and this is stored but not rendered there.

chrome.accountMenu

object

What the signed-in reader's avatar menu holds: the entries and their order (built-ins and your own links), the name beside the avatar, the bell.

chrome.align

"split" | "left" | "center"

The header row's arrangement: split (default — brand left, links right), left, or center (brand centred, links either side).

chrome.brandText

"auto" | "show" | "hide" | object

The brand's words beside the header logo: auto (default), show or hide, or the object form with source and phone.

chrome.copyright

string

The copyright or legal line at the very bottom of the footer, up to 200 characters.

chrome.cta

object

The call-to-action button at the end of the header row: { label, href } plus its own colours and size. ctas (up to three) replaces it when set.

chrome.ctaStyle

"solid" | "pill" | "outline" | "link" | "subtle"

The header button's shape: solid (default), pill, outline or link.

chrome.ctas

object[]

Up to three header buttons, in order. When set it replaces cta and secondaryCta.

chrome.desktopNav

"inline" | "menu"

NAVIGATION on a wide screen: inline (default — headerLinks in the bar) or menu (behind a menu button, as on a phone). The phone twin is mobileNav.

chrome.footer

object

The footer's own lockup (logo, logoMark), where "Cookie settings" sits, your own footer HTML/CSS and a newsletter row.

chrome.footerColumns

object[]

A multi-column footer: up to 12 × { heading, links, stack }, up to 20 links each (the link field is label).

chrome.footerDescription

string

A short blurb under the brand name in the footer, up to 400 characters.

chrome.footerLinks

object[]

A flat row of footer links, up to 20 × { label, href }. footerColumns is the multi-column footer.

chrome.header

object

How the header bar looks and lays out its links: overlay, height, border, shadow, blur, logo, linksAlign (where headerLinks sit), maxLinks (how many before "More").

chrome.headerLinks

object[]

NAVIGATION — the header's own items, up to 12: { label, href }, or an item that opens a dropdown (children) or a mega-menu panel (panel). In a site they REPLACE the automatic space tabs unless headerSpaceIds is set; how dropdowns open is navMenu, the phone/desktop behaviour is mobileNav/desktopNav.

chrome.height

"compact" | "standard" | "tall"

The header bar's height: compact, standard (default) or tall.

chrome.logoPhone

"full" | "mark"

mark: draw logoMark instead of the wordmark below 640px wide. Unset: the full lockup at every width.

chrome.mobileNav

"menu" | "bar"

NAVIGATION on a phone: menu (default — headerLinks behind a hamburger) or bar (inline in the header row). The wide-screen twin is desktopNav.

chrome.navMenu

object

NAVIGATION — how the dropdowns and mega menus of headerLinks open (hover or click) and look. Items themselves live in headerLinks.

chrome.search

"none" | "icon" | "pill"

A search control in the header on every surface: none (default), icon or pill.

chrome.searchHideOn

"desktop" | "phone"[]

Hide the header search at one width: ["desktop"] or ["phone"].

chrome.searchPlacement

"start" | "center" | "end" | "before-links"

Where the header search sits on a wide screen: start, center, end (default) or before-links.

chrome.searchStyle

object

How the header search looks: the pill's words (also the placeholder), its fill and ink, size, and glyph: false to drop the magnifier.

chrome.secondaryCta

object

A second header button beside cta, with its own style. ctas replaces both when set.

chrome.showSignIn

boolean

false takes the reader "Sign in" control out of the header (in-page sign-in prompts stay). Default true.

chrome.sidebarBrand

"show" | "hide"

The brand lockup at the top of the docs reader's left rail: show (default) or hide.

chrome.sidebarToggle

boolean | object

A menu button at the start of the header that opens the page's sidebar drawer, on pages that have one; { placement: "end" } puts it at the far end.

chrome.signInStyle

object

How the reader "Sign in" control looks: look (link default, solid, outline), icon, label, order against the buttons, phone placement.

chrome.socialLinks

object[]

Social profiles badged with icons in the footer, up to 10 × { platform, href }.

chrome.sticky

boolean

true: the header stays at the top while the reader scrolls. Default false.

chrome.subnav

object

NAVIGATION — a section row BELOW the header row: your own links (and endLinks), and where a docs space with sections.placement: "header" draws its section tabs. The header's main items are headerLinks; the bar above it is topBar.

chrome.themeToggle

object

The light/dark control: show, style, position in the header row, colours.

chrome.topBar

object

NAVIGATION — a thin utility bar ABOVE the header row (an announcement, a few links, contact details). The header's main items are headerLinks; the row below it is subnav.

chrome.translations

map

The chrome in other languages: { "es": { labels: { "Pricing": "Precios" }, footerDescription, copyright } } — labels maps the original words of any header item, footer link or button.

colorScheme

"system" | "light" | "dark"

colorSchemeStrict

boolean

compare

object

compare.accentUsage

"subtle" | "standard" | "strong"

compare.atAGlance

object

compare.bands

object

compare.buttons

object

compare.cards

object

compare.cta

object

compare.density

"compact" | "comfortable" | "spacious"

compare.disclaimer

object

compare.embed

object

compare.hero

object

compare.index

object

compare.labels

object

compare.logos

object

compare.look

"clean" | "paper" | "bold" | "editorial" | "dense"

compare.matrix

object

compare.mobile

object

compare.page

object

compare.pricing

object

compare.print

object

compare.productHub

object

compare.prosCons

object

compare.prose

object

compare.quickVerdict

object

compare.ranking

object

compare.related

object

compare.scorecard

object

compare.seo

object

compare.sources

object

componentInstalls

object[]

componentInstalls[].id

string

yes

componentInstalls[].settings

map

components

object

components.apiRef

object

components.button

object

components.buttonDark

object

components.byline

object

components.caption

object

components.card

object

components.code

object

components.codeDark

object

components.expandable

object

components.focus

object

components.hint

object

components.image

object

components.input

object

components.inputDark

object

components.kbd

object

components.link

object

components.list

object

components.meta

object

components.popover

object

components.preview

object

components.quote

object

components.radius

number

components.scrollbar

object

components.select

object

components.selection

object

components.shadow

"none" | "sm" | "md" | "lg"

components.skeleton

object

components.spacing

object

components.stepper

object

components.syntax

object

components.syntaxDark

object

components.syntaxTheme

"github" | "github-dark" | "one-light" | "one-dark" | "solarized-light" | "solarized-dark" | "nord" | "dracula" | "monokai" | "night-owl"

components.table

object

components.tabs

object

contact

object

contact.backdrop

object

contact.channels

object

contact.deflect

object

contact.density

"compact" | "comfortable" | "spacious"

contact.departments

object

contact.facts

object

contact.form

object

contact.head

object

contact.hours

object

contact.look

"default" | "paper" | "minimal" | "bold" | "directory"

contact.mobile

object

contact.offices

object

contact.page

object

contact.split

object

contact.success

object

contact.topics

object

contentWidth

"standard" | "wide" | "full"

courses

object

courses.access

object

courses.catalog

object

courses.certificate

object

courses.cohort

object

courses.commerce

object

courses.dashboard

object

courses.gamification

object

courses.landing

object

courses.lesson

object

courses.list

object

courses.lock

object

courses.look

"default" | "paper" | "school" | "academy" | "minimal-text"

courses.module

object

courses.outline

object

courses.paths

object

courses.progress

object

courses.quiz

object

courses.social

object

courses.video

object

cssSnippets

object[]

cssSnippets[].css

string

yes

cssSnippets[].enabled

boolean

cssSnippets[].name

string

yes

custom

object

custom.breakpoints

object

custom.cursor

object

custom.look

"default" | "paper" | "editorial" | "product" | "portfolio"

custom.pageTransition

"none" | "fade" | "slide" | "zoom"

customCss

string

customFontFamily

string

customFontUrl

any | string | ""

customJs

string

docs

object

docs.agentFooter

object

docs.api

object

docs.articleAlign

"start" | "center"

docs.articleWidth

"narrow" | "default" | "wide" | "full" | string

docs.aside

object

docs.ask

object

docs.availability

object

docs.blocks

object

docs.editLink

object

docs.feedback

object

docs.frame

object

docs.header

object

docs.homeAt

"redirect" | "root"

docs.hub

object

docs.issueLink

object

docs.localeFallback

"404" | "source"

docs.localeSwitcher

object

docs.look

"clean" | "muted" | "bold" | "panel" | "dark" | "paper"

docs.mobileNav

object

docs.offline

object

docs.pageActions

object

docs.pageHead

object

docs.pager

object

docs.panel

object

docs.related

object

docs.rootRedirect

"permanent" | "temporary"

docs.search

object

docs.sections

object

docs.sidebar

object

docs.suggestEdits

object

docs.toc

object

docs.topRule

boolean | "solid" | "split"

docs.translations

map

docs.variantSwitcher

object

docs.versionSwitcher

object

elementStyles

object[]

elementStyles[].declarations

map

yes

CSS declarations, property → value. Properties: font-family, font-size, font-weight, font-style, line-height, letter-spacing, font-variation-settings, font-feature-settings, font-optical-sizing, color, background, background-color, padding, padding-top, padding-right, padding-bottom, padding-left, margin, margin-top, margin-right, margin-bottom, margin-left, border, border-top, border-right, border-bottom, border-left, border-color, border-width, border-style, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, text-transform, text-decoration, text-align, text-wrap, box-shadow, opacity, background-image, background-size, background-position, background-repeat, transform, transition, gap, row-gap, column-gap, display, width, max-width, min-width, justify-content, align-items, flex-wrap, flex-direction, align-content, flex-grow, flex-shrink, flex-basis, aspect-ratio, object-fit, object-position, height, min-height, max-height, text-decoration-line, text-decoration-color, text-decoration-style, text-decoration-thickness, text-underline-offset, position, inset, top, right, bottom, left, z-index, isolation, mix-blend-mode, backdrop-filter, order, grid-template-columns, grid-template-rows, grid-column, grid-row, grid-area, align-self, justify-self. Narrowed values: position is static|relative|sticky|absolute (never fixed; absolute only on a selector inside a [data-fx-block]); z-index 0–10; inset/top/right/bottom/left within ±100%/±50vh/±800px; height/min-height/max-height up to 200vh/4000px; aspect-ratio N or N / M; backdrop-filter without url(); transform may scale, rotate or skew only. A refused declaration is a 422 naming elementStyles.<i>.declarations.<property> and saying why.

elementStyles[].media

"tablet" | "phone"

elementStyles[].page

string

elementStyles[].scheme

"light" | "dark"

elementStyles[].selector

string

yes

elementStyles[].state

"hover" | "focus" | "active"

events

object

events.after

object

events.agenda

object

events.chips

object

events.dateTileTone

object

events.embed

object

events.item

object

events.list

object

events.look

"default" | "paper" | "minimal" | "bold" | "stage" | "ticket"

events.page

object

events.series

object

events.session

object

events.social

object

events.speaker

object

events.speakers

object

events.style

object

events.tones

object

faq

object

faq.audience

object

faq.categories

object

faq.contact

object

faq.density

"compact" | "default" | "comfortable"

faq.featured

object

faq.follow

object

faq.item

object

faq.jump

"chips" | "rail" | "none"

faq.list

object

faq.look

"default" | "cards" | "minimal" | "support" | "pricing" | "paper"

faq.phone

object

faq.print

object

faq.questionPage

object

faq.search

object

faq.section

object

faq.sectionPage

object

faq.sort

"manual" | "helpful" | "views" | "updated" | "alpha"

faq.width

"text" | "list" | "board" | "max" | "full"

faviconUrl

any | string | ""

font

"sans" | "serif" | "mono"

fontOrigins

string[]

fontOriginsRemoved

string[]

fonts

object

fonts.display

"auto" | "block" | "swap" | "fallback" | "optional"

fonts.faces

object[]

footnotes

object

footnotes.placement

"popover" | "margin" | "end"

footnotes.rule

boolean

forum

object

forum.categories

object

forum.categoriesPage

object

forum.categoryOverrides

map

forum.categoryPage

object

forum.chrome

object

forum.dates

object

forum.front

object

forum.layout

object

forum.list

object

forum.look

"clean" | "board" | "cards" | "qa" | "paper"

forum.pageHead

object

forum.post

object

forum.profile

object

forum.qa

"auto" | "on" | "off"

forum.sidebar

object

forum.tagStyle

"chip" | "outline" | "outline-mono" | "text" | "eyebrow" | "plain"

forum.tagsPage

object

forum.topic

object

forum.translations

map

frameOrigins

string[]

headingAnchors

"hover" | "always" | "none"

headingFontFamily

string

i18n

object

i18n.labels

map

i18n.switcher

object

i18n.urlStyle

"path" | "query"

imgOrigins

string[]

layout

object

layout.background

object

layout.canvas

"page" | "document"

layout.floatRoom

"auto" | integer

layout.frame

"wide" | "content" | "column" | "full"

layout.guides

object

layout.gutter

number | string | object

layout.heroDecor

object

layout.indexHeader

"show" | "hide-title" | "hide"

layout.measure

string

layout.widths

object

legal

object

legal.comments

boolean

legal.cookies

object

legal.date

object

legal.definitions

"list" | "table" | "inline-bold"

legal.diff

object

legal.docNav

"none" | "sidebar" | "footer-list"

legal.docNavPhone

"footer-list" | "disclosure" | "none"

legal.embed

object

legal.facts

object

legal.gate

object

legal.gloss

"inline-callout" | "margin" | "table-top"

legal.head

object

legal.history

"disclosure" | "open" | "none"

legal.item

object

legal.kickerTone

"muted" | "brand" | "ink"

legal.list

object

legal.look

"default" | "paper" | "trust-center" | "ledger" | "plain-site"

legal.numbering

object

legal.register

object

legal.subprocessors

object

legal.subscribe

boolean

legal.summary

object

legal.summaryLook

object

legal.titleSize

"sm" | "md" | "lg" | "xl"

legal.trust

object

legal.upcoming

"banner" | "none"

legal.upcomingLook

"banner" | "bar"

legal.variants

object

logoDarkMode

"none" | "invert" | "plate"

logoIncludesName

boolean

logoMark

any | string | ""

logoUrl

any | string | ""

logoUrlDark

any | string | ""

logoUrlLight

any | string | ""

mediaOrigins

string[]

mobile

object

mobile.css

string

mobile.density

"compact" | "cozy"

mobile.fontScale

number

mobile.hide

string[]

mobile.logoUrl

any | string | ""

monoFontFamily

string

motion

object

motion.ambient

object

motion.easing

string

motion.enabled

boolean

motion.header

object

motion.hover

object

motion.keyframes

object[]

motion.pageCrossfade

boolean

motion.pageTransition

"none" | "fade" | "slide-up" | "slide-left" | "scale"

motion.preset

"none" | "subtle" | "lively" | "playful"

motion.respectReducedMotion

boolean

motion.reveal

object

motion.scroll

object[]

motion.speed

number

motion.targets

map

newsroom

object

newsroom.corrections

object

newsroom.productCard

object

newsroom.reminders

object

newsroom.sources

object

notFound

object

notFound.body

string

notFound.hidePage

boolean

notFound.hideSearch

boolean

notFound.links

object[]

notFound.pageId

string

notFound.pageSpaceId

string

notFound.redirect

"none" | "home"

notFound.showSearch

boolean

notFound.showSections

boolean

notFound.title

string

onThisPage

"auto" | "always" | "never"

palette

object

palette.background

string

palette.danger

string

palette.footer_background

string

palette.footer_primary

string

palette.header_background

string

palette.header_primary

string

palette.heading

string

palette.highlight

string

palette.info

string

palette.ink

string

palette.line

string

palette.love

string

palette.muted

string

palette.paper

"warm" | "white" | "soft" | "grey"

palette.primary

string

palette.quaternary

string

palette.secondary

string

palette.success

string

palette.surface

string

palette.tertiary

string

palette.tint

boolean

palette.warning

string

paletteDark

object

paletteDark.background

string

paletteDark.danger

string

paletteDark.footer_background

string

paletteDark.footer_primary

string

paletteDark.header_background

string

paletteDark.header_primary

string

paletteDark.heading

string

paletteDark.highlight

string

paletteDark.info

string

paletteDark.ink

string

paletteDark.line

string

paletteDark.love

string

paletteDark.muted

string

paletteDark.paper

"warm" | "white" | "soft" | "grey"

paletteDark.primary

string

paletteDark.quaternary

string

paletteDark.secondary

string

paletteDark.success

string

paletteDark.surface

string

paletteDark.tertiary

string

paletteDark.tint

boolean

paletteDark.warning

string

post

object

post.adjacent

object

post.after

object

post.align

"start" | "center"

post.authorCard

boolean | object

post.bodyGap

number | string | object

post.breadcrumb

"back" | "trail" | "none"

post.breadcrumbStyle

object

post.byTag

map

post.byline

object

post.comments

object

post.cover

object

post.dropCap

object

post.footnotesPosition

"body" | "post-end"

post.furtherReading

object

post.header

object

post.helpful

object

post.layout

"single" | "rail-left" | "rail-right" | "offset" | "split-cover"

post.marks

object

post.masthead

object

post.offset

object

post.paddingTop

number | string | object

post.pageActions

object

post.paywall

object

post.print

object

post.rail

object

post.seriesNav

object

post.share

object

post.split

object

post.sponsor

object

post.suggested

object

post.toc

object

primaryColor

string

primaryColorDark

string

roadmap

object

roadmap.card

object

roadmap.colors

object

roadmap.feed

object

roadmap.filters

object

roadmap.header

object

roadmap.item

object

roadmap.lanes

object

roadmap.look

"default" | "paper" | "kanban" | "minimal" | "portal"

roadmap.submit

object

roadmap.vote

object

roadmap.widget

object

roadmap.width

"column" | "board" | "max" | "full"

schemaLogoUrl

any | string | ""

scriptOrigins

string[]

settings

map

settingsSchema

object[]

settingsSchema[].default

string | number | boolean

settingsSchema[].key

string

yes

settingsSchema[].label

string

settingsSchema[].options

string[]

settingsSchema[].type

"bool" | "int" | "string" | "enum" | "color"

yes

showLanguageSwitcher

boolean

status

object

status.banner

object

status.bars

object

status.card

object

status.colors

object

status.components

object

status.dates

object

status.header

object

status.hero

object

status.history

object

status.incident

object

status.incidents

object

status.kpis

object

status.layout

object

status.legend

object

status.look

"default" | "classic" | "band" | "monitor" | "calm" | "minimal" | "paper"

status.maintenance

object

status.metrics

object

status.outages

object

status.page

object

status.partners

object

status.phone

object

status.print

object

status.rows

object

status.sla

object

status.subpages

object

status.subscribe

object

status.title

object

status.uptime

object

status.widget

object

status.words

object

stringOverrides

map

titleBand

object

titleBand.above

integer

titleBand.blend

"normal" | "multiply" | "screen" | "overlay" | "darken" | "lighten" | "color-dodge" | "color-burn" | "hard-light" | "soft-light" | "difference" | "exclusion" | "hue" | "saturation" | "color" | "luminosity"

titleBand.height

integer

titleBand.heightPhone

integer

titleBand.layers

object[]

yes

titleBand.layersDark

object[]

titleBand.pages

"posts" | "all"

titleBand.titleColor

string

titleBand.titleColorDark

string

typography

object

typography.baseSize

number

typography.bodyWrap

"wrap" | "pretty"

typography.features

object

typography.fluid

object

typography.headingTransform

"none" | "uppercase" | "lowercase" | "capitalize"

typography.headingWrap

"wrap" | "balance" | "pretty"

typography.levels

object

typography.numerals

"proportional" | "tabular"

typography.opticalSizing

"auto" | "none"

typography.rhythm

"reader" | "product"

typography.scale

"minor-second" | "major-second" | "minor-third" | "major-third" | "perfect-fourth" | "augmented-fourth" | "perfect-fifth" | "golden"

typography.ui

"sans" | "serif" | "system"

typography.variation

object

whiteLabel

boolean

Hide Forumulate branding in the public readers and emails. Inside a site, the SITE theme’s whiteLabel (config.theme.whiteLabel) decides for every space in it.

Common mistakes

Each of these is answered with a did-you-mean by the API’s 422 and by forumulate validate.

Where

You wrote

We read

Why

footerColumns[]

title

heading

A footer column is a heading over links, as in the rendered HTML.

footerColumns[]

items

links

A column holds links, each {label, href}.

footerLinks[]

title

label

Every link in the chrome is {label, href}.

headerLinks[]

title

label

Every link in the chrome is {label, href}.

headerLinks[]

url

href

Links take href, as in HTML.

footerLinks[]

url

href

Links take href, as in HTML.

socialLinks[]

url

href

Links take href, as in HTML.

socialLinks[]

network

platform

A social link names its platform (github, x, linkedin, …).

cta

text

label

A button is {label, href}.

cta

url

href

A button is {label, href}.

top level

primary

primaryColor

Colours are named <role>Color.

top level

accent

accentColor

Colours are named <role>Color.

top level

brandColor

primaryColor

The brand colour is the theme’s primaryColor.

top level

font

fontFamily

The body face is fontFamily; headings take headingFontFamily.

typography

headingAnchors

headingAnchors

It is a top-level theme key, not part of typography.

top level

sidebar_position

order

Front matter: order positions a page; sidebar_position is read as it.

top level

favicon

faviconUrl

Image keys end in Url.

top level

logo

logoUrl

Image keys end in Url.

The Forumulate teamUpdated