import { SpecifyShadowValue, RawValueSignature, TokenState, } from '@specifyapp/specify-design-token-format'; import { colorValueToCss, rawColorToCss } from './color.js'; import { dimensionValueToCss, rawDimensionToCss } from './dimension.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<'shadow'>` to a css value. * E.g: `12px 12px 2px 1px rgba(0, 0, 255, .2)` */ export function shadowToCss( aliasStrategy: CssResolvableAliasStrategy, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return (tokenState: TokenState<'shadow'>) => tokenState .getStatefulValueResult() .mapResolvableTopLevelAlias(aliasStrategy) .mapUnresolvableTopLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .mapTopLevelValue(value => value .mapRawValue(rawValue => rawShadowToCss(rawValue, aliasStrategy, unresolvableAliasStrategy), ) .mapResolvableModeLevelAlias(aliasStrategy) .mapUnresolvableModeLevelAlias(alias => unresolvableAliasStrategy(tokenState, alias)) .unwrap(), ) .unwrap(); } /** * Converts a `RawValueSignature<'shadow'>` to css. */ export function rawShadowToCss( shadow: RawValueSignature<'shadow'>, aliasStrategy: CssResolvableAliasStrategy, unresolvableAliasStrategy: CssUnresolvableAliasStrategy = DEFAULT_UNRESOLVABLE_STRATEGY, ) { return `${shadow.type.unwrapValue() === 'inner' ? 'inset ' : ''}${unwrapInnerValue( shadow.offsetX.mapPrimitiveValue(d => rawDimensionToCss(d)), aliasStrategy, unresolvableAliasStrategy, )} ${unwrapInnerValue( shadow.offsetY.mapPrimitiveValue(d => rawDimensionToCss(d)), aliasStrategy, unresolvableAliasStrategy, )} ${unwrapInnerValue( shadow.blurRadius.mapPrimitiveValue(d => rawDimensionToCss(d)), aliasStrategy, unresolvableAliasStrategy, )} ${unwrapInnerValue( shadow.spreadRadius.mapPrimitiveValue(d => rawDimensionToCss(d)), aliasStrategy, unresolvableAliasStrategy, )} ${unwrapInnerValue( shadow.color.mapPrimitiveValue(c => rawColorToCss(c, aliasStrategy)), aliasStrategy, unresolvableAliasStrategy, )}`; } /** * Converts a shadow to css. */ export function shadowValueToCss(shadow: SpecifyShadowValue) { return `${shadow.type === 'inner' ? 'inset ' : ''}${dimensionValueToCss( shadow.offsetX, )} ${dimensionValueToCss(shadow.offsetY)} ${dimensionValueToCss( shadow.blurRadius, )} ${dimensionValueToCss(shadow.spreadRadius)} ${colorValueToCss(shadow.color) ?? ''}`; }