Words are the backbone of the Internet, despite the proliferation of media. This means the typefaces you choose for your site will be a crucial aspect of your layout and design.

WordPress typography can evoke moods, help with branding, and more. Full site editing (FSE) in WordPress puts customizing this typography in the hands of users — and the theme.json file helps developers build WordPress themes that leverage this.

This article explores WordPress typography for both FSE and theme.json. However, the discussion also includes key contexts such as the technology you use, the technical considerations to bear in mind, and setting the evolution of how we use typefaces in design.

Typography on the web: a quick history

If you look back at early web designs, you can see that, despite the variety in layouts, typefaces have had a consistent presentation. This is part availability and part necessity. In a nutshell, without the technology we have now, words on the web can only use fonts available on your computer.

A mid-to late-’90s “web surfer” would have only a handful of predictable typefaces: Times New Roman, Arial, Helvetica, Georgia, and Verdana. The latter two are Microsoft commissions that render well for the web regardless of the era.

A comparison of two serif typefaces, Verdana and Georgia. The image shows uppercase and lowercase letters – as well as numbers – in both fonts. Verdana appears more condensed and geometric, while Georgia has more pronounced serifs and a slightly more traditional look.
Specimens of both the Verdana and Georgia fonts.

This primitive selection is consistent and dependable but lacks flexibility. Services such as Google Fonts and Adobe Fonts use the WOFF file format to give you access to a font library of thousands, with a straightforward embedding process.

The Google Fonts website showing font previews and filtering options. The preview text reads,
The main Google Fonts interface.

This gives you greater scope to improve readability, create distinctive designs, and tailor the user experience (UX) for your site. Drawbacks include potential performance hits (such as a content layout shift), reliance on third-party services to display the most crucial element on your site, and privacy concerns.

This leads many web designers to forgo font libraries and reconsider using system fonts. The faster processing and control you have over applying a “system font stack” that prioritizes native typefaces and also uses fallback options is a solid approach.

WordPress and typography

WordPress places a strong emphasis on typography to help you create engaging and readable content. Throughout its history, the WordPress default themes all use font pairings that strike a balance between aesthetics and functionality.

Current default themes use system font stacks for a clean, modern, and performant presentation. Older default themes use pairings such as Noto Sans and Noto Serif (for Twenty Fifteen) and Montserrat and Merriweather (for Twenty Sixteen).

To showcase this typography “circle of life”, Twenty Sixteen uses Helvetica and Georgia as fallback options. The Twenty Ten default theme only uses Helvetica, Arial, and Georgia:

The WordPress.org theme preview for
The Twenty Ten demo page from WordPress.org.

While these choices set the tone for WordPress design within each theme, they can also inspire you to pay close attention to how you use typography — something WordPress FSE helps with.

A quick primer on full site editing and theme.json

FSE and theme.json are central to how you manage typography in WordPress, so understanding each is essential. FSE leverages the Block Editor and adds more functionality to become the Site Editor.

The WordPress Site Editor interface displaying a landscaping company's homepage. The page has a blue background with white text reading
The WordPress Site Editor interface looks much like the Block Editor, but with more customization scope.

This unifies your site design options in a number of ways:

  • You use the editing approach of Blocks for the entire site, not just your content.
  • A template library is part of the setup, so you can edit these using the same tools as your content.
  • Styling also happens within the Site Editor and offers a global settings scheme.
  • Site editing doesn’t need any code in order to implement any of the available options. This bridges the gap between development and end-user design.

You can consider the theme.json file to be a development version of FSE. You need JavaScript Object Notation (JSON) knowledge to work with the file, but this is within the capabilities of most site owners. It’s a central configuration file for managing your global styles and settings.

A code editor window titled is displayed over a scenic background of forested mountains. The editor shows a portion of a WordPress theme.json file with various styling configurations. The code includes settings for calendar, categories, and code elements, using CSS variables for colors and spacing. Line numbers are visible on the left, and the editor interface has a dark theme for improved readability against the backdrop.
A theme.json file showcased within a code editor.

Each setting uses a key/value pair of option:value, and you can implement this in a number of ways:

  • Defining global color palettes.
  • Setting up font families and sizes.
  • Configuring Block-specific styles.
  • Managing spacing and layout preferences.

Leveraging theme.json lets you create more consistent and customizable themes without the need for custom CSS (although this is also possible). The adaptability and flexibility of theme.json means this is a key component of developing themes for WordPress. The optimal approach is to use both in different ways for all of your theme design — and typography is no exception.

Setting up typography within the WordPress Site Editor

If you know how to use the Block Editor, you can also use the Site Editor. Within WordPress, navigate to the Appearance > Editor screen. This displays the home screen for the Site Editor:

The WordPress Site Editor home screen. The left-hand sidebar shows design options, while the main area displays a blue-themed homepage with the heading
The Site Editor home screen.

The Styles screen in the left-hand navigation gives you some global design options that include typography changes:

A GIF of the WordPress Site Editor showcasing various theme style presets. The main content area displays
Different styles preset options within the WordPress Site Editor.

For most use cases, individual settings for various typography aspects will give you greater value. There are two small icons at the top of the Styles screen that will open further options: the Style Book and the Edit Styles pencil icon.

A portion of the WordPress Site Editor showing style options on the left-hand side, and a preview of the website on the right. Two icons for viewing and editing are highlighted in red.
The styles editing icons within the Site Editor.

In addition, you can set typography options at an element level and for each Block.

The Font Library

The Edit Styles > Typography screen displays the Font Library, although it doesn’t have this explicit name within the Site Editor. This lets you handle fonts and typefaces in a few ways:

  • You can upload and manage custom typefaces.
  • There’s an option to use Google Fonts directly within WordPress.
  • Create font collections using PHP.

To access the Font Library from the Typography section in the Site Editor sidebar, click the Manage fonts icon:

The Typography settings panel within the Site Editor showing font options, including Cardo, Jost, System Sans-serif, and System Serif. A Manage fonts button is highlighted in the top right corner. The panel is displayed alongside a blue website background containing Latin text, demonstrating the applied typography styles.
The Manage Fonts icon within the WordPress Site Editor.

Here, the Library tab shows you the current registered typefaces for your theme and indicates which ones are active:

The WordPress Font Library interface displaying installed and theme fonts. Merriweather Sans is listed as an installed font with four active variants. Theme fonts include Cardo, Jost, System Sans-serif, and System Serif, each with their respective active variants.
The WordPress Font Library interface.

Clicking through any of these lets you activate or deactivate individual fonts:

The Font Library selection dialog box displaying options for the Cardo font family. The dialog shows three variants: Cardo Normal, Cardo Bold, and Cardo Normal Italic, each with a checkbox selected. Above the variants, there's a note cautioning that too many font variants could slow down the website.
The current active fonts within the Site Editor’s Font Library.

On the Upload tab, you use a drag-and-drop uploader dialog to install your own fonts in TTF, WOFF, WOFF2, and OTF formats.

The Install Fonts tab connects to Google Fonts, so you can leverage that library within your theme. Note that this approach downloads and serves fonts from your site, rather than a Google CDN:

The WordPress Font Library showing options to install Google Fonts. The search bar lets users find specific fonts, and a list displays various font options including Merienda, Merriweather, and Metal Mania. Pagination controls are visible at the bottom.
The Google Fonts library within the WordPress Site Editor.

Here, select the fonts you want to install from the comprehensive list, then click the Install button. Once the success notification displays, those fonts will show on the Library tab:

The WordPress Font Library displaying installed and theme fonts. Merriweather Sans is listed as an installed font with four variants active. Theme fonts include Cardo, Jost, System Sans-serif, and System Serif, each with their respective active variants.
The installed fonts for a WordPress instance.

This lets you use the fonts as you would any other on your site. Now, you have to customize them to fit your needs.

The Style Book

One of the dangers of choosing and setting typefaces is that you don’t know how it will look in combination with color schemes, layouts, and formattings. The Style Book is invaluable, as it lets you preview your typography settings across different elements.

The WordPress Style Book editor interface showing a blue background with
The Site Editor Style Book.

Choosing the eye icon will open the Style Book, and there are five tabs here:

  • Text: Go here to work with paragraphs, headings, lists, and other elements that focus on text.
  • Media: Here, you can adjust images, video, and audio design presentations.
  • Design: This section collates structural design facets, such as columns, separators, and buttons.
  • Widgets: There are two elements to this screen: dynamic generations, such as lists of archives and comments. You also work with the search bar, social media icons, and tag clouds here.
  • Theme: This focuses on your site header elements, such as the title, tagline, navigation, and logo.

If you click on an element in the Style Book, you have various options to play with in the sidebar. You’re working with the typography settings for each Block here rather than dedicated elements:

The Style Book showing the Typography settings panel with options for headings and paragraphs. The heading
You have full scope to edit typography directly from the Style Book.

You can arrive at the same screens through the Styles > Blocks section from the Site Editor homepage. Regardless, the options you see let you customize the typography (and more) of each Block in granular detail.

Tuning typography options within the Site Editor

For all Blocks and elements, you have the same core options available to you. Here’s an overview of each option within the panel.

Font type and size

The Font drop-down menu is straightforward: choose the font you want to apply to the specific element or Block:

The Style Book interface displaying a paragraph from Don Quixote and a list of characters from Alice in Wonderland. The right-hand sidebar shows typography settings, including font selection (currently set to Cardo) and various text formatting options. A quote by Julio Cortázar is featured in a blue box at the bottom.
Choosing a font from the available selection in the Typography tab.

The Size presets have the least customization within the Site Editor. You choose a size from a range between Small and Extra Extra Large:

The Site Editor's Typography settings panel. The font is set to Cardo, size is set to Medium (M), and the appearance drop-down menu shows Regular selected. Line height is set to 1.55, and additional options for letter spacing and letter case are visible.
WordPress offers font size presets within the Site Editor.

If you edit theme.json, you can change these preset values — but can’t from the Site Editor. The Set Custom Size button gives you a way to set a custom size using an array of sizing units:

The Site Editor interface showing typography settings for a site. The main text area displays a paragraph in white on a blue background. The right-hand sidebar lets you customize font, size, appearance, and line height, with the Cardo font selected and size set to 1.2 rem.
Choosing a custom font size and unit.

There are more ways to adjust typography within the Site Editor, including methods that you typically use CSS for.

Appearance, line height, and letter spacing

The Appearance drop-down menu seems simple: choose a font weight from an extensive list and it will apply to your text. However, you won’t often have all of the available fonts for each weight.

The Appearance drop-down menu within the WordPress Site Editor. The panel is set to Regular. Below it, a line height adjustment control is set to 1.55, with plus and minus buttons for fine-tuning.
The Appearance drop-down menu in the WordPress Site Editor.

Our testing shows that WordPress doesn’t filter this list to show only available font weights. In addition, it will apply a ”nearest match” if you select a weight without a matching font. For example, we use Cardo Normal, Cardo Bold, and Cardo Bold Italic for our example site. Choosing Semi Bold, Bold, Extra Bold, or Black uses only Cardo Bold:

A GIF of the WordPress Site Editor showing a blue background with a quote from Don Quixote on the left-hand side. The right-hand sidebar shows a user cycling through options within the Appearance drop-down menu.
Changing the appearance of text within the WordPress Site Editor.

Line height doesn’t use presets and balances your font choice, appearance, and size.  This value puts more space between each line and it’s often a practical implementation when text looks bunched up:

A GIF of the WordPress Site Editor showcasing a change in the line height setting within the right-hand sidebar. The main area displays text from Don Quixote and a list of characters from Alice in Wonderland. A quote at the bottom reads,
Changing the line height in the WordPress Site Editor.

Letter spacing is similar, and it follows the CSS custom of adding itself to the natural spacing that’s present:

The Site Editor Typography sidebar showing the font set to Cardo, with options to adjust size, appearance, line height, and letter spacing. A blue background with white text showcases how the letter spacing (5 px here) appears on the website.
You can push letter spacing too far to be usable.

As with custom font sizing, you can select different units of measurement. Choosing a relative value is often the preferable approach here. WordPress sets letter spacing to a CSS default of “normal.” This lets the browser choose the value and, in our experience, this is ideal.

It’s a typical practice to use small positive letter spacing values — often no more than 0.12rem/em — and hardly any negative spacing.

The final set of choices – letter case – lets you choose to make text upper, lower, or sentence case. You can also remove the casing. This is great for consistency when it comes to type, as you don’t need to specifically use a specific case when creating content.

How to use theme.json to define your WordPress theme’s typography

The Site Editor is great for site users without technical knowledge. The theme.json file is how you ensure the Site Editor gives users what they need to customize their sites. It’s the configuration file that is the development base for your theme.

We aren’t going  into the structure and formatting of the entire theme.json file, but we are looking at how to define, set, and apply typography within.

Understanding the theme.json structure and defining global settings

You use JSON to define all elements within theme.json, which includes typography. The typography element nests under the settings object within that file. From there, you nest further elements, properties, and objects to build your site’s typography:

{
  "version": 3,
  "settings": {
    "typography": {
      "fontFamilies": [
        {
          "fontFamily": "-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif",
          "slug": "system-font",
          "name": "System Font"
        }
      ],
      "fontSizes": [
        {
          "slug": "small",
          "size": "13px",
          "name": "Small"
        },
        {
          "slug": "medium",
          "size": "20px",
          "name": "Medium"
        }
      ]
    }
  }
}

All of these elements follow a similar pattern. The defaults — and easiest to understand — are global settings. These nest in a straightforward way, but you can also define typography settings for individual Blocks:

"styles": {
  "blocks": {
    "core/paragraph": {
      "typography": {
        "fontFamily": "var(--wp--preset--font-family--primary)",
        "fontSize": "var(--wp--preset--font-size--medium)",
        "lineHeight": "1.5"
      }
    },
    "core/heading": {
      "typography": {
        "fontFamily": "var(--wp--preset--font-family--secondary)",
        "fontWeight": "700"
      }
    }
  }
}

This uses the blocks property and a specific namespace for each Block you want to target. While it adds two more nesting layers, there’s no alternative to this approach. Regardless, you have a lot of properties to play with.

Registering fonts

You have the same level of customization for typography as you do within the Site Editor interface — more in some instances. At a core level, you nest your font stack to the fontFamilies property, then give it a slug and name:

  • fontFamily maps to the font-family CSS value, and will be the stack of typefaces you wish to use in your theme.
  • name is what you see in the Site Editor when selecting a font, so it will be human-readable.
  • slug appends to a custom CSS property for further use.

For system fonts, this is straightforward:

…
  "typography": {
    "fontFamilies": [
    {
      "name": "Primary",
      "slug": "primary",
      "fontFamily": "Charter, 'Bitstream Charter', 'Sitka Text', Cambria, serif"
    },
    {
      "name": "Secondary",
      "slug": "secondary",
      "fontFamily": "system-ui, sans-serif"
      }

Registering custom web fonts requires that you use the fontFace property and define some attributes:

…
"name": "Secondary",
"slug": "secondary",
"fontFamily": "'Open Sans', sans-serif",
  "fontFace": [
    {
      "fontFamily": "Open Sans",
      "fontWeight": "300 800", // This is a range of font weight values.
      "fontStyle": "normal", // This has to be a valid CSS font-style value.
      "fontStretch": "normal", // This also needs to be a valid CSS font-stretch value.
      "src": [ "file:./assets/fonts/open-sans.woff2" ] // This is an array of URLs for custom fonts, and can support multiple formats.
    },
…

Once you have registered fonts, you select them from the various drop-down menus within the Site Editor.

Note that there are a few ways you can register typefaces for your theme. You have the Font Library within the Site Editor interface, typical PHP enqueuing, and the Create Block Theme plugin:

A blue background with white text reading CREATE BLOCK THEME in a bold sans-serif font. The words are stacked vertically with CREATE at the top in the largest size, BLOCK slightly smaller in the middle, and THEME smallest at the bottom.
The Create Block Theme header image from WordPress.org.

This is a boilerplate for building a theme, but also lets you register and define typography too. Once you register fonts in whatever way is comfortable (we recommend the Font Library), you can begin to look at sizing.

Setting font sizing and presets within theme.json

Another core task with typography is setting font sizes. This uses the fontSizes property and lets you define presets for the Site Editor:

"settings": {
  "typography": {
    "fontSizes": [
      {
        "slug": "small",
        "size": "12px",
        "name": "Small"
      },
      {
        "slug": "x-large",
        "size": "32px",
        "name": "Extra Large"
      }
    ]
  }
}

As with other typography settings, WordPress will generate a custom CSS property for each preset using the slug you provide:

body {
--wp--preset--font-size--small: 12px;
--wp--preset--font-size--x-large: 32px;
}

WordPress disables fluid typography by default, but you can turn this on using boolean values. It’s an option you can set at a global level…

{
  "version": 2,
    "settings": {
      "typography": {
        "fluid": true
      }
    }
}

…or for each preset and size you define:

{
  "name": "Medium",
  "size": "1.25rem",
  "slug": "md",
  "fluid": {
    "min": "1rem",
    "max": "1.5rem"
  }
},

The min and max values let you determine the range of scalability for each fluid font size you define.

Implementing advanced typography features

The theme.json provides a full complement of options, on par with what you can find in the Site Editor. This lets you customize the typography on your site to a set of defaults that make sense for your theme:

"styles": {
  "typography": {
    "letterSpacing": "0.02em",
    "textTransform": "uppercase",
    "textDecoration": "underline",
    "lineHeight": "1.55rem",
    "fontStyle": "normal"
  }
}

You can choose to enable or disable these options. Each option takes a boolean value, which means you have some customization options for the Site Editor, too. There are a few customizations you can make that go beyond the Site Editor’s offerings:

  • customFontSize is on by default, and lets users input custom font sizes — but you can disable it if you want to tightly control the available options.
  • dropCap defaults to false, but if you enable it, the user has the option to enable drop caps for the initial letter of any Paragraph blocks.
  • textColumns enables a “columns” option for any text within a Block, and this is off by default.
  • writingMode enables options to change the text orientation within the Site Editor. You can give users a choice between horizontal and vertical text.

The scope of theme.json means you should work there first, especially when building a theme. The options in the Site Editor will let you or your users refine WordPress typography.

How to implement typography using theme.json: a practical example

FSE makes design and development with WordPress easier than ever before. What’s more, some of the general process of selecting and implementing those typefaces is more straightforward. Some of this is due to design trends, but the tools exist to plug gaps where you don’t have a graphic designer available to help.

We can start with your core typeface selections.

1. Pair complimentary typefaces

There’s a reason so much writing goes into how to choose fonts and typefaces. It’s because it can be a tricky task. For instance, you have to consider the branding of the site, its purpose, and what you want to convey.

However, thanks to current design trends, there’s much less work to do here. This is because your body text can use system fonts — specifically the primary operating system (OS) typeface. The only task for you is to choose something that works alongside it.

This isn’t a tutorial on pairing typefaces, but we have some tips to pass on:

  • OS typefaces for the body copy will typically be sans-serif. This means looking for either a serif typeface or another sans-serif that looks different, unique, and stands out.
  • Keep things simple, and maybe consider only using the OS font if it works with the design.
  • Test out different combinations, as you can get a feel for which typefaces work together (and which don’t).

A good pair for a system font stack is Playfair Display, a serif Google Font:

The Google Fonts website displaying the Playfair Display font specimen. The sample text reads,
The Google Fonts specimen page for Playfair Display.

With a pair of fonts, you have to consider their size, not only on the page but in relation to one another.

2. Find the right absolute and relative sizing

Choosing font sizing is also crucial, as the wrong absolute sizes can ruin your UX/UI. It’s also an area where you may want to stick to the defaults. However, we encourage you to experiment here, as each pairing will have its own “space” for the typefaces.

Typescale is an excellent tool that can help you create the right WordPress typography, whatever your need:

The Typescale web app interface for customizing typography. The left-hand panel shows font settings, while the right-hand side displays a preview of different heading sizes and a sample landing page design.
The Typescale website.

One of the best aspects of the tool is the scale choices. It essentially does lots of work for you in choosing complimentary font sizes. We select a Major Third scale here, with a factor of 1.2 and a base size of 16px:

A typography scale interface from Typescale, displaying various heading sizes for
The font scaling options within Typeface.

Looking in the middle panel, you will see the resulting sizes for each heading and paragraph and can choose from a number of units of measurement. Note that Typescale also lets you change the letter spacing, line height, font weight, and more: all customizable within theme.json.

3. Applying defaults within theme.json

Once you have the right typefaces and sizing, you can implement them within your theme.json file. Here’s an example of what a typical theme.json file will look like:

{
  "version": 3,
  "settings": {
    "typography": {
      "fontFamilies": [
        {
          "fontFamily": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif",
          "slug": "ubuntu-sans",
          "name": "Ubuntu Sans"
        },
        {
          "fontFamily": "\"Playfair Display\", serif",
          "slug": "playfair",
          "name": "Playfair Display"
        }
      ],
      "fontSizes": [
        {
          "slug": "small",
          "size": "13px",
          "name": "Small"
        },
        {
          "slug": "medium",
          "size": "16px",
          "name": "Medium"
        },
        {
          "slug": "large",
          "size": "20px",
          "name": "Large"
        },
        {
          "slug": "x-large",
          "size": "25px",
          "name": "Extra Large"
        },
        {
          "slug": "huge",
          "size": "31px",
          "name": "Huge"
        }
      ]
    }
  },
  "styles": {
    "typography": {
      "fontFamily": "var(--wp--preset--font-family--system)",
      "fontSize": "var(--wp--preset--font-size--medium)",
      "lineHeight": "1.8"
    },
    "blocks": {
      "core/paragraph": {
        "typography": {
          "fontSize": "var(--wp--preset--font-size--medium)"
        }
      },
      "core/heading": {
        "typography": {
          "fontFamily": "var(--wp--preset--font-family--playfair)",
          "fontWeight": "700"
        }
      },
      "core/post-title": {
        "typography": {
          "fontSize": "var(--wp--preset--font-size--huge)"
        }
      }
    }
  }
}

You can apply also these typefaces to any Block, and even think about styling each heading in a unique way. Look to create a consistent and hierarchical WordPress typography system that will form the foundation of your theme’s design. It will ensure a cohesive look across your site, while the Site Editor will give you better flexibility and customization.

Kinsta’s role in your WordPress theme development workflow

Kinsta’s high-performance hosting offers plenty to help you run an efficient and speedy website. However, it also offers robust development tools, including DevKinsta, a local development environment that runs on Docker containers.

An artistic illustration of the DevKinsta logo. It depicts a person working at a computer in a dark environment. The image uses shades of blue and purple, showing hands typing on a keyboard and adjusting equipment. A monitor displays a stylized K logo.
The DevKinsta logo.

It’s important to make sure your WordPress typography works before you push live. This is where Kinsta’s staging environments will be essential. In particular, Selective Push will be something you use a lot. This lets you push specific files and folders — any asset you wish — rather than everything at once.

The MyKinsta interface showing a Push to Live dialog box. Options to push files and databases from staging to live environment are presented, with checkboxes for specific files, folders, and database tables.
Kinsta’s selective push tool.

This way, you can make discreet design changes by pushing singular files (such as theme.json). In addition, you can minimize the risk of damaging parts of your site’s design you are happy with, and you can make more frequent, incremental updates to your site’s typography.

Summary

FSE is maturing, and theme.json is central to the whole approach to WordPress editing. Typography is a critical factor, and WordPress provides developer-level tools and access to elements that would previously require a grounding in CSS and PHP.

Between the Site Editor’s intuitive interface, and the adaptability of theme.json, you can create typography that enhances your site’s aesthetics, resonates with your branding, and gives a boost to the overall user experience.

We’d love to hear about your experiences with WordPress typography and whether FSE holds the key to success for you. Share your thoughts with us in the comments below.

Jeremy Holcombe Kinsta

Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.