-
Notifications
You must be signed in to change notification settings - Fork 136
/
generate-font-faces.js
56 lines (51 loc) · 1.47 KB
/
generate-font-faces.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/** Copyright (c) 2019 Uber Technologies, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import toKebabCase from 'just-kebab-case';
import type {AtomicFontsObjectType, StyledFontsObjectType} from './types';
export function generateAtomicFontFaces(fonts: AtomicFontsObjectType) {
const faces = [];
Object.keys(fonts).forEach(fontName => {
const font = fonts[fontName];
if (font) {
faces.push(
`@font-face {
font-family: "${fontName}";
font-display: fallback;
src: ${String(asFontFaceSrc(font.urls))};
}`
);
}
});
return '\n' + faces.join('\n');
}
export function generateStyledFontFaces(fonts: StyledFontsObjectType) {
const faces = [];
Object.keys(fonts).forEach(fontName => {
fonts[fontName].forEach(fontInstance => {
faces.push(
`@font-face {
font-family: "${fontName}";
font-display: fallback;
src: ${asFontFaceSrc(fontInstance.urls).join(',\n')};
${asFontFaceStyles(fontInstance.styles).join('')}}`
);
});
});
return '\n' + faces.join('\n');
}
function asFontFaceSrc(urls) {
// `urls` is a dictionary of font types (woff, woff2 etc) to url string
return Object.keys(urls).map(
type => `url("${String(urls[type])}") format("${type}")`
);
}
function asFontFaceStyles(styles = {}) {
return Object.keys(styles).map(
key => `${toKebabCase(key)}: ${styles[key]};\n`
);
}