import { RawValueSignature, SpecifyFontWeightValue, TokenState, } from '@specifyapp/specify-design-token-format'; import { DEFAULT_UNRESOLVABLE_STRATEGY } from '../aliasStrategies/throwOnUnresolvable.js'; import { CssResolvableAliasStrategy, CssUnresolvableAliasStrategy, } from '../aliasStrategies/CssAliasStrategy.js'; /** * Converts a `TokenState<'fontWeight'>` to a css value. * E.g: `'bold'` */ export function fontWeightToCss( aliasStrategy: CssResolvableAliasStrategy, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return (tokenState: TokenState<'fontWeight'>) => tokenState .getStatefulValueResult() .mapResolvableTopLevelAlias(aliasStrategy) .mapUnresolvableTopLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .mapTopLevelValue(value => value .mapRawValue(rawValue => rawFontWeightToCss(rawValue)) .mapResolvableModeLevelAlias(aliasStrategy) .mapUnresolvableModeLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .unwrap(), ) .unwrap(); } /** * Converts a `RawValueSignature<'fontWeight'>` to css. */ export function rawFontWeightToCss(fontWeight: RawValueSignature<'fontWeight'>) { return fontWeightValueToCss(fontWeight); } const fontWeightStringToNumberMapping = new Map([ ['thin', 100], ['hairline', 100], ['extralight', 200], ['ultra light', 200], ['ultra-light', 200], ['light', 300], ['book', 300], ['regular', 400], ['normal', 400], ['text', 400], ['thick', 400], ['medium', 500], ['dark', 500], ['extrathick', 500], ['extra-thick', 500], ['semibold', 600], ['semi-bold', 600], ['demibold', 600], ['demi-bold', 600], ['extradark', 600], ['extra-dark', 600], ['bold', 700], ['extrabold', 800], ['extra-bold', 800], ['ultrabold', 800], ['ultra-bold', 800], ['black', 900], ['heavy', 900], ['extrablack', 900], ['extra-black', 900], ['ultrablack', 900], ['ultra-black', 900], ]); /** * Converts a fontWeight to css. */ export function fontWeightValueToCss(fontWeight: SpecifyFontWeightValue) { if (typeof fontWeight !== 'string') { return fontWeight > 1000 ? 1000 : fontWeight; } const isStringConvertibleToNumber = !Number.isNaN(parseInt(fontWeight, 10)); return isStringConvertibleToNumber ? parseInt(fontWeight, 10) : fontWeightStringToNumberMapping.get(fontWeight) ?? 400; }