@wordpress/block-editor
Version:
160 lines (149 loc) • 4.85 kB
JavaScript
/**
* WordPress dependencies
*/
import { _x, sprintf } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import { formatFontStyle } from './format-font-style';
import { formatFontWeight } from './format-font-weight';
const FONT_STYLES = [{
name: _x('Regular', 'font style'),
value: 'normal'
}, {
name: _x('Italic', 'font style'),
value: 'italic'
}];
const FONT_WEIGHTS = [{
name: _x('Thin', 'font weight'),
value: '100'
}, {
name: _x('Extra Light', 'font weight'),
value: '200'
}, {
name: _x('Light', 'font weight'),
value: '300'
}, {
name: _x('Regular', 'font weight'),
value: '400'
}, {
name: _x('Medium', 'font weight'),
value: '500'
}, {
name: _x('Semi Bold', 'font weight'),
value: '600'
}, {
name: _x('Bold', 'font weight'),
value: '700'
}, {
name: _x('Extra Bold', 'font weight'),
value: '800'
}, {
name: _x('Black', 'font weight'),
value: '900'
}, {
name: _x('Extra Black', 'font weight'),
value: '1000'
}];
/**
* Builds a list of font style and weight options based on font family faces.
* Defaults to the standard font styles and weights if no font family faces are provided.
*
* @param {Array} fontFamilyFaces font family faces array
* @return {Object} new object with combined and separated font style and weight properties
*/
export function getFontStylesAndWeights(fontFamilyFaces) {
let fontStyles = [];
let fontWeights = [];
const combinedStyleAndWeightOptions = [];
const isSystemFont = !fontFamilyFaces || fontFamilyFaces?.length === 0;
let isVariableFont = false;
fontFamilyFaces?.forEach(face => {
// Check for variable font by looking for a space in the font weight value. e.g. "100 900"
if ('string' === typeof face.fontWeight && /\s/.test(face.fontWeight.trim())) {
isVariableFont = true;
// Find font weight start and end values.
let [startValue, endValue] = face.fontWeight.split(' ');
startValue = parseInt(startValue.slice(0, 1));
if (endValue === '1000') {
endValue = 10;
} else {
endValue = parseInt(endValue.slice(0, 1));
}
// Create font weight options for available variable weights.
for (let i = startValue; i <= endValue; i++) {
const fontWeightValue = `${i.toString()}00`;
if (!fontWeights.some(weight => weight.value === fontWeightValue)) {
fontWeights.push(formatFontWeight(fontWeightValue));
}
}
}
// Format font style and weight values.
const fontWeight = formatFontWeight('number' === typeof face.fontWeight ? face.fontWeight.toString() : face.fontWeight);
const fontStyle = formatFontStyle(face.fontStyle);
// Create font style and font weight lists without duplicates.
if (fontStyle && Object.keys(fontStyle).length) {
if (!fontStyles.some(style => style.value === fontStyle.value)) {
fontStyles.push(fontStyle);
}
}
if (fontWeight && Object.keys(fontWeight).length) {
if (!fontWeights.some(weight => weight.value === fontWeight.value)) {
if (!isVariableFont) {
fontWeights.push(fontWeight);
}
}
}
});
// If there is no font weight of 600 or above, then include faux bold as an option.
if (!fontWeights.some(weight => weight.value >= '600')) {
fontWeights.push({
name: _x('Bold', 'font weight'),
value: '700'
});
}
// If there is no italic font style, then include faux italic as an option.
if (!fontStyles.some(style => style.value === 'italic')) {
fontStyles.push({
name: _x('Italic', 'font style'),
value: 'italic'
});
}
// Use default font styles and weights for system fonts.
if (isSystemFont) {
fontStyles = FONT_STYLES;
fontWeights = FONT_WEIGHTS;
}
// Use default styles and weights if there are no available styles or weights from the provided font faces.
fontStyles = fontStyles.length === 0 ? FONT_STYLES : fontStyles;
fontWeights = fontWeights.length === 0 ? FONT_WEIGHTS : fontWeights;
// Generate combined font style and weight options for available fonts.
fontStyles.forEach(({
name: styleName,
value: styleValue
}) => {
fontWeights.forEach(({
name: weightName,
value: weightValue
}) => {
const optionName = styleValue === 'normal' ? weightName : sprintf(/* translators: 1: Font weight name. 2: Font style name. */
_x('%1$s %2$s', 'font'), weightName, styleName);
combinedStyleAndWeightOptions.push({
key: `${styleValue}-${weightValue}`,
name: optionName,
style: {
fontStyle: styleValue,
fontWeight: weightValue
}
});
});
});
return {
fontStyles,
fontWeights,
combinedStyleAndWeightOptions,
isSystemFont,
isVariableFont
};
}
//# sourceMappingURL=get-font-styles-and-weights.js.map