Font Scheme
Schema for font-scheme records. Each scheme pairs a major (heading) and minor (body) font family in the OOXML majorFont/minorFont sense, scoped to a target app (powerpoint or google-slides) and a language family (Latin, East Asian, or Complex Script). Documents reference a scheme from design.fontScheme (or design.fontScheme.id), from a theme's fontScheme and from a language's fontScheme / googleFontScheme. Role overrides on design.fontScheme (heading, body, accent, code), each a font family name, take precedence over the resolved scheme. A document references a record as a bare id or 'name:id' and resolves it in its own catalogs groups first, then in the catalog the host registered for the group's source; engines never fetch a catalog. A published record file carries '$schema' and 'id'; the copy a document embeds under catalogs.<group>.<kind>.<id> carries neither (the key is the id) and no 'x-*' display metadata.
Field index
| Field | Type | Req. | Default | Description |
|---|---|---|---|---|
| $schema | const | yes | — | Identifies a published record file as a font scheme record. Required in a published file; an embedded copy omits it.
|
| id | string | yes | — | The font scheme's id in its catalog, lowercase kebab-case. Required in a published record file; a document references the record by it (a bare id, or 'name:id' for a named group) and embeds it keyed by it, without this field. |
| name | string | yes | — | Human-readable scheme name shown in pickers. |
| major | string | yes | — | Heading (major) font family — mirrors the OOXML majorFont entry. |
| minor | string | yes | — | Body (minor) font family — mirrors the OOXML minorFont entry. |
| code | string | — | — | Optional monospaced font family name for code blocks and for inline code runs (TextRun.code). It has the same shape as the OPF FontScheme 'code' role, so a record and an inline design.fontScheme override are interchangeable. OOXML has no code slot, so exporters write this family on code runs. When neither design.fontScheme nor the resolved record defines 'code', engines fall back to Roboto Mono. |
| eastAsian | object | — | — | East Asian script fonts. Maps to the OOXML a:ea element of majorFont (major) and minorFont (minor), and to run-level a:ea. When set, they fill the eastAsian slot for every language; when omitted, the slot comes from this scheme's own major/minor when languageFamily is 'ea' and the scheme's languages list is empty or names the presentation language, then from the presentation language's font scheme for East Asian languages, and otherwise from the latin (major/minor) families. A missing 'major' or 'minor' falls back to the other. |
| complexScript | object | — | — | Complex-script fonts (for example Arabic, Hebrew, Indic and Thai). Maps to the OOXML a:cs element of majorFont (major) and minorFont (minor), and to run-level a:cs. When set, they fill the complexScript slot for every language; when omitted, the slot comes from this scheme's own major/minor when languageFamily is 'cs' and the scheme's languages list is empty or names the presentation language, then from the presentation language's font scheme for complex-script languages, and otherwise from the latin (major/minor) families. A missing 'major' or 'minor' falls back to the other. |
| type | enum | — | — | High-level typographic class of the scheme.
|
| app | enum | — | — | Target application this font pairing is intended for. Metadata for pickers and catalog filters: no engine changes its output by it.
|
| languageFamily | enum | — | — | Font-language family this scheme is intended for: 'latin' for Latin-script content, 'ea' (or 'eastAsian', the same value) for East Asian scripts, 'cs' (or 'complexScript', the same value) for Complex Scripts. The long names match the 'eastAsian' and 'complexScript' slot keys; the short names match the OOXML a:ea and a:cs elements; core reads both spellings as one value. As the design font scheme, an 'ea'/'eastAsian' or 'cs'/'complexScript' scheme also fills that script slot with its own major/minor families when its languages list is empty or names the presentation language.
|
| languages | array<string> | — | — | Optional list of BCP-47 language tags this scheme is curated for. Useful for picker UIs that group fonts by language coverage. As the design font scheme, an 'ea' or 'cs' scheme fills its script slot only when this list is empty or names the presentation language: an entry matches a tag with the same language subtag (and the same script, when the entry names one). |
| textSample | string | — | — | Short specimen string used by picker UIs to preview the scheme. |
| summary | string | — | — | One-sentence positioning of the font pairing. |
| description | string | — | — | Longer prose describing the font scheme and where it shines. |
| tags | array<string> | — | — | Free-form labels for filtering and search. |
| preview | object | — | — | Visual previews of the record, used by picker UIs and inline rendering. All sub-fields are optional; engines fall back gracefully when previews aren't available. |
$schema
typeconstrequiredyesdefault—
Identifies a published record file as a font scheme record. Required in a published file; an embedded copy omits it.
$schema· Allowed values"https://openpresentation.org/schema/opf-font-scheme/v1"
{
"$schema": "https://openpresentation.org/schema/opf-font-scheme/v1"
}id
typestringrequiredyesdefault—pattern^[a-z][a-z0-9-]*$
The font scheme's id in its catalog, lowercase kebab-case. Required in a published record file; a document references the record by it (a bare id, or 'name:id' for a named group) and embeds it keyed by it, without this field.
{
"id": "aptos"
}name
typestringrequiredyesdefault—
Human-readable scheme name shown in pickers.
{
"name": "Aptos"
}major
typestringrequiredyesdefault—
Heading (major) font family — mirrors the OOXML majorFont entry.
{
"major": "Aptos Display"
}minor
typestringrequiredyesdefault—
Body (minor) font family — mirrors the OOXML minorFont entry.
{
"minor": "Aptos"
}code
typestringrequirednodefault—
Optional monospaced font family name for code blocks and for inline code runs (TextRun.code). It has the same shape as the OPF FontScheme 'code' role, so a record and an inline design.fontScheme override are interchangeable. OOXML has no code slot, so exporters write this family on code runs. When neither design.fontScheme nor the resolved record defines 'code', engines fall back to Roboto Mono.
{
"code": "Consolas"
}eastAsian
typeobjectrequirednodefault—
East Asian script fonts. Maps to the OOXML a:ea element of majorFont (major) and minorFont (minor), and to run-level a:ea. When set, they fill the eastAsian slot for every language; when omitted, the slot comes from this scheme's own major/minor when languageFamily is 'ea' and the scheme's languages list is empty or names the presentation language, then from the presentation language's font scheme for East Asian languages, and otherwise from the latin (major/minor) families. A missing 'major' or 'minor' falls back to the other.
{
"eastAsian": {
"major": "Noto Sans JP"
}
}complexScript
typeobjectrequirednodefault—
Complex-script fonts (for example Arabic, Hebrew, Indic and Thai). Maps to the OOXML a:cs element of majorFont (major) and minorFont (minor), and to run-level a:cs. When set, they fill the complexScript slot for every language; when omitted, the slot comes from this scheme's own major/minor when languageFamily is 'cs' and the scheme's languages list is empty or names the presentation language, then from the presentation language's font scheme for complex-script languages, and otherwise from the latin (major/minor) families. A missing 'major' or 'minor' falls back to the other.
{
"complexScript": {
"major": "Noto Sans Arabic"
}
}type
typeenumrequirednodefault—
High-level typographic class of the scheme.
type· Allowed values"sans-serif""serif""monospace"
{
"type": "sans-serif"
}app
typeenumrequirednodefault—
Target application this font pairing is intended for. Metadata for pickers and catalog filters: no engine changes its output by it.
app· Allowed values"powerpoint""google-slides"
{
"app": "powerpoint"
}languageFamily
typeenumrequirednodefault—
Font-language family this scheme is intended for: 'latin' for Latin-script content, 'ea' (or 'eastAsian', the same value) for East Asian scripts, 'cs' (or 'complexScript', the same value) for Complex Scripts. The long names match the 'eastAsian' and 'complexScript' slot keys; the short names match the OOXML a:ea and a:cs elements; core reads both spellings as one value. As the design font scheme, an 'ea'/'eastAsian' or 'cs'/'complexScript' scheme also fills that script slot with its own major/minor families when its languages list is empty or names the presentation language.
languageFamily· Allowed values"latin""ea""cs""eastAsian""complexScript"
{
"languageFamily": "latin"
}languages
typearray<string>requirednodefault—
Optional list of BCP-47 language tags this scheme is curated for. Useful for picker UIs that group fonts by language coverage. As the design font scheme, an 'ea' or 'cs' scheme fills its script slot only when this list is empty or names the presentation language: an entry matches a tag with the same language subtag (and the same script, when the entry names one).
{
"languages": [
"zh-Hans",
"zh-Hant",
"ja",
"ko"
]
}textSample
typestringrequirednodefault—
Short specimen string used by picker UIs to preview the scheme.
{
"textSample": "Smooth professional look"
}summary
typestringrequirednodefault—
One-sentence positioning of the font pairing.
{
"summary": "PowerPoint-default sans-serif curated for general business decks."
}description
typestringrequirednodefault—
Longer prose describing the font scheme and where it shines.
{
"description": "Aptos is the default Microsoft 365 sans-serif. The major (display) cut adds optical weight for headings, and the minor (text) cut keeps body copy readable at smaller sizes."
}preview
typeobjectrequirednodefault—
Visual previews of the record, used by picker UIs and inline rendering. All sub-fields are optional; engines fall back gracefully when previews aren't available.
Complete definition constraints
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openpresentation.org/schema/opf-font-scheme/v1",
"$comment": "The v1 in the $id is the pre-1.0 line, not a frozen contract: this schema may change in any 0.x minor release. The release that produced this copy is the version of the @openpresentation/opf package it came from (opf --version; opf schemas lists it next to each id). See docs/schema-versioning.md.",
"title": "Font Scheme",
"description": "Schema for font-scheme records. Each scheme pairs a major (heading) and minor (body) font family in the OOXML majorFont/minorFont sense, scoped to a target app (powerpoint or google-slides) and a language family (Latin, East Asian, or Complex Script). Documents reference a scheme from design.fontScheme (or design.fontScheme.id), from a theme's fontScheme and from a language's fontScheme / googleFontScheme. Role overrides on design.fontScheme (heading, body, accent, code), each a font family name, take precedence over the resolved scheme.\n\nA document references a record as a bare id or 'name:id' and resolves it in its own catalogs groups first, then in the catalog the host registered for the group's source; engines never fetch a catalog. A published record file carries '$schema' and 'id'; the copy a document embeds under catalogs.<group>.<kind>.<id> carries neither (the key is the id) and no 'x-*' display metadata.",
"type": "object",
"required": [
"$schema",
"id",
"name",
"major",
"minor"
],
"properties": {
"$schema": {
"type": "string",
"const": "https://openpresentation.org/schema/opf-font-scheme/v1",
"description": "Identifies a published record file as a font scheme record. Required in a published file; an embedded copy omits it."
},
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]*$",
"description": "The font scheme's id in its catalog, lowercase kebab-case. Required in a published record file; a document references the record by it (a bare id, or 'name:id' for a named group) and embeds it keyed by it, without this field.",
"examples": [
"aptos",
"tenorite",
"seaford",
"noto-sans",
"microsoft-yahei"
]
},
"name": {
"type": "string",
"description": "Human-readable scheme name shown in pickers.",
"examples": [
"Aptos",
"Tenorite",
"Seaford",
"Noto Sans",
"Microsoft Yahei"
]
},
"major": {
"type": "string",
"description": "Heading (major) font family — mirrors the OOXML majorFont entry.",
"examples": [
"Aptos Display",
"Calibri",
"Microsoft YaHei"
]
},
"minor": {
"type": "string",
"description": "Body (minor) font family — mirrors the OOXML minorFont entry.",
"examples": [
"Aptos",
"Calibri",
"Microsoft YaHei"
]
},
"code": {
"type": "string",
"description": "Optional monospaced font family name for code blocks and for inline code runs (TextRun.code). It has the same shape as the OPF FontScheme 'code' role, so a record and an inline design.fontScheme override are interchangeable. OOXML has no code slot, so exporters write this family on code runs. When neither design.fontScheme nor the resolved record defines 'code', engines fall back to Roboto Mono.",
"examples": [
"Consolas",
"Courier New"
]
},
"eastAsian": {
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"description": "East Asian script fonts. Maps to the OOXML a:ea element of majorFont (major) and minorFont (minor), and to run-level a:ea. When set, they fill the eastAsian slot for every language; when omitted, the slot comes from this scheme's own major/minor when languageFamily is 'ea' and the scheme's languages list is empty or names the presentation language, then from the presentation language's font scheme for East Asian languages, and otherwise from the latin (major/minor) families. A missing 'major' or 'minor' falls back to the other.",
"properties": {
"major": {
"type": "string",
"description": "Heading (major) eastAsian font family — mirrors majorFont a:ea.",
"examples": [
"Noto Sans JP",
"Meiryo",
"Microsoft YaHei"
]
},
"minor": {
"type": "string",
"description": "Body (minor) eastAsian font family — mirrors minorFont a:ea.",
"examples": [
"Noto Sans JP",
"Meiryo",
"Microsoft YaHei"
]
}
}
},
"complexScript": {
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"description": "Complex-script fonts (for example Arabic, Hebrew, Indic and Thai). Maps to the OOXML a:cs element of majorFont (major) and minorFont (minor), and to run-level a:cs. When set, they fill the complexScript slot for every language; when omitted, the slot comes from this scheme's own major/minor when languageFamily is 'cs' and the scheme's languages list is empty or names the presentation language, then from the presentation language's font scheme for complex-script languages, and otherwise from the latin (major/minor) families. A missing 'major' or 'minor' falls back to the other.",
"properties": {
"major": {
"type": "string",
"description": "Heading (major) complexScript font family — mirrors majorFont a:cs.",
"examples": [
"Noto Sans Arabic",
"Arial",
"Mangal"
]
},
"minor": {
"type": "string",
"description": "Body (minor) complexScript font family — mirrors minorFont a:cs.",
"examples": [
"Noto Sans Arabic",
"Arial",
"Mangal"
]
}
}
},
"type": {
"type": "string",
"enum": [
"sans-serif",
"serif",
"monospace"
],
"description": "High-level typographic class of the scheme."
},
"app": {
"type": "string",
"enum": [
"powerpoint",
"google-slides"
],
"description": "Target application this font pairing is intended for. Metadata for pickers and catalog filters: no engine changes its output by it."
},
"languageFamily": {
"type": "string",
"enum": [
"latin",
"ea",
"cs",
"eastAsian",
"complexScript"
],
"description": "Font-language family this scheme is intended for: 'latin' for Latin-script content, 'ea' (or 'eastAsian', the same value) for East Asian scripts, 'cs' (or 'complexScript', the same value) for Complex Scripts. The long names match the 'eastAsian' and 'complexScript' slot keys; the short names match the OOXML a:ea and a:cs elements; core reads both spellings as one value. As the design font scheme, an 'ea'/'eastAsian' or 'cs'/'complexScript' scheme also fills that script slot with its own major/minor families when its languages list is empty or names the presentation language."
},
"languages": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8})*$"
},
"description": "Optional list of BCP-47 language tags this scheme is curated for. Useful for picker UIs that group fonts by language coverage. As the design font scheme, an 'ea' or 'cs' scheme fills its script slot only when this list is empty or names the presentation language: an entry matches a tag with the same language subtag (and the same script, when the entry names one).",
"examples": [
[
"zh-Hans",
"zh-Hant",
"ja",
"ko"
]
]
},
"textSample": {
"type": "string",
"description": "Short specimen string used by picker UIs to preview the scheme.",
"examples": [
"Smooth professional look",
"这是用微软雅黑字体写的"
]
},
"summary": {
"type": "string",
"description": "One-sentence positioning of the font pairing.",
"examples": [
"PowerPoint-default sans-serif curated for general business decks.",
"East-Asian sans-serif suitable for Chinese, Japanese, and Korean content."
]
},
"description": {
"type": "string",
"description": "Longer prose describing the font scheme and where it shines.",
"examples": [
"Aptos is the default Microsoft 365 sans-serif. The major (display) cut adds optical weight for headings, and the minor (text) cut keeps body copy readable at smaller sizes."
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Free-form labels for filtering and search.",
"examples": [
[
"latin",
"sans-serif",
"default"
],
[
"east-asian",
"system"
]
]
},
"preview": {
"type": "object",
"description": "Visual previews of the record, used by picker UIs and inline rendering. All sub-fields are optional; engines fall back gracefully when previews aren't available.",
"properties": {
"src": {
"type": "string",
"format": "uri",
"description": "Main preview image (PNG/JPG). Used as the primary visual in picker UIs and previews of the record.",
"examples": [
"https://www.pptx.gallery/font-schemes/aptos.png"
]
},
"thumbnailSrc": {
"type": "string",
"format": "uri",
"description": "Smaller thumbnail preview suited to dense grid views.",
"examples": [
"https://www.pptx.gallery/font-schemes/aptos.thumbnail.png"
]
},
"vectorSrc": {
"type": "string",
"format": "uri",
"description": "SVG / vector preview for crisp scaling at any size.",
"examples": [
"https://www.pptx.gallery/font-schemes/aptos.svg"
]
}
}
}
}
}