@webstudio-is/fonts 0.290.0 → 0.291.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +58 -50
- package/lib/types/get-font-faces.d.ts +3 -2
- package/lib/types/schema.d.ts +19 -64
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -251,58 +251,75 @@ var getFontFormat = (asset) => {
|
|
|
251
251
|
const extension = asset.name.slice(asset.name.lastIndexOf(".") + 1);
|
|
252
252
|
return FONT_FORMATS.has(extension) ? FONT_FORMATS.get(extension) ?? asset.format : FONT_FORMATS.get(asset.format) ?? asset.format;
|
|
253
253
|
};
|
|
254
|
-
var formatFace = (asset, format, url) => {
|
|
254
|
+
var formatFace = ({ asset, format, style, url }) => {
|
|
255
|
+
const face = {
|
|
256
|
+
fontFamily: asset.meta.family,
|
|
257
|
+
fontStyle: style,
|
|
258
|
+
fontDisplay: "swap",
|
|
259
|
+
src: `url(${sanitizeCssUrl(url)}) format("${format}")`
|
|
260
|
+
};
|
|
255
261
|
if ("variationAxes" in asset.meta) {
|
|
256
|
-
const { wght, wdth } = asset.meta
|
|
262
|
+
const { wght, wdth } = asset.meta.variationAxes;
|
|
257
263
|
return {
|
|
258
|
-
|
|
259
|
-
fontStyle: "normal",
|
|
260
|
-
fontDisplay: "swap",
|
|
261
|
-
src: `url(${sanitizeCssUrl(url)}) format("${format}")`,
|
|
264
|
+
...face,
|
|
262
265
|
fontStretch: wdth ? `${wdth.min}% ${wdth.max}%` : void 0,
|
|
263
266
|
fontWeight: wght ? `${wght.min} ${wght.max}` : void 0
|
|
264
267
|
};
|
|
265
268
|
}
|
|
266
269
|
return {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
fontWeight: asset.meta.weight,
|
|
270
|
-
fontDisplay: "swap",
|
|
271
|
-
src: `url(${sanitizeCssUrl(url)}) format("${format}")`
|
|
270
|
+
...face,
|
|
271
|
+
fontWeight: asset.meta.weight
|
|
272
272
|
};
|
|
273
273
|
};
|
|
274
|
-
var getKey = (asset) => {
|
|
274
|
+
var getKey = (asset, style) => {
|
|
275
275
|
if ("variationAxes" in asset.meta) {
|
|
276
|
-
|
|
276
|
+
const { wght, wdth } = asset.meta.variationAxes;
|
|
277
|
+
return JSON.stringify([asset.meta.family, style, wght, wdth]);
|
|
277
278
|
}
|
|
278
|
-
return asset.meta.family
|
|
279
|
+
return JSON.stringify([asset.meta.family, style, asset.meta.weight]);
|
|
280
|
+
};
|
|
281
|
+
var getStyles = (meta) => {
|
|
282
|
+
const styles = /* @__PURE__ */ new Set([meta.style]);
|
|
283
|
+
if ("variationAxes" in meta) {
|
|
284
|
+
const { ital, slnt } = meta.variationAxes;
|
|
285
|
+
if (ital !== void 0 && ital.min <= 0 && ital.max >= 1) {
|
|
286
|
+
styles.add("normal");
|
|
287
|
+
styles.add("italic");
|
|
288
|
+
}
|
|
289
|
+
if (slnt !== void 0 && slnt.min < slnt.max && slnt.min <= 0 && slnt.max >= 0) {
|
|
290
|
+
styles.add("normal");
|
|
291
|
+
styles.add("oblique");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return Array.from(styles);
|
|
279
295
|
};
|
|
280
296
|
var getFontFaces = (assets, options) => {
|
|
281
297
|
const { assetBaseUrl } = options;
|
|
282
298
|
const faces = /* @__PURE__ */ new Map();
|
|
283
|
-
const
|
|
299
|
+
const seenSources = /* @__PURE__ */ new Set();
|
|
284
300
|
for (const asset of assets) {
|
|
285
301
|
const url = `${assetBaseUrl}${asset.name}`;
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
302
|
+
for (const style of getStyles(asset.meta)) {
|
|
303
|
+
const sourceKey = JSON.stringify([url, style]);
|
|
304
|
+
if (seenSources.has(sourceKey)) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
seenSources.add(sourceKey);
|
|
308
|
+
const assetKey = getKey(asset, style);
|
|
309
|
+
const format = getFontFormat(asset);
|
|
310
|
+
const sources = faces.get(assetKey) ?? /* @__PURE__ */ new Map();
|
|
311
|
+
const existing = sources.get(format);
|
|
312
|
+
if (existing === void 0 || url < existing.url) {
|
|
313
|
+
sources.set(format, { asset, format, style, url });
|
|
314
|
+
}
|
|
315
|
+
faces.set(assetKey, sources);
|
|
289
316
|
}
|
|
290
|
-
seenUrls.add(url);
|
|
291
|
-
const format = getFontFormat(asset);
|
|
292
|
-
const sources = faces.get(assetKey) ?? /* @__PURE__ */ new Map();
|
|
293
|
-
const existing = sources.get(format);
|
|
294
|
-
if (existing === void 0 || url < existing.url) {
|
|
295
|
-
sources.set(format, { asset, format, url });
|
|
296
|
-
}
|
|
297
|
-
faces.set(assetKey, sources);
|
|
298
317
|
}
|
|
299
318
|
return Array.from(faces.values(), (sources) => {
|
|
300
|
-
const [
|
|
301
|
-
sources.values()
|
|
302
|
-
).sort(
|
|
319
|
+
const [source, ...fallbacks] = Array.from(sources.values()).sort(
|
|
303
320
|
(left, right) => fontFormatOrder.indexOf(left.format) - fontFormatOrder.indexOf(right.format)
|
|
304
321
|
);
|
|
305
|
-
const face = formatFace(
|
|
322
|
+
const face = formatFace(source);
|
|
306
323
|
face.src += fallbacks.map(
|
|
307
324
|
({ format: fallbackFormat, url: fallbackUrl }) => `, url(${sanitizeCssUrl(fallbackUrl)}) format("${fallbackFormat}")`
|
|
308
325
|
).join("");
|
|
@@ -312,27 +329,13 @@ var getFontFaces = (assets, options) => {
|
|
|
312
329
|
|
|
313
330
|
// src/schema.ts
|
|
314
331
|
import { z } from "zod";
|
|
332
|
+
var fontStyle = z.enum(FONT_STYLES);
|
|
315
333
|
var fontFormat = z.union([
|
|
316
334
|
z.literal("ttf"),
|
|
317
335
|
z.literal("woff"),
|
|
318
336
|
z.literal("woff2")
|
|
319
337
|
]);
|
|
320
|
-
var axisName = z.
|
|
321
|
-
"wght",
|
|
322
|
-
"wdth",
|
|
323
|
-
"slnt",
|
|
324
|
-
"opsz",
|
|
325
|
-
"ital",
|
|
326
|
-
"GRAD",
|
|
327
|
-
"XTRA",
|
|
328
|
-
"XOPQ",
|
|
329
|
-
"YOPQ",
|
|
330
|
-
"YTLC",
|
|
331
|
-
"YTUC",
|
|
332
|
-
"YTAS",
|
|
333
|
-
"YTDE",
|
|
334
|
-
"YTFI"
|
|
335
|
-
]);
|
|
338
|
+
var axisName = z.string().regex(/^[A-Za-z][A-Za-z0-9]* *$/).length(4);
|
|
336
339
|
var variationAxes = z.partialRecord(
|
|
337
340
|
axisName,
|
|
338
341
|
z.object({
|
|
@@ -344,33 +347,38 @@ var variationAxes = z.partialRecord(
|
|
|
344
347
|
);
|
|
345
348
|
var fontMetaStatic = z.object({
|
|
346
349
|
family: z.string(),
|
|
347
|
-
style:
|
|
350
|
+
style: fontStyle,
|
|
348
351
|
weight: z.number()
|
|
349
352
|
});
|
|
350
353
|
var fontMetaVariable = z.object({
|
|
351
354
|
family: z.string(),
|
|
355
|
+
style: fontStyle.default("normal"),
|
|
352
356
|
variationAxes
|
|
353
357
|
});
|
|
354
358
|
var fontMeta = z.union([fontMetaStatic, fontMetaVariable]);
|
|
355
359
|
var fontMetaUpdate = z.union([
|
|
356
360
|
fontMetaStatic.partial().strict(),
|
|
357
|
-
|
|
361
|
+
z.object({
|
|
362
|
+
family: fontMetaVariable.shape.family.optional(),
|
|
363
|
+
style: fontStyle.optional(),
|
|
364
|
+
variationAxes: fontMetaVariable.shape.variationAxes.optional()
|
|
365
|
+
}).strict()
|
|
358
366
|
]);
|
|
359
367
|
var mergeFontMeta = (current, override) => {
|
|
360
368
|
const result = fontMetaUpdate.safeParse(override);
|
|
361
369
|
if (result.success === false) {
|
|
362
370
|
return;
|
|
363
371
|
}
|
|
364
|
-
const { family } = result.data;
|
|
372
|
+
const { family, style } = result.data;
|
|
365
373
|
if ("variationAxes" in current) {
|
|
366
374
|
const variationAxes2 = "variationAxes" in result.data ? result.data.variationAxes : void 0;
|
|
367
375
|
return {
|
|
368
376
|
...current,
|
|
369
377
|
...family === void 0 ? {} : { family },
|
|
378
|
+
...style === void 0 ? {} : { style },
|
|
370
379
|
...variationAxes2 === void 0 ? {} : { variationAxes: variationAxes2 }
|
|
371
380
|
};
|
|
372
381
|
}
|
|
373
|
-
const style = "style" in result.data ? result.data.style : void 0;
|
|
374
382
|
const weight = "weight" in result.data ? result.data.weight : void 0;
|
|
375
383
|
return {
|
|
376
384
|
...current,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type FontStyle } from "./constants";
|
|
2
|
+
import type { FontMeta, FontFormat } from "./schema";
|
|
2
3
|
export type PartialFontAsset = {
|
|
3
4
|
format: FontFormat;
|
|
4
5
|
meta: FontMeta;
|
|
@@ -8,7 +9,7 @@ export type FontFace = {
|
|
|
8
9
|
fontFamily: string;
|
|
9
10
|
fontDisplay: "swap" | "auto" | "block" | "fallback" | "optional";
|
|
10
11
|
src: string;
|
|
11
|
-
fontStyle?:
|
|
12
|
+
fontStyle?: FontStyle;
|
|
12
13
|
fontWeight?: number | string;
|
|
13
14
|
fontStretch?: string;
|
|
14
15
|
};
|
package/lib/types/schema.d.ts
CHANGED
|
@@ -1,22 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const fontFormat: z.ZodUnion<readonly [z.ZodLiteral<"ttf">, z.ZodLiteral<"woff">, z.ZodLiteral<"woff2">]>;
|
|
3
3
|
export type FontFormat = z.infer<typeof fontFormat>;
|
|
4
|
-
declare const variationAxes: z.ZodRecord<z.
|
|
5
|
-
GRAD: "GRAD";
|
|
6
|
-
XOPQ: "XOPQ";
|
|
7
|
-
XTRA: "XTRA";
|
|
8
|
-
YOPQ: "YOPQ";
|
|
9
|
-
YTAS: "YTAS";
|
|
10
|
-
YTDE: "YTDE";
|
|
11
|
-
YTFI: "YTFI";
|
|
12
|
-
YTLC: "YTLC";
|
|
13
|
-
YTUC: "YTUC";
|
|
14
|
-
ital: "ital";
|
|
15
|
-
opsz: "opsz";
|
|
16
|
-
slnt: "slnt";
|
|
17
|
-
wdth: "wdth";
|
|
18
|
-
wght: "wght";
|
|
19
|
-
}> & z.core.$partial, z.ZodObject<{
|
|
4
|
+
declare const variationAxes: z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
|
|
20
5
|
name: z.ZodString;
|
|
21
6
|
min: z.ZodNumber;
|
|
22
7
|
default: z.ZodNumber;
|
|
@@ -35,22 +20,12 @@ export declare const fontMetaStatic: z.ZodObject<{
|
|
|
35
20
|
export type FontMetaStatic = z.infer<typeof fontMetaStatic>;
|
|
36
21
|
export declare const fontMetaVariable: z.ZodObject<{
|
|
37
22
|
family: z.ZodString;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
YTDE: "YTDE";
|
|
45
|
-
YTFI: "YTFI";
|
|
46
|
-
YTLC: "YTLC";
|
|
47
|
-
YTUC: "YTUC";
|
|
48
|
-
ital: "ital";
|
|
49
|
-
opsz: "opsz";
|
|
50
|
-
slnt: "slnt";
|
|
51
|
-
wdth: "wdth";
|
|
52
|
-
wght: "wght";
|
|
53
|
-
}> & z.core.$partial, z.ZodObject<{
|
|
23
|
+
style: z.ZodDefault<z.ZodEnum<{
|
|
24
|
+
italic: "italic";
|
|
25
|
+
normal: "normal";
|
|
26
|
+
oblique: "oblique";
|
|
27
|
+
}>>;
|
|
28
|
+
variationAxes: z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
|
|
54
29
|
name: z.ZodString;
|
|
55
30
|
min: z.ZodNumber;
|
|
56
31
|
default: z.ZodNumber;
|
|
@@ -67,22 +42,12 @@ export declare const fontMeta: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
67
42
|
weight: z.ZodNumber;
|
|
68
43
|
}, z.core.$strip>, z.ZodObject<{
|
|
69
44
|
family: z.ZodString;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
YTDE: "YTDE";
|
|
77
|
-
YTFI: "YTFI";
|
|
78
|
-
YTLC: "YTLC";
|
|
79
|
-
YTUC: "YTUC";
|
|
80
|
-
ital: "ital";
|
|
81
|
-
opsz: "opsz";
|
|
82
|
-
slnt: "slnt";
|
|
83
|
-
wdth: "wdth";
|
|
84
|
-
wght: "wght";
|
|
85
|
-
}> & z.core.$partial, z.ZodObject<{
|
|
45
|
+
style: z.ZodDefault<z.ZodEnum<{
|
|
46
|
+
italic: "italic";
|
|
47
|
+
normal: "normal";
|
|
48
|
+
oblique: "oblique";
|
|
49
|
+
}>>;
|
|
50
|
+
variationAxes: z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
|
|
86
51
|
name: z.ZodString;
|
|
87
52
|
min: z.ZodNumber;
|
|
88
53
|
default: z.ZodNumber;
|
|
@@ -99,22 +64,12 @@ export declare const fontMetaUpdate: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
99
64
|
weight: z.ZodOptional<z.ZodNumber>;
|
|
100
65
|
}, z.core.$strict>, z.ZodObject<{
|
|
101
66
|
family: z.ZodOptional<z.ZodString>;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
YTDE: "YTDE";
|
|
109
|
-
YTFI: "YTFI";
|
|
110
|
-
YTLC: "YTLC";
|
|
111
|
-
YTUC: "YTUC";
|
|
112
|
-
ital: "ital";
|
|
113
|
-
opsz: "opsz";
|
|
114
|
-
slnt: "slnt";
|
|
115
|
-
wdth: "wdth";
|
|
116
|
-
wght: "wght";
|
|
117
|
-
}> & z.core.$partial, z.ZodObject<{
|
|
67
|
+
style: z.ZodOptional<z.ZodEnum<{
|
|
68
|
+
italic: "italic";
|
|
69
|
+
normal: "normal";
|
|
70
|
+
oblique: "oblique";
|
|
71
|
+
}>>;
|
|
72
|
+
variationAxes: z.ZodOptional<z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
|
|
118
73
|
name: z.ZodString;
|
|
119
74
|
min: z.ZodNumber;
|
|
120
75
|
default: z.ZodNumber;
|