Laravel Idea for PhpStorm - Full-featured IDE for productive artisans!

Manage self-hosted Google Fonts in Laravel apps

spatie/laravel-google-fonts image

spatie/laravel-google-fonts stats

Downloads
242K
Stars
414
Open Issues
0
Forks
30

View on GitHub →

Spatie Laravel-google-fonts Readme


Manage self-hosted Google Fonts in Laravel apps

This package makes self-hosting Google Fonts as frictionless as possible for Laravel users. To load fonts in your application, register a Google Fonts embed URL and load it with the @googlefonts Blade directive.

// config/google-fonts.php
 
return [
'fonts' => [
'default' => 'https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,700;1,400;1,700&display=swap',
'code' => 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,700;1,400&display=swap',
],
];
{{-- resources/views/layouts/app.blade.php --}}
 
<head>
{{-- Loads Inter --}}
@googlefonts
 
{{-- Loads IBM Plex Mono --}}
@googlefonts('code')
</head>

When fonts are requested the first time, this package will scrape the CSS, fetch the assets from Google's servers, store them locally, and render the CSS inline.

If anything goes wrong in this process, the package falls back to a <link> tag to load the fonts from Google.

Why we created this package

Google Fonts hosts an impressive catalog of fonts, but relying on it has its costs. By hosting fonts on an external domain, browsers need to perform an additional DNS lookup. This slows down the initial page load. In addition, you're directing your visitors to Google property, which privacy-minded users might not appreciate.

You can download fonts from Google Fonts and self-host them, but it's more work than embedding a code. Keeping up with the latest font version can also be a chore.

This package makes self-hosting Google Fonts as frictionless as possible for Laravel users.

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Installation

You can install the package via composer:

composer require spatie/laravel-google-fonts

You may optionally publish the config file:

php artisan vendor:publish --provider="Spatie\GoogleFonts\GoogleFontsServiceProvider" --tag="google-fonts-config"

Here's what the config file looks like:

return [
 
/*
* Here you can register fonts to call from the @googlefonts Blade directive.
* The google-fonts:fetch command will prefetch these fonts.
*/
'fonts' => [
'default' => 'https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,700;1,400;1,700',
],
 
/*
* This disk will be used to store local Google Fonts. The public disk
* is the default because it can be served over HTTP with storage:link.
*/
'disk' => 'public',
 
/*
* Prepend all files that are written to the selected disk with this path.
* This allows separating the fonts from other data in the public disk.
*/
'path' => 'fonts',
 
/*
* By default, CSS will be inlined to reduce the amount of round trips
* browsers need to make in order to load the requested font files.
*/
'inline' => true,
 
/*
* When something goes wrong fonts are loaded directly from Google.
* With fallback disabled, this package will throw an exception.
*/
'fallback' => ! env('APP_DEBUG'),
 
/*
* This user agent will be used to request the stylesheet from Google Fonts.
* This is the Safari 14 user agent that only targets modern browsers. If
* you want to target older browsers, use different user agent string.
*/
'user_agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
 
];

Usage

To add fonts to your application, grab an embed code from Google fonts, register it in the config and use the @googlefonts Blade directive.

// config/google-fonts.php
 
return [
'fonts' => [
'default' => 'https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,700;1,400;1,700&display=swap',
'code' => 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,700;1,400&display=swap',
],
];
{{-- resources/views/layouts/app.blade.php --}}
 
<head>
{{-- Loads Inter --}}
@googlefonts
 
{{-- Loads IBM Plex Mono --}}
@googlefonts('code')
</head>

This will inline the CSS, so the browser needs to do one less round-trip. If you prefer an external CSS file, you may disable the inline option in the package configuration.

Fonts are stored in a fonts folder on the public disk. You'll need to run php artisan storage:link to ensure the files can be served over HTTP. If you wish to store fonts in the git repository, make sure storage/app/public is not ignored.

If you want to serve fonts from a CDN, you may set up a different disk configuration.

Prefetching fonts

If you want to make sure fonts are ready to go before anyone visits your site, you can prefetch them with this artisan command.

php artisan google-fonts:fetch

Usage with spatie/laravel-csp

If you're using spatie/laravel-csp to manage your Content Security Policy, you can pass an array to the blade directive and add the nonce option.

{{-- resources/views/layouts/app.blade.php --}}
 
<head>
{{-- Loads Inter --}}
@googlefonts(['nonce' => csp_nonce()])
 
{{-- Loads IBM Plex Mono --}}
@googlefonts(['font' => 'code', 'nonce' => csp_nonce()])
</head>

Caveats for legacy browsers

Google Fonts' servers sniff the visitor's user agent header to determine which font format to serve. This means fonts work in all modern and legacy browsers.

This package isn't able to tailor to different user agents. With the default configuration, only browsers that can handle WOFF 2.0 font files are supported. At the time of writing, this is >95% of all users according to caniuse. Most notably, IE doesn't support WOFF 2.0.

If you need to serve fonts to a legacy browser, you may specify a different user agent string in the configuration. Keep in mind that makes the page load heavier for all visitors, including modern browsers.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

spatie photo

We create open source, digital products and courses for the developer community

Cube

Laravel Newsletter

Join 40k+ other developers and never miss out on new tips, tutorials, and more.


Spatie Laravel Google Fonts Related Articles

Download Over 1,500 Google Fonts in Your Laravel Project image

Download Over 1,500 Google Fonts in Your Laravel Project

Read article
Laravel Google Fonts Package image

Laravel Google Fonts Package

Read article
Supercharge Your SaaS Development with FilamentFlow: The Ultimate Laravel Filament Boilerplate logo

Supercharge Your SaaS Development with FilamentFlow: The Ultimate Laravel Filament Boilerplate

Build your SaaS application in hours. Out-of-the-box multi-tenancy and seamless Stripe integration. Supports subscriptions and one-time purchases, allowing you to focus on building and creating without repetitive setup tasks.

Supercharge Your SaaS Development with FilamentFlow: The Ultimate Laravel Filament Boilerplate
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS Starter Kit

SaaSykit is a Multi-tenant Laravel SaaS Starter Kit that comes with all features required to run a modern SaaS. Payments, Beautiful Checkout, Admin Panel, User dashboard, Auth, Ready Components, Stats, Blog, Docs and more.

SaaSykit: Laravel SaaS Starter Kit
Tinkerwell logo

Tinkerwell

The must-have code runner for Laravel developers. Tinker with AI, autocompletion and instant feedback on local and production environments.

Tinkerwell
Shift logo

Shift

Running an old Laravel version? Instant, automated Laravel upgrades and code modernization to keep your applications fresh.

Shift
Kirschbaum logo

Kirschbaum

Providing innovation and stability to ensure your web application succeeds.

Kirschbaum
JetShip - Laravel Starter Kit logo

JetShip - Laravel Starter Kit

A Laravel SaaS Boilerplate and a starter kit built on the TALL stack. It includes authentication, payments, admin panels, and more. Launch scalable apps fast with clean code, seamless deployment, and custom branding.

JetShip - Laravel Starter Kit