import { SpecifyDimensionValue, RawValueSignature, 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<'dimension'>` to a css value. * E.g: `24px` */ export function dimensionToCss( aliasStrategy: CssResolvableAliasStrategy, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return (tokenState: TokenState<'dimension'>) => tokenState .getStatefulValueResult() .mapResolvableTopLevelAlias(aliasStrategy) .mapUnresolvableTopLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .mapTopLevelValue(value => value .mapRawValue(rawValue => rawDimensionToCss(rawValue, unresolvableAliasStrategy)) .mapResolvableModeLevelAlias(aliasStrategy) .mapUnresolvableModeLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .unwrap(), ) .unwrap(); } /** * Converts a `RawValueSignature<'dimension'>` to css. */ export function rawDimensionToCss( dimension: RawValueSignature<'dimension'>, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return `${dimension.value .resolveDeepValue() .mapUnresolvableValueLevelAlias(alias => // @ts-ignore Expression produces a union type that is too complex to represent.q unresolvableAliasStrategy(dimension.value.tokenState, alias), ) .unwrap()}${dimension.unit .resolveDeepValue() .mapUnresolvableValueLevelAlias(alias => unresolvableAliasStrategy(dimension.value.tokenState, alias), ) .unwrap()}`; } /** * Converts a dimension to css. */ export function dimensionValueToCss(dimension: SpecifyDimensionValue) { return `${dimension.value}${dimension.unit ?? ''}`; }