@terrazzo/token-tools
Version:
Various utilities for token types
403 lines (401 loc) • 14.2 kB
TypeScript
import { ObjectNode } from "@humanwhocodes/momoa";
//#region src/types.d.ts
interface TokenCore<E extends {} = Record<string, unknown>> {
$description?: string;
$deprecated?: string | boolean;
$extensions?: E;
}
type Token = BooleanToken | BorderToken | ColorToken | CubicBezierToken | DimensionToken | DurationToken | FontFamilyToken | FontWeightToken | GradientToken | LinkToken | NumberToken | ShadowToken | StringToken | TransitionToken | TypographyToken | StrokeStyleToken;
type TokensSet = Record<string, Token>;
type AliasValue = string;
interface AliasToken extends TokenCore {
$type?: never;
$value: AliasValue;
}
/**
* 8.? Boolean (beta)
*/
interface BooleanToken extends TokenCore {
$type: 'boolean';
$value: BooleanValue | AliasValue;
}
type BooleanValue = boolean;
/**
* 9.3 Border
*/
interface BorderToken extends TokenCore {
$type: 'border';
$value: BorderValue | AliasValue;
}
interface BorderValue {
color: ColorValue | AliasValue;
width: DimensionValue | AliasValue;
style: StrokeStyleValue | AliasValue;
}
/**
* 8.1 Color
*/
interface ColorToken extends TokenCore {
$type: 'color';
$value: ColorValue | AliasValue;
}
type ColorValue = string | {
colorSpace: ColorSpace;
channels?: [number, number, number];
components: [number, number, number];
alpha?: number;
hex?: string;
};
interface CubicBezierToken extends TokenCore {
$type: 'cubicBezier';
$value: CubicBezierValue | AliasValue;
}
type CubicBezierValue = [number, number, number, number];
/**
* 8.2 Dimension
*/
interface DimensionToken extends TokenCore {
$type: 'dimension';
$value: DimensionValue | AliasValue;
}
interface DimensionValue {
value: number;
unit: 'px' | 'em' | 'rem';
}
/**
* 8.5 Duration
*/
interface DurationToken extends TokenCore {
$type: 'duration';
$value: DurationValue | AliasValue;
}
interface DurationValue {
value: number;
unit: 'ms' | 's';
}
/**
* 9.6 Gradient
*/
interface GradientToken extends TokenCore {
$type: 'gradient';
$value: GradientValue | AliasValue;
}
type GradientValue = GradientStop[];
interface GradientStop {
color: ColorValue | AliasValue;
position: NumberValue | AliasValue;
}
/**
* 8.3 Font Family
*/
interface FontFamilyToken extends TokenCore {
$type: 'fontFamily';
$value: FontFamilyValue | AliasValue;
}
type FontFamilyValue = string | string[];
/**
* 8.4 Font Weight
*/
interface FontWeightToken extends TokenCore {
$type: 'fontWeight';
$value: FontWeightValue | AliasValue;
}
type FontWeightValue = 'thin' | 'hairline' | 'extra-light' | 'ultra-light' | 'light' | 'normal' | 'regular' | 'book' | 'medium' | 'semi-bold' | 'demi-bold' | 'bold' | 'extra-bold' | 'ultra-bold' | 'black' | 'heavy' | 'extra-black' | 'ultra-black' | number;
/**
* 8.? Link (beta)
*/
interface LinkToken extends TokenCore {
$type: 'link';
$value: LinkValue | AliasValue;
}
type LinkValue = string;
/**
* 8.7 Number
*/
interface NumberToken extends TokenCore {
$type: 'number';
$value: NumberValue | AliasValue;
}
type NumberValue = number;
/**
* 8.? String (beta)
*/
interface StringToken extends TokenCore {
$type: 'string';
$value: StringValue | AliasValue;
}
type StringValue = string;
/**
* 9.2 Stroke Style
*/
interface StrokeStyleToken extends TokenCore {
$type: 'strokeStyle';
$value: StrokeStyleValue | AliasValue;
}
type StrokeStyleValue = 'solid' | 'dashed' | 'dotted' | 'double' | 'groove' | 'ridge' | 'outset' | 'inset' | StrokeStyleValueExpanded;
interface StrokeStyleValueExpanded {
dashArray: (DimensionValue | AliasValue)[];
lineCap: 'round' | 'butt' | 'square';
}
/**
* 9.5 Shadow
*/
interface ShadowToken extends TokenCore {
$type: 'shadow';
$value: ShadowValue | ShadowValue[] | AliasValue;
}
interface ShadowValue {
color: ColorValue | AliasValue;
offsetX: DimensionValue | AliasValue;
offsetY: DimensionValue | AliasValue;
blur?: DimensionValue | AliasValue;
spread?: DimensionValue | AliasValue;
inset?: boolean;
}
/**
* 9.4 Transition
*/
interface TransitionToken extends TokenCore {
$type: 'transition';
$value: TransitionValue | AliasValue;
}
interface TransitionValue {
duration: DurationValue | AliasValue;
delay: DurationValue | AliasValue;
timingFunction: CubicBezierValue | AliasValue;
}
/**
* 9.7 Typography
*/
interface TypographyToken extends TokenCore {
$type: 'typography';
$value: TypographyValue | AliasValue;
}
interface TypographyValue {
fontFamily?: FontFamilyValue | AliasValue;
fontSize?: DimensionValue | AliasValue;
fontStyle?: string;
fontVariant?: string;
fontVariantAlternatives?: string;
fontVariantCaps?: string;
fontVariantEastAsian?: string;
fontVariantEmoji?: string;
fontVariantLigatures?: string;
fontVariantNumeric?: string;
fontVariantPosition?: string;
fontVariationSettings?: string;
fontWeight?: FontWeightValue | AliasValue;
letterSpacing?: DimensionValue | AliasValue;
lineHeight?: DimensionValue | NumberValue | AliasValue;
textDecoration?: string;
textTransform?: string;
[key: string]: unknown;
}
interface GroupCore {
$description?: string;
$type?: Token['$type'];
$extensions?: Record<string, unknown>;
}
type Group = GroupCore | {
[key: string]: GroupOrToken | GroupCore;
};
type GroupOrToken = Group | Token;
/** Modes only have a subset of information from the root token, that is allowed to diverge (e.g. id will never differ, so don’t bother storing it on mode). */
type TokenMode<T extends TokenNormalized> = Pick<T, '$value' | 'aliasOf' | 'aliasChain' | 'partialAliasOf' | 'source'> & {
originalValue: T['originalValue']['$value'];
};
type ModeMap<T extends TokenNormalized> = {
'.': TokenMode<T>;
[mode: string]: TokenMode<T> | undefined;
};
interface TokenNormalizedCore<$type extends Token['$type']> {
$type: $type;
$description?: string;
$extensions?: Record<string, unknown>;
$deprecated?: string | boolean;
id: string;
source: {
loc?: string;
node: ObjectNode;
};
/** The **final** aliased ID */
aliasOf?: string;
/** The entire alias chain, starting from the source token. The last item will match `.aliasOf`. */
aliasChain?: string[];
/** If this token is aliased in other tokens. */
aliasedBy?: string[];
group: {
$description?: string;
$extensions?: Record<string, unknown>;
$type?: $type;
id: string;
/** IDs of all tokens contained in this group */
tokens: string[];
};
}
type TokenNormalized = BooleanTokenNormalized | BorderTokenNormalized | ColorTokenNormalized | CubicBezierTokenNormalized | DimensionTokenNormalized | DurationTokenNormalized | FontFamilyTokenNormalized | FontWeightTokenNormalized | GradientTokenNormalized | LinkTokenNormalized | NumberTokenNormalized | ShadowTokenNormalized | StringTokenNormalized | StrokeStyleTokenNormalized | TransitionTokenNormalized | TypographyTokenNormalized;
type TokenNormalizedSet = Record<string, TokenNormalized>;
interface BooleanTokenNormalized extends TokenNormalizedCore<'boolean'> {
$value: BooleanValue;
partialAliasOf?: never;
mode: ModeMap<BooleanTokenNormalized>;
originalValue: BooleanToken | AliasToken;
}
interface BorderTokenNormalized extends TokenNormalizedCore<'border'> {
$value: BorderValueNormalized;
partialAliasOf?: Partial<Record<keyof BorderValueNormalized, string>>;
mode: ModeMap<BorderTokenNormalized>;
originalValue: BorderToken | AliasToken;
}
interface BorderValueNormalized {
color: ColorValueNormalized;
width: DimensionValue;
style: StrokeStyleValueExpanded;
}
interface ColorTokenNormalized extends TokenNormalizedCore<'color'> {
$value: ColorValueNormalized;
mode: ModeMap<ColorTokenNormalized>;
partialAliasOf?: never;
originalValue: ColorToken | AliasToken;
}
interface ColorValueNormalized {
/**
* Colorspace
* @default "srgb"
* @see https://www.w3.org/TR/css-color-4/#predefined
*/
colorSpace: ColorSpace;
channels?: [number, number, number];
/** Color components. Will be normalized to 1 unless the colorspace prevents it (e.g. XYZ, LAB) */
components: [number, number, number];
/** Alpha channel, normalized from 0 – 1 */
alpha: number;
/** Hex fallback (for sRGB) */
hex?: string;
}
type ColorSpace = 'a98-rgb' | 'display-p3' | 'hsl' | 'hwb' | 'lab' | 'lab-d65' | 'lch' | 'okhsv' | 'oklab' | 'oklch' | 'prophoto-rgb' | 'rec2020' | 'srgb-linear' | 'srgb' | 'xyz' | 'xyz-d50' | 'xyz-d65';
interface CubicBezierTokenNormalized extends TokenNormalizedCore<'cubicBezier'> {
$value: CubicBezierValue;
partialAliasOf?: [string | undefined, string | undefined, string | undefined, string | undefined];
mode: ModeMap<CubicBezierTokenNormalized>;
originalValue: CubicBezierToken | AliasToken;
}
interface DimensionTokenNormalized extends TokenNormalizedCore<'dimension'> {
$value: DimensionValue;
partialAliasOf?: never;
mode: ModeMap<DimensionTokenNormalized>;
originalValue: DimensionToken | AliasToken;
}
interface DurationTokenNormalized extends TokenNormalizedCore<'duration'> {
$value: DurationValue;
partialAliasOf?: never;
mode: ModeMap<DurationTokenNormalized>;
originalValue: DurationToken | AliasToken;
}
interface FontFamilyTokenNormalized extends TokenNormalizedCore<'fontFamily'> {
$value: FontFamilyValueNormalized;
aliasOf?: string;
partialAliasOf?: never;
mode: ModeMap<FontFamilyTokenNormalized>;
originalValue: FontFamilyToken | AliasToken;
}
type FontFamilyValueNormalized = string[];
interface FontWeightTokenNormalized extends TokenNormalizedCore<'fontWeight'> {
$type: 'fontWeight';
$value: FontWeightValueNormalized;
aliasOf?: string;
partialAliasOf?: never;
mode: ModeMap<FontWeightTokenNormalized>;
originalValue: FontWeightToken | AliasToken;
}
type FontWeightValueNormalized = number;
interface GradientTokenNormalized extends TokenNormalizedCore<'gradient'> {
$value: GradientValueNormalized;
partialAliasOf?: Partial<Record<keyof GradientStopNormalized, string>>[];
mode: ModeMap<GradientTokenNormalized>;
originalValue: GradientTokenNormalized | AliasToken;
}
type GradientValueNormalized = GradientStopNormalized[];
interface GradientStopNormalized {
color: ColorValueNormalized;
position: number;
}
interface LinkTokenNormalized extends TokenNormalizedCore<'link'> {
$value: LinkValue;
partialAliasOf?: never;
mode: ModeMap<LinkTokenNormalized>;
originalValue: LinkToken | AliasToken;
}
interface NumberTokenNormalized extends TokenNormalizedCore<'number'> {
$value: NumberValue;
partialAliasOf?: never;
mode: ModeMap<NumberTokenNormalized>;
originalValue: NumberToken | AliasToken;
}
interface ShadowTokenNormalized extends TokenNormalizedCore<'shadow'> {
$value: ShadowValueNormalized[];
partialAliasOf?: Partial<Record<keyof ShadowValueNormalized, string>>[];
mode: ModeMap<ShadowTokenNormalized>;
originalValue: ShadowToken | AliasToken;
}
interface ShadowValueNormalized {
color: ColorValueNormalized;
offsetX: DimensionValue;
offsetY: DimensionValue;
blur: DimensionValue;
spread: DimensionValue;
inset: boolean;
}
interface StringTokenNormalized extends TokenNormalizedCore<'string'> {
$value: StringValue;
partialAliasOf?: never;
mode: ModeMap<StringTokenNormalized>;
originalValue: StringTokenNormalized | AliasToken;
}
interface StrokeStyleTokenNormalized extends TokenNormalizedCore<'strokeStyle'> {
$value: StrokeStyleValueExpanded;
partialAliasOf?: never;
mode: ModeMap<StrokeStyleTokenNormalized>;
originalValue: StrokeStyleToken | AliasToken;
}
interface TransitionTokenNormalized extends TokenNormalizedCore<'transition'> {
$value: TransitionValueNormalized;
partialAliasOf?: Partial<Record<keyof TransitionValueNormalized, string>>;
mode: ModeMap<TransitionTokenNormalized>;
originalValue: TransitionToken | AliasToken;
}
interface TransitionValueNormalized {
duration: DurationValue;
delay: DurationValue;
timingFunction: CubicBezierValue;
}
interface TypographyTokenNormalized extends TokenNormalizedCore<'typography'> {
$value: TypographyValueNormalized;
partialAliasOf?: Record<string, string>;
mode: ModeMap<TypographyTokenNormalized>;
originalValue: TypographyToken | AliasToken;
}
interface TypographyValueNormalized {
fontFamily?: FontFamilyValue;
fontSize?: DimensionValue;
fontStyle?: string;
fontVariant?: string;
fontVariantAlternatives?: string;
fontVariantCaps?: string;
fontVariantEastAsian?: string;
fontVariantEmoji?: string;
fontVariantLigatures?: string;
fontVariantNumeric?: string;
fontVariantPosition?: string;
fontVariationSettings?: string;
fontWeight?: FontWeightValue;
letterSpacing?: DimensionValue;
lineHeight?: DimensionValue | NumberValue;
textDecoration?: string;
textTransform?: string;
[key: string]: unknown;
}
//# sourceMappingURL=types.d.ts.map
//#endregion
export { AliasToken, AliasValue, BooleanToken, BooleanTokenNormalized, BooleanValue, BorderToken, BorderTokenNormalized, BorderValue, BorderValueNormalized, ColorSpace, ColorToken, ColorTokenNormalized, ColorValue, ColorValueNormalized, CubicBezierToken, CubicBezierTokenNormalized, CubicBezierValue, DimensionToken, DimensionTokenNormalized, DimensionValue, DurationToken, DurationTokenNormalized, DurationValue, FontFamilyToken, FontFamilyTokenNormalized, FontFamilyValue, FontFamilyValueNormalized, FontWeightToken, FontWeightTokenNormalized, FontWeightValue, FontWeightValueNormalized, GradientStop, GradientStopNormalized, GradientToken, GradientTokenNormalized, GradientValue, GradientValueNormalized, Group, GroupCore, GroupOrToken, LinkToken, LinkTokenNormalized, LinkValue, ModeMap, NumberToken, NumberTokenNormalized, NumberValue, ShadowToken, ShadowTokenNormalized, ShadowValue, ShadowValueNormalized, StringToken, StringTokenNormalized, StringValue, StrokeStyleToken, StrokeStyleTokenNormalized, StrokeStyleValue, StrokeStyleValueExpanded, Token, TokenCore, TokenMode, TokenNormalized, TokenNormalizedCore, TokenNormalizedSet, TokensSet, TransitionToken, TransitionTokenNormalized, TransitionValue, TransitionValueNormalized, TypographyToken, TypographyTokenNormalized, TypographyValue, TypographyValueNormalized };
//# sourceMappingURL=types-BOWDcBsq.d.ts.map