diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx
index e9d9a5e7e..abc18bc3a 100644
--- a/quartz/components/Head.tsx
+++ b/quartz/components/Head.tsx
@@ -1,7 +1,7 @@
import { i18n } from "../i18n"
import { FullSlug, getFileExtension, joinSegments, pathToRoot } from "../util/path"
import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources"
-import { googleFontHref } from "../util/theme"
+import { googleFontHref, googleFontSubsetHref } from "../util/theme"
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
import { unescapeHTML } from "../util/escape"
import { CustomOgImagesEmitterName } from "../plugins/emitters/ogImage"
@@ -44,9 +44,8 @@ export default (() => {
<>
- {(googleFontHref(cfg.theme, cfg.pageTitle) as string[]).map((href: string) => (
-
- ))}
+
+
>
)}
diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts
index a2fb2bf30..dc0084de0 100644
--- a/quartz/plugins/emitters/componentResources.ts
+++ b/quartz/plugins/emitters/componentResources.ts
@@ -9,7 +9,7 @@ import styles from "../../styles/custom.scss"
import popoverStyle from "../../components/styles/popover.scss"
import { BuildCtx } from "../../util/ctx"
import { QuartzComponent } from "../../components/types"
-import { googleFontHref, joinStyles, processGoogleFonts } from "../../util/theme"
+import { googleFontHref, googleFontSubsetHref, joinStyles, processGoogleFonts } from "../../util/theme"
import { Features, transform } from "lightningcss"
import { transform as transpile } from "esbuild"
import { write } from "./helpers"
@@ -210,12 +210,17 @@ export const ComponentResources: QuartzEmitterPlugin = () => {
if (cfg.theme.fontOrigin === "local") {
// let the user do it themselves in css
} else if (cfg.theme.fontOrigin === "googleFonts" && !cfg.theme.cdnCaching) {
- // When cdnCaching is true, we link to google fonts in Head.tsx
- const fontUrls = googleFontHref(ctx.cfg.configuration.theme, ctx.cfg.configuration.pageTitle)
- const fontResponses = await Promise.all(fontUrls.map(url => fetch(url)))
- const fontStyleSheets = await Promise.all(fontResponses.map(res => res.text()))
+ // when cdnCaching is true, we link to google fonts in Head.tsx
+ const theme = ctx.cfg.configuration.theme
+ const title = ctx.cfg.configuration.pageTitle
- googleFontsStyleSheet = fontStyleSheets.join('\n')
+ const fontResponse = await fetch(googleFontHref(theme))
+ googleFontsStyleSheet = await fontResponse.text()
+
+ const fontSubsetResponse = await fetch(googleFontSubsetHref(theme, title))
+ const googleFontSubsetStyleSheet = await fontSubsetResponse.text()
+
+ googleFontsStyleSheet = `${googleFontsStyleSheet}\n${googleFontSubsetStyleSheet}`
if (!cfg.baseUrl) {
throw new Error(
diff --git a/quartz/util/theme.ts b/quartz/util/theme.ts
index 534625161..9f319f0dd 100644
--- a/quartz/util/theme.ts
+++ b/quartz/util/theme.ts
@@ -82,24 +82,20 @@ function formatFontSpecification(type: "title" | "header" | "body" | "code", spe
return spec.name
}
-export function googleFontHref(theme: Theme, text: string): string[] {
+export function googleFontHref(theme: Theme) {
const { header, body, code } = theme.typography
- const title = theme.typography.title || header
-
- const titleFont = formatFontSpecification("title", title)
const headerFont = formatFontSpecification("header", header)
const bodyFont = formatFontSpecification("body", body)
const codeFont = formatFontSpecification("code", code)
- let hrefs = [
- `https://fonts.googleapis.com/css2?family=${headerFont}&family=${bodyFont}&family=${codeFont}&display=swap`,
- ]
+ return `https://fonts.googleapis.com/css2?family=${headerFont}&family=${bodyFont}&family=${codeFont}&display=swap`
+}
- if (titleFont !== headerFont && titleFont !== bodyFont && titleFont !== codeFont) {
- hrefs.push(`https://fonts.googleapis.com/css2?family=${titleFont}&text=${encodeURIComponent(text)}&display=swap`)
- }
+export function googleFontSubsetHref(theme: Theme, text: string) {
+ const title = theme.typography.title || theme.typography.header
+ const titleFont = formatFontSpecification("title", title)
- return hrefs
+ return `https://fonts.googleapis.com/css2?family=${titleFont}&text=${encodeURIComponent(text)}&display=swap`
}
export interface GoogleFontFile {