-
Notifications
You must be signed in to change notification settings - Fork 5
Web Fonts
Web fonts have decent support in modern email clients. This means that you can progressively enhance your emails with custom fonts, while showing a fallback system font in clients that don't support them.
Maizzle PHP supports Google Fonts, but you can also add your own, custom fonts.
You can define which Google Fonts your templates should use either globally in config.php, or for each template, through a Front Matter variable. Once defined, you register the utility with Tailwind, so that it can generate the CSS classes.
In config.php, add your Google Fonts in the googleFonts array, following Google's syntax.
Maizzle PHP will add the necessary <link> tag to the default master.blade.php layout:
'googleFonts' => [
'Open+Sans',
'Roboto',
],When editing a template, you can specify which Google Fonts to use for this template only, through a Front Matter variable. For example, here's how Maizzle PHP sets it in the letter.blade.md template:
---
extends: _layouts.letter
title: Simple content-focused newsletter
preheader: This month's words of wisdom
googleFonts: ['Roboto', 'Open+Sans']
headline: This is an example of using layouts as templates in Maizzle, to only write emails in Markdown
---Of course, you can import specific subsets and weights:
---
extends: _layouts.master
googleFonts: ['Roboto&subset=latin-ext', 'Open+Sans:300,400']
---Now that the fonts are being imported, we need to define a font stack utility in tailwind.js,
so that Tailwind can generate the CSS classes. Imagine we imported Merriweather - let's add the font-merriweather utility:
// tailwind.js
fonts: {
'merriweather': [
'Merriweather',
'Constantia',
'Georgia',
'serif',
],
// ...
},Email clients that support web fonts don't require the font-family to be inlined in your HTML. Therefore, we can make use of Maizzle PHP's all breakpoint and tuck the class inside a @media screen {} query, so that Juice won't inline it and we shave off some bytes.
For example:
<h1 class="all-font-merriweather">Headline text</h1>Note: for this to work, Maizzle sets fonts: ['responsive'], in your tailwind.js config.
In case you want to use a custom (brand?) font, or your ESP doesn't support <link> tags in emails (i.e. Shopify notifications), you need to use @font-face to register the font family instead.
Here are a couple of ways you could go about it:
You can create a partial that registers the @font-face rules. For example, let's create a typography.css file in source/_styles/partials. We need a URL to a font file, so let's use Lato from Google Fonts:
@screen all {
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v14/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
}Next, we must import it in main.css:
@import "tailwindcss/components";
@import "partials/reset";
@import "partials/typography"; /* import the typography partial */
@import "partials/custom-utilities";
@import "tailwindcss/utilities";Then, just as before, we register the utility with Tailwind CSS:
// tailwind.js
fonts: {
'lato': [
'Lato',
'-apple-system',
'Segoe UI',
'sans-serif',
],
// ...
},Now we can use it:
<h1 class="all-font-lato">Headline using custom webfont</h1>You can also use a Blade Stack to @push() a <style> tag right before </head>:
// confirm-email.blade.md
---
title: Confirm your email
preheader: Please verify your email address with us
bodyClasses: bg-grey-light
---
@push('head')
<style>
@media screen {
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v14/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
}
</style>
@endpush()
// your HTML...data-embed not required
In the example above, since we're using a @media query, we don't need to add the data-embed attribute on the <style> tag in order to prevent Juice from inlining it.