Subchapter 7.6
references/theme-json.mdMarkdown3 KBView on GitHub
theme.json guidanceUse this file when changing global settings/styles or per-block styling.
Common top-level keys:
versionsettings (what the UI exposes / allows)styles (default appearance)customTemplates and templateParts (optional, to describe templates and parts)Upstream references:
styles when you want consistent defaults without requiring user choice.Form element styling:
styles.elements.textInput and styles.elements.select.textInput targets <textarea> and <input> elements whose type is one of: email, number, password, search, text, tel, url.input, checkbox, radio, or label element key.Border radius presets:
settings.border.radiusSizes for visual selection in the border radius control.{
"settings": {
"border": {
"radiusSizes": [
{ "name": "Small", "slug": "small", "size": "4px" },
{ "name": "Medium", "slug": "medium", "size": "8px" },
{ "name": "Large", "slug": "large", "size": "16px" }
]
}
}
}Button pseudo-classes:
References:
Slug normaliser trap (silent failure). WordPress inserts hyphens inside preset/custom slugs before emitting CSS vars: slug
3xlbecomes--wp--preset--font-size--3-xl; slugcardShadowbecomes--wp--custom--card-shadow. A handwritten reference to the un-normalised form (e.g.var(--wp--preset--font-size--3xl)) resolves to nothing and silently falls back to the secondvar()argument.
Before assembling the variable name, WP_Theme_JSON passes each preset/custom slug through _wp_to_kebab_case(), which splits it into word tokens — at digit/letter boundaries, camelCase transitions, and non-alphanumeric characters — lowercases them, and joins with -. Reference the emitted form, not the slug you typed.
Grep pattern to catch un-normalised references in CSS/SCSS/PHP/JS:
var\(\s*--wp--(?:preset|custom)--[a-z-]+--\d+[a-z]This matches a digit immediately followed by a letter inside the variable name (3xl, 2xs, 4x-large) — every emitted form keeps the hyphen (3-xl, 2-xs, 4-x-large) and is correctly not flagged.