import { RawValueSignature, SpecifyGradientsValue, TokenState, } from '@specifyapp/specify-design-token-format'; import { gradientValueToCss, rawGradientToCss } from './gradient.js'; import { unwrapInnerValue } from '../../_utils/unwrapInnerValue.js'; import { DEFAULT_UNRESOLVABLE_STRATEGY } from '../aliasStrategies/throwOnUnresolvable.js'; import { CssResolvableAliasStrategy, CssUnresolvableAliasStrategy, } from '../aliasStrategies/CssAliasStrategy.js'; /** * Converts a `TokenState<'gradients'>` to a css value. * E.g: `linear-gradient(45deg, blue, red), radial-gradient(circle at center, red 0, blue, green 100%)` */ export function gradientsToCss( aliasStrategy: CssResolvableAliasStrategy, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return (tokenState: TokenState<'gradients'>) => tokenState .getStatefulValueResult() .mapResolvableTopLevelAlias(aliasStrategy) .mapUnresolvableTopLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .mapTopLevelValue(value => value .mapRawValue(rawValue => rawGradientsToCss(rawValue, aliasStrategy, unresolvableAliasStrategy), ) .mapResolvableModeLevelAlias(aliasStrategy) .mapUnresolvableModeLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .unwrap(), ) .unwrap(); } /** * Converts a `RawValueSignature<'gradients'>` to css. */ export function rawGradientsToCss( gradients: RawValueSignature<'gradients'>, aliasStrategy: CssResolvableAliasStrategy, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return gradients .map(gradient => unwrapInnerValue( gradient.mapPrimitiveValue(g => rawGradientToCss(g, aliasStrategy)), aliasStrategy, unresolvableAliasStrategy, ), ) .join(', '); } /** * Converts a gradients to css. */ export function gradientsValueToCss(gradients: SpecifyGradientsValue) { return gradients.map(gradientValueToCss).join(', '); }