Skip to content

Commit 5260277

Browse files
fix(nuxt): fontsource loading and custom font preloading
1 parent 1253f4d commit 5260277

File tree

10 files changed

+55
-14
lines changed

10 files changed

+55
-14
lines changed

examples/astro/astro.config.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export default defineConfig({
3333
{
3434
name: 'Truculenta',
3535
weights: [400, 700],
36-
subset: 'latin-ext',
3736
},
3837
],
3938
},

examples/nuxt/app.vue

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import src from 'unfonts.css?raw'
66
<template>
77
<h1>Hello Nuxt!</h1>
88
<h2>I'm using a local font !</h2>
9+
<div class="fontsource-abeezee">I'm a ABeeZee fontsource</div>
10+
<div class="fontsource-truculenta">I'm a Truculenta fontsource</div>
911
<pre>links: {{ links }}</pre>
10-
<pre>src: {{ src }}</pre>
12+
<ClientOnly>
13+
<pre>src: {{ src }}</pre>
14+
</ClientOnly>
1115
<a href="https://vitejs.dev/guide/features.html" target="_blank">Documentation</a>
1216
</template>
1317

@@ -34,4 +38,12 @@ h2 {
3438
font-size: 3rem;
3539
font-weight: 600;
3640
}
41+
42+
.fontsource-abeezee {
43+
font-family: "ABeeZee", sans-serif;
44+
}
45+
46+
.fontsource-truculenta {
47+
font-family: "Truculenta", sans-serif;
48+
}
3749
</style>

examples/nuxt/nuxt.config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,19 @@ export default defineNuxtConfig({
1515
'Dancing Script': './assets/fonts/DancingScript*',
1616
},
1717
},
18+
19+
fontsource: {
20+
families: [
21+
{
22+
name: 'ABeeZee',
23+
weights: [400],
24+
styles: ['italic'],
25+
},
26+
{
27+
name: 'Truculenta',
28+
weights: [400, 700],
29+
},
30+
],
31+
},
1832
},
1933
})

examples/sveltekit/vite.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export default defineConfig({
3535
{
3636
name: 'Truculenta',
3737
weights: [400, 700],
38-
subset: 'latin-ext',
3938
},
4039
],
4140
},

examples/vite/vite.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export default defineConfig({
3333
{
3434
name: 'Truculenta',
3535
weights: [400, 700],
36-
subset: 'latin-ext',
3736
},
3837
],
3938
},

examples/vitepress/.vitepress/config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export default defineConfig({
3535
{
3636
name: 'Truculenta',
3737
weights: [400, 700],
38-
subset: 'latin-ext',
3938
},
4039
],
4140
},

src/loaders/custom.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ function resolveUserOption(options: CustomFonts): ResolvedCustomFonts {
99
let {
1010
families = [],
1111
preload = true,
12+
prefetchPrefix = '',
1213
prefetch = false,
1314
injectTo = 'head-prepend',
1415
display = 'auto',
@@ -27,6 +28,7 @@ function resolveUserOption(options: CustomFonts): ResolvedCustomFonts {
2728
return {
2829
families,
2930
preload,
31+
prefetchPrefix,
3032
prefetch,
3133
injectTo,
3234
display,
@@ -229,7 +231,7 @@ function createFontLinks(options: ResolvedCustomFonts, face: CustomFontFace) {
229231
rel: options.prefetch ? 'prefetch' : 'preload',
230232
as: 'font',
231233
type: `font/${file.ext.replace('.', '')}`,
232-
href: file.path,
234+
href: join(options.prefetchPrefix, file.path),
233235
crossorigin: true,
234236
},
235237
})

src/loaders/fontsource.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { FontsourceFonts } from '../types'
22

3-
export function fontsourceVirtualModule(options?: FontsourceFonts) {
3+
export function fontsourceImports(options?: FontsourceFonts) {
44
const source: string[] = []
55

66
const {
@@ -13,7 +13,7 @@ export function fontsourceVirtualModule(options?: FontsourceFonts) {
1313

1414
if (typeof family === 'string') {
1515
const name = family.toLowerCase().replace(/ /g, '-')
16-
source.push(`@import "@fontsource/${name}";`)
16+
source.push(`@fontsource/${name}/index.css`)
1717
continue
1818
}
1919

@@ -22,24 +22,30 @@ export function fontsourceVirtualModule(options?: FontsourceFonts) {
2222

2323
if ('variables' in family) {
2424
for (const variable of family.variables)
25-
source.push(`@import "@fontsource/${name}/${subsetPrefix}${variable}.css";`)
25+
source.push(`@fontsource/${name}/${subsetPrefix}${variable}.css`)
2626
}
2727
else if ('weights' in family) {
2828
for (const weight of family.weights) {
2929
if (family.styles) {
3030
for (const style of family.styles) {
3131
if (style === 'normal')
32-
source.push(`@import "@fontsource/${name}/${subsetPrefix}${weight}.css";`)
32+
source.push(`@fontsource/${name}/${subsetPrefix}${weight}.css`)
3333
else
34-
source.push(`@import "@fontsource/${name}/${subsetPrefix}${weight}-${style}.css";`)
34+
source.push(`@fontsource/${name}/${subsetPrefix}${weight}-${style}.css`)
3535
}
3636
}
3737
else {
38-
source.push(`@import "@fontsource/${name}/${subsetPrefix}${weight}.css";`)
38+
source.push(`@fontsource/${name}/${subsetPrefix}${weight}.css`)
3939
}
4040
}
4141
}
4242
}
4343

44-
return source.join('\n')
44+
return source
45+
}
46+
47+
export function fontsourceVirtualModule(options?: FontsourceFonts) {
48+
return fontsourceImports(options)
49+
.map((src) => `@import "${src}";`)
50+
.join('\n')
4551
}

src/nuxt.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { addVitePlugin, addWebpackPlugin, defineNuxtModule } from '@nuxt/kit'
44
import type {} from '@nuxt/schema'
55
import type { Options } from './types'
66
import { getHeadLinkTags } from './loaders'
7+
import { fontsourceImports } from './loaders/fontsource'
78
import unplugin from '.'
89

910
export default defineNuxtModule({
@@ -15,6 +16,16 @@ export default defineNuxtModule({
1516
if ('fontsource' in options || 'custom' in options) {
1617
nuxt.options.css ||= []
1718
nuxt.options.css.push('unfonts.css')
19+
if ('fontsource' in options) {
20+
for (const src of fontsourceImports(options.fontsource)) {
21+
nuxt.options.css.push(src)
22+
}
23+
delete options.fontsource
24+
}
25+
}
26+
27+
if (options.custom) {
28+
options.custom.prefetchPrefix = nuxt.options.runtimeConfig.app.buildAssetsDir
1829
}
1930

2031
const links = getHeadLinkTags(options, nuxt.options.rootDir)

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export interface CustomFontFamily {
5555
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face#description
5656
*/
5757
local?: string | string[]
58-
5958
/**
6059
* Allows to transform the generated config for any font face.
6160
*
@@ -97,6 +96,7 @@ export interface CustomFonts {
9796
* @default false
9897
*/
9998
prefetch?: boolean
99+
prefetchPrefix?: string
100100
/**
101101
* @default: 'head-prepend'
102102
*/

0 commit comments

Comments
 (0)