diff --git a/packages/preset-web-fonts/README.md b/packages/preset-web-fonts/README.md index 5695e406e0..4daf709833 100644 --- a/packages/preset-web-fonts/README.md +++ b/packages/preset-web-fonts/README.md @@ -71,6 +71,7 @@ Currently supported Providers: - `none` - do nothing, treat the font as system font - `google` - [Google Fonts](https://fonts.google.com/) - `bunny` - [Privacy-Friendly Google Fonts](https://fonts.bunny.net/) +- `fontshare` - [Quality Font Service by ITF](https://www.fontshare.com/) PR welcome to add more providers 🙌 diff --git a/packages/preset-web-fonts/src/index.ts b/packages/preset-web-fonts/src/index.ts index 6e601ef7d2..2e8395a6dd 100644 --- a/packages/preset-web-fonts/src/index.ts +++ b/packages/preset-web-fonts/src/index.ts @@ -2,6 +2,7 @@ import type { Preset } from '@unocss/core' import { toArray } from '@unocss/core' import { BunnyFontsProvider } from './providers/bunny' import { GoogleFontsProvider } from './providers/google' +import { FontshareProvider } from './providers/fontshare' import { NoneProvider } from './providers/none' import type { WebFontMeta, WebFontsOptions, WebFontsProviders } from './types' @@ -24,6 +25,7 @@ export function normalizedFontMeta(meta: WebFontMeta | string, defaultProvider: const providers = { google: GoogleFontsProvider, bunny: BunnyFontsProvider, + fontshare: FontshareProvider, none: NoneProvider, } diff --git a/packages/preset-web-fonts/src/providers/fontshare.ts b/packages/preset-web-fonts/src/providers/fontshare.ts new file mode 100644 index 0000000000..ec186defb4 --- /dev/null +++ b/packages/preset-web-fonts/src/providers/fontshare.ts @@ -0,0 +1,22 @@ +import type { Provider, WebFontsProviders } from '../types' + +export const FontshareProvider: Provider = createFontshareProvider('fontshare', 'https://api.fontshare.com') + +export function createFontshareProvider(name: WebFontsProviders, host: string): Provider { + return { + name, + getImportUrl(fonts) { + const strings = fonts.filter(f => f.provider === name).map((f) => { + let name = f.name.replace(/\s+/g, '-').toLocaleLowerCase() + if (f.weights?.length) + name += `@${f.weights.flatMap(w => f.italic ? Number(w) + 1 : w).sort().join()}` + else name += `@${f.italic ? 2 : 1}` + return `f[]=${name}` + }).join('&') + return `${host}/v2/css?${strings}&display=swap` + }, + getFontName(font) { + return `"${font.name}"` + }, + } +} diff --git a/packages/preset-web-fonts/src/types.ts b/packages/preset-web-fonts/src/types.ts index 6d7db858ad..38b390dfb2 100644 --- a/packages/preset-web-fonts/src/types.ts +++ b/packages/preset-web-fonts/src/types.ts @@ -1,4 +1,4 @@ -export type WebFontsProviders = 'google' | 'bunny' | 'none' +export type WebFontsProviders = 'google' | 'bunny' | 'fontshare' | 'none' export interface WebFontMeta { name: string