@hh.ru/magritte-design-tokens-utils 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ import type { Root } from 'postcss';
2
+ type ParseResult = {
3
+ root: Root;
4
+ removed: number;
5
+ };
6
+ export declare const collectDefaultTokenValues: (defaultParsedFiles: Root[]) => Map<string, Set<string>>;
7
+ export declare const removeRedundantByValue: (root: Root, defaults: Map<string, Set<string>>) => ParseResult;
8
+ export declare const collectAllowedProps: (defaultParsedFiles: Root[]) => Set<string>;
9
+ export declare const cleanThemeFile: (root: Root, allowedProps: Set<string>) => ParseResult;
10
+ export {};
package/deduplicate.js ADDED
@@ -0,0 +1,76 @@
1
+ const normalize = (value) => {
2
+ const collapsedValue = value.trim().replace(/\s+/g, ' ');
3
+ return collapsedValue.replace(/#([0-9a-fA-F]{3,8})\b/g, (value) => value.toLowerCase());
4
+ };
5
+ // собираем все из дефолтных тем
6
+ const collectDefaultTokenValues = (defaultParsedFiles) => {
7
+ const setOfTokens = new Map();
8
+ for (const root of defaultParsedFiles) {
9
+ root.walkDecls((declaration) => {
10
+ if (typeof declaration.prop === 'string' && declaration.prop.startsWith('--')) {
11
+ const key = declaration.prop.trim();
12
+ const val = normalize(String(declaration.value ?? ''));
13
+ if (!setOfTokens.has(key)) {
14
+ setOfTokens.set(key, new Set());
15
+ }
16
+ setOfTokens.get(key)?.add(val);
17
+ }
18
+ });
19
+ }
20
+ return setOfTokens;
21
+ };
22
+ // убираем токены, значения которые не меняются от темы к теме
23
+ const removeRedundantByValue = (root, defaults) => {
24
+ let removed = 0;
25
+ root.walkDecls((declaration) => {
26
+ if (!(typeof declaration.prop === 'string' && declaration.prop.startsWith('--'))) {
27
+ return;
28
+ }
29
+ const key = declaration.prop.trim();
30
+ const val = normalize(String(declaration.value ?? ''));
31
+ const defVals = defaults.get(key);
32
+ if (defVals && defVals.has(val)) {
33
+ removed += 1;
34
+ declaration.remove();
35
+ }
36
+ });
37
+ root.walkRules((rule) => {
38
+ if (!rule.nodes || rule.nodes.every((node) => node.type !== 'decl')) {
39
+ rule.remove();
40
+ }
41
+ });
42
+ return { root, removed };
43
+ };
44
+ // собираем уникальные токены
45
+ const collectAllowedProps = (defaultParsedFiles) => {
46
+ const allowedProps = new Set();
47
+ for (const root of defaultParsedFiles) {
48
+ root.walkDecls((declaration) => {
49
+ if (typeof declaration.prop === 'string' && declaration.prop.startsWith('--')) {
50
+ allowedProps.add(declaration.prop.trim());
51
+ }
52
+ });
53
+ }
54
+ return allowedProps;
55
+ };
56
+ // чистим тему от уникальных значений (которых нет в базовой теме)
57
+ const cleanThemeFile = (root, allowedProps) => {
58
+ let removed = 0;
59
+ root.walkDecls((declaration) => {
60
+ if (typeof declaration.prop === 'string' && declaration.prop.startsWith('--')) {
61
+ if (!allowedProps.has(declaration.prop.trim())) {
62
+ declaration.remove();
63
+ removed += 1;
64
+ }
65
+ }
66
+ });
67
+ root.walkRules((rule) => {
68
+ if (!rule.nodes || rule.nodes.every((node) => node.type !== 'decl')) {
69
+ rule.remove();
70
+ }
71
+ });
72
+ return { root, removed };
73
+ };
74
+
75
+ export { cleanThemeFile, collectAllowedProps, collectDefaultTokenValues, removeRedundantByValue };
76
+ //# sourceMappingURL=deduplicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicate.js","sources":["../src/deduplicate.ts"],"sourcesContent":["import type { Declaration, Root, Rule } from 'postcss';\n\nconst normalize = (value: string): string => {\n const collapsedValue = value.trim().replace(/\\s+/g, ' ');\n return collapsedValue.replace(/#([0-9a-fA-F]{3,8})\\b/g, (value) => value.toLowerCase());\n};\n\ntype ParseResult = { root: Root; removed: number };\n\n// собираем все из дефолтных тем\nexport const collectDefaultTokenValues = (defaultParsedFiles: Root[]): Map<string, Set<string>> => {\n const setOfTokens = new Map<string, Set<string>>();\n for (const root of defaultParsedFiles) {\n root.walkDecls((declaration: Declaration) => {\n if (typeof declaration.prop === 'string' && declaration.prop.startsWith('--')) {\n const key = declaration.prop.trim();\n const val = normalize(String(declaration.value ?? ''));\n if (!setOfTokens.has(key)) {\n setOfTokens.set(key, new Set<string>());\n }\n setOfTokens.get(key)?.add(val);\n }\n });\n }\n return setOfTokens;\n};\n\n// убираем токены, значения которые не меняются от темы к теме\nexport const removeRedundantByValue = (root: Root, defaults: Map<string, Set<string>>): ParseResult => {\n let removed = 0;\n\n root.walkDecls((declaration: Declaration) => {\n if (!(typeof declaration.prop === 'string' && declaration.prop.startsWith('--'))) {\n return;\n }\n\n const key = declaration.prop.trim();\n const val = normalize(String(declaration.value ?? ''));\n const defVals = defaults.get(key);\n\n if (defVals && defVals.has(val)) {\n removed += 1;\n declaration.remove();\n }\n });\n\n root.walkRules((rule: Rule) => {\n if (!rule.nodes || rule.nodes.every((node) => node.type !== 'decl')) {\n rule.remove();\n }\n });\n return { root, removed };\n};\n\n// собираем уникальные токены\nexport const collectAllowedProps = (defaultParsedFiles: Root[]): Set<string> => {\n const allowedProps = new Set<string>();\n for (const root of defaultParsedFiles) {\n root.walkDecls((declaration: Declaration) => {\n if (typeof declaration.prop === 'string' && declaration.prop.startsWith('--')) {\n allowedProps.add(declaration.prop.trim());\n }\n });\n }\n return allowedProps;\n};\n\n// чистим тему от уникальных значений (которых нет в базовой теме)\nexport const cleanThemeFile = (root: Root, allowedProps: Set<string>): ParseResult => {\n let removed = 0;\n root.walkDecls((declaration: Declaration) => {\n if (typeof declaration.prop === 'string' && declaration.prop.startsWith('--')) {\n if (!allowedProps.has(declaration.prop.trim())) {\n declaration.remove();\n removed += 1;\n }\n }\n });\n root.walkRules((rule: Rule) => {\n if (!rule.nodes || rule.nodes.every((node) => node.type !== 'decl')) {\n rule.remove();\n }\n });\n return { root, removed };\n};\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -2,4 +2,5 @@ export * from '@hh.ru/magritte-design-tokens-utils/purify';
2
2
  export * from '@hh.ru/magritte-design-tokens-utils/tokenize';
3
3
  export * from '@hh.ru/magritte-design-tokens-utils/prepare';
4
4
  export * from '@hh.ru/magritte-design-tokens-utils/constants';
5
+ export * from '@hh.ru/magritte-design-tokens-utils/deduplicate';
5
6
  export * from '@hh.ru/magritte-design-tokens-utils/types';
package/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  export { purify } from './purify.js';
2
- export { TYPES, cssFormatter, getVariableUnit, kebabWithUnderscoreTransformer, typographyTransformations } from './tokenize.js';
2
+ export { TYPES, getFontWeightValue, getVariableUnit, kebabWithUnderscoreTransformer, renderTokensWithFormatter, typographyTransformations } from './tokenize.js';
3
3
  export { filterThemeSets, prepareBaseTokens, prepareThemesTokens } from './prepare.js';
4
4
  export { BASE_SET, TOKENS_DEFAULT_THEME } from './constants.js';
5
+ export { cleanThemeFile, collectAllowedProps, collectDefaultTokenValues, removeRedundantByValue } from './deduplicate.js';
5
6
  import 'change-case';
6
7
  import 'spring-easing';
7
8
  import 'token-transformer';
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-design-tokens-utils",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "type": "module",
@@ -25,5 +25,5 @@
25
25
  "publishConfig": {
26
26
  "access": "public"
27
27
  },
28
- "gitHead": "a823b2d582e812bf99b5fdf32058a93eaa59076b"
28
+ "gitHead": "b2ab15b73592666625ff3b84e10f3cc1bcee9cbc"
29
29
  }
package/tokenize.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Named, Transform, TransformedToken, Dictionary } from 'style-dictionary';
2
- import type { TypographyTransformations } from '@hh.ru/magritte-design-tokens-utils/types';
2
+ import type { TokenCasualValue, TypographyTransformations, RealTransformedToken } from '@hh.ru/magritte-design-tokens-utils/types';
3
3
  export declare const TYPES: {
4
4
  BORDER_RADIUS: string;
5
5
  BORDER_WIDTH: string;
@@ -19,7 +19,14 @@ export declare const TYPES: {
19
19
  BLUR: string;
20
20
  SPREAD: string;
21
21
  };
22
+ export declare const getFontWeightValue: (value: TokenCasualValue) => TokenCasualValue;
22
23
  export declare const typographyTransformations: TypographyTransformations;
23
24
  export declare const getVariableUnit: (token: TransformedToken) => string;
24
- export declare const cssFormatter: (dictionary: Dictionary, versionPostfix: string) => string;
25
+ export interface FormatterTypographyToken {
26
+ (token: RealTransformedToken, versionPostfix?: string): string[];
27
+ }
28
+ export interface FormatterToken {
29
+ (name: string, value: TokenCasualValue, versionPostfix?: string): string;
30
+ }
31
+ export declare const renderTokensWithFormatter: (dictionary: Dictionary, versionPostfix: string, formatter?: FormatterToken, formatterTypography?: FormatterTypographyToken) => string;
25
32
  export declare const kebabWithUnderscoreTransformer: Named<Transform>;
package/tokenize.js CHANGED
@@ -56,7 +56,7 @@ const getVariableUnit = (token) => {
56
56
  return '';
57
57
  }
58
58
  };
59
- const expandTypographyCss = (token, versionPostfix) => {
59
+ const formatterTypographyToCssVariable = (token, versionPostfix) => {
60
60
  const tokenValue = token.value;
61
61
  return Object.keys(tokenValue)
62
62
  .reduce((result, key) => {
@@ -69,45 +69,47 @@ const expandTypographyCss = (token, versionPostfix) => {
69
69
  }, [])
70
70
  .map(({ name, value }) => ` --${token.name}-${name}${versionPostfix}: ${value};`);
71
71
  };
72
- const cssFormatter = (dictionary, versionPostfix) => {
73
- const formatCssVariable = (name, value) => ` --${name}${versionPostfix}: ${value};`;
72
+ const formatterTokenToCssVariable = (name, value, versionPostfix) => ` --${name}${versionPostfix}: ${value};`;
73
+ // рендерит токены с использованием выбранных форматоров
74
+ // дефолтные форматеры позволят получить токены в виде css переменных
75
+ const renderTokensWithFormatter = (dictionary, versionPostfix, formatter = formatterTokenToCssVariable, formatterTypography = formatterTypographyToCssVariable) => {
74
76
  const props = dictionary.allProperties
75
77
  .reduce((result, token) => {
76
78
  const { name, value, type, rawValue } = token;
77
79
  if (type === 'typography') {
78
- result.push(...expandTypographyCss(token, versionPostfix));
80
+ result.push(...formatterTypography(token, versionPostfix));
79
81
  }
80
82
  else if (type === 'fontWeights') {
81
- result.push(formatCssVariable(name, getFontWeightValue(value)));
83
+ result.push(formatter(name, getFontWeightValue(value), versionPostfix));
82
84
  }
83
85
  else if (type === 'animation') {
84
86
  const { x1, y1, x2, y2, duration } = rawValue;
85
- result.push(formatCssVariable(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`));
86
- result.push(formatCssVariable(`${name}-duration`, `${duration}ms`));
87
+ result.push(formatter(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`, versionPostfix));
88
+ result.push(formatter(`${name}-duration`, `${duration}ms`, versionPostfix));
87
89
  }
88
90
  else if (type === 'animationTime') {
89
91
  const { duration } = rawValue;
90
- result.push(formatCssVariable(`${name}-duration`, `${duration}ms`));
92
+ result.push(formatter(`${name}-duration`, `${duration}ms`, versionPostfix));
91
93
  }
92
94
  else if (type === 'animationEaseBase') {
93
95
  const { x1, y1, x2, y2 } = rawValue;
94
- result.push(formatCssVariable(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`));
96
+ result.push(formatter(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`, versionPostfix));
95
97
  }
96
98
  else if (type === 'animationEaseSpring') {
97
99
  const { stiffness, damping, mass } = rawValue;
98
100
  const [easings] = CSSSpringEasing({ easing: `spring(${mass}, ${stiffness}, ${damping})` });
99
- result.push(formatCssVariable(`${name}-timing-function`, `linear(${easings})`));
101
+ result.push(formatter(`${name}-timing-function`, `linear(${easings})`, versionPostfix));
100
102
  }
101
103
  else if (type === 'border') {
102
104
  const { width, style } = rawValue;
103
- result.push(formatCssVariable(name, `${width}px ${style}`));
105
+ result.push(formatter(name, `${width}px ${style}`, versionPostfix));
104
106
  }
105
107
  else if (type === 'letterSpacing') {
106
- result.push(formatCssVariable(name, `${parseFloat(value) / 100}em`));
108
+ result.push(formatter(name, `${parseFloat(value) / 100}em`, versionPostfix));
107
109
  }
108
110
  else {
109
111
  // eslint-disable-next-line @typescript-eslint/no-base-to-string
110
- result.push(formatCssVariable(name, `${value}${getVariableUnit(token)}`));
112
+ result.push(formatter(name, `${value}${getVariableUnit(token)}`, versionPostfix));
111
113
  }
112
114
  return result;
113
115
  }, [])
@@ -122,5 +124,5 @@ const kebabWithUnderscoreTransformer = {
122
124
  }),
123
125
  };
124
126
 
125
- export { TYPES, cssFormatter, getVariableUnit, kebabWithUnderscoreTransformer, typographyTransformations };
127
+ export { TYPES, getFontWeightValue, getVariableUnit, kebabWithUnderscoreTransformer, renderTokensWithFormatter, typographyTransformations };
126
128
  //# sourceMappingURL=tokenize.js.map
package/tokenize.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.js","sources":["../src/tokenize.ts"],"sourcesContent":["import { paramCase } from 'change-case';\nimport { CSSSpringEasing } from 'spring-easing';\nimport { Named, Transform, TransformedToken, Dictionary } from 'style-dictionary';\n\nimport type {\n TypographyTokenValue,\n TokenCasualValue,\n TypographyTransformationsResult,\n TypographyTransformations,\n RealTransformedToken,\n} from '@hh.ru/magritte-design-tokens-utils/types';\n\nexport const TYPES = {\n BORDER_RADIUS: 'borderRadius',\n BORDER_WIDTH: 'borderWidth',\n COLOR: 'color',\n FONT_FAMILY: 'fontFamily',\n FONT_SIZE: 'fontSizes',\n FONT_WEIGHT: 'fontWeights',\n LETTER_SPACING: 'letterSpacing',\n LINE_HEIGHT: 'lineHeights',\n PARAGRAPH_SPACING: 'paragraphSpacing',\n SIZING: 'sizing',\n SPACING: 'spacing',\n TEXT_CASE: 'textCase',\n\n TEXT_DECORATION: 'textDecoration',\n // shadows\n X: 'x',\n Y: 'y',\n BLUR: 'blur',\n SPREAD: 'spread',\n};\n\nconst FONT_WEIGHT_VALUES = { Bold: 700, 'Semi Bold': 600, Medium: 500, Regular: 400, Italic: 400 };\n\nconst getFontWeightValue = (value: TokenCasualValue) =>\n value in FONT_WEIGHT_VALUES ? FONT_WEIGHT_VALUES[value as keyof typeof FONT_WEIGHT_VALUES] : value;\n\nexport const typographyTransformations: TypographyTransformations = {\n fontFamily: (value) => [{ name: 'font-family', value: `\"${value}\"` }],\n fontWeight: (value) => [\n {\n name: 'font-weight',\n value: getFontWeightValue(value),\n },\n ],\n fontSize: (value) => [{ name: 'font-size', value: `${value}px` }],\n lineHeight: (value) => [{ name: 'line-height', value: `${value}px` }],\n letterSpacing: (value) => [{ name: 'letter-spacing', value: `${parseFloat(value as string) / 100}em` }],\n textCase: (value) => [{ name: 'text-transform', value: (value as string).toLowerCase() }],\n textDecoration: (value) => [{ name: 'text-decoration', value: (value as string).toLowerCase() }],\n paragraphIndent: (value) => [{ name: 'text-indent', value }],\n};\n\nexport const getVariableUnit = (token: TransformedToken): string => {\n const { type } = token;\n\n switch (type) {\n case TYPES.BORDER_RADIUS:\n case TYPES.BORDER_WIDTH:\n case TYPES.PARAGRAPH_SPACING:\n case TYPES.SIZING:\n case TYPES.SPACING:\n case TYPES.X:\n case TYPES.Y:\n case TYPES.BLUR:\n case TYPES.SPREAD:\n case TYPES.FONT_SIZE:\n return 'px';\n default:\n return '';\n }\n};\n\nconst expandTypographyCss = (token: RealTransformedToken, versionPostfix: string) => {\n const tokenValue = token.value as TypographyTokenValue;\n return Object.keys(tokenValue)\n .reduce<TypographyTransformationsResult>((result, key) => {\n if (!typographyTransformations[key]) {\n return result;\n }\n const transformed = typographyTransformations[key](tokenValue[key]);\n result.push(...transformed);\n return result;\n }, [])\n .map(({ name, value }) => ` --${token.name}-${name}${versionPostfix}: ${value};`);\n};\n\ntype Duration = { duration: number };\n\ntype Ease = { x1: number; y1: number; x2: number; y2: number };\n\ntype Spring = { stiffness: number; damping: number; mass: number };\n\nexport const cssFormatter = (dictionary: Dictionary, versionPostfix: string): string => {\n const formatCssVariable = (name: string, value: TokenCasualValue) => ` --${name}${versionPostfix}: ${value};`;\n\n const props = dictionary.allProperties\n .reduce<string[]>((result, token) => {\n const { name, value, type, rawValue } = token as RealTransformedToken;\n if (type === 'typography') {\n result.push(...expandTypographyCss(token, versionPostfix));\n } else if (type === 'fontWeights') {\n result.push(formatCssVariable(name, getFontWeightValue(value as TokenCasualValue)));\n } else if (type === 'animation') {\n const { x1, y1, x2, y2, duration } = rawValue as Duration & Ease;\n result.push(formatCssVariable(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`));\n result.push(formatCssVariable(`${name}-duration`, `${duration}ms`));\n } else if (type === 'animationTime') {\n const { duration } = rawValue as Duration;\n result.push(formatCssVariable(`${name}-duration`, `${duration}ms`));\n } else if (type === 'animationEaseBase') {\n const { x1, y1, x2, y2 } = rawValue as Ease;\n result.push(formatCssVariable(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`));\n } else if (type === 'animationEaseSpring') {\n const { stiffness, damping, mass } = rawValue as Spring;\n const [easings] = CSSSpringEasing({ easing: `spring(${mass}, ${stiffness}, ${damping})` });\n result.push(formatCssVariable(`${name}-timing-function`, `linear(${easings})`));\n } else if (type === 'border') {\n const { width, style } = rawValue as Record<string, string | number>;\n result.push(formatCssVariable(name, `${width}px ${style}`));\n } else if (type === 'letterSpacing') {\n result.push(formatCssVariable(name, `${parseFloat(value as string) / 100}em`));\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n result.push(formatCssVariable(name, `${value}${getVariableUnit(token)}`));\n }\n return result;\n }, [])\n .join('\\n');\n\n return props;\n};\n\nexport const kebabWithUnderscoreTransformer: Named<Transform> = {\n type: 'name',\n name: 'name/cti/kebabWithUnderscore',\n transformer: (token, options = {}) =>\n paramCase([options.prefix].concat(token.path).join(' '), {\n stripRegexp: /[^A-Z0-9_]+/gi,\n }),\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenize.js","sources":["../src/tokenize.ts"],"sourcesContent":["import { paramCase } from 'change-case';\nimport { CSSSpringEasing } from 'spring-easing';\nimport { Named, Transform, TransformedToken, Dictionary } from 'style-dictionary';\n\nimport type {\n TypographyTokenValue,\n TokenCasualValue,\n TypographyTransformationsResult,\n TypographyTransformations,\n RealTransformedToken,\n} from '@hh.ru/magritte-design-tokens-utils/types';\n\nexport const TYPES = {\n BORDER_RADIUS: 'borderRadius',\n BORDER_WIDTH: 'borderWidth',\n COLOR: 'color',\n FONT_FAMILY: 'fontFamily',\n FONT_SIZE: 'fontSizes',\n FONT_WEIGHT: 'fontWeights',\n LETTER_SPACING: 'letterSpacing',\n LINE_HEIGHT: 'lineHeights',\n PARAGRAPH_SPACING: 'paragraphSpacing',\n SIZING: 'sizing',\n SPACING: 'spacing',\n TEXT_CASE: 'textCase',\n\n TEXT_DECORATION: 'textDecoration',\n // shadows\n X: 'x',\n Y: 'y',\n BLUR: 'blur',\n SPREAD: 'spread',\n};\n\nconst FONT_WEIGHT_VALUES = { Bold: 700, 'Semi Bold': 600, Medium: 500, Regular: 400, Italic: 400 };\n\nexport const getFontWeightValue = (value: TokenCasualValue): TokenCasualValue =>\n value in FONT_WEIGHT_VALUES ? FONT_WEIGHT_VALUES[value as keyof typeof FONT_WEIGHT_VALUES] : value;\n\nexport const typographyTransformations: TypographyTransformations = {\n fontFamily: (value) => [{ name: 'font-family', value: `\"${value}\"` }],\n fontWeight: (value) => [\n {\n name: 'font-weight',\n value: getFontWeightValue(value),\n },\n ],\n fontSize: (value) => [{ name: 'font-size', value: `${value}px` }],\n lineHeight: (value) => [{ name: 'line-height', value: `${value}px` }],\n letterSpacing: (value) => [{ name: 'letter-spacing', value: `${parseFloat(value as string) / 100}em` }],\n textCase: (value) => [{ name: 'text-transform', value: (value as string).toLowerCase() }],\n textDecoration: (value) => [{ name: 'text-decoration', value: (value as string).toLowerCase() }],\n paragraphIndent: (value) => [{ name: 'text-indent', value }],\n};\n\nexport const getVariableUnit = (token: TransformedToken): string => {\n const { type } = token;\n\n switch (type) {\n case TYPES.BORDER_RADIUS:\n case TYPES.BORDER_WIDTH:\n case TYPES.PARAGRAPH_SPACING:\n case TYPES.SIZING:\n case TYPES.SPACING:\n case TYPES.X:\n case TYPES.Y:\n case TYPES.BLUR:\n case TYPES.SPREAD:\n case TYPES.FONT_SIZE:\n return 'px';\n default:\n return '';\n }\n};\n\nexport interface FormatterTypographyToken {\n (token: RealTransformedToken, versionPostfix?: string): string[];\n}\nconst formatterTypographyToCssVariable: FormatterTypographyToken = (token, versionPostfix) => {\n const tokenValue = token.value as TypographyTokenValue;\n return Object.keys(tokenValue)\n .reduce<TypographyTransformationsResult>((result, key) => {\n if (!typographyTransformations[key]) {\n return result;\n }\n const transformed = typographyTransformations[key](tokenValue[key]);\n result.push(...transformed);\n return result;\n }, [])\n .map(({ name, value }) => ` --${token.name}-${name}${versionPostfix}: ${value};`);\n};\n\ntype Duration = { duration: number };\n\ntype Ease = { x1: number; y1: number; x2: number; y2: number };\n\ntype Spring = { stiffness: number; damping: number; mass: number };\n\nexport interface FormatterToken {\n (name: string, value: TokenCasualValue, versionPostfix?: string): string;\n}\nconst formatterTokenToCssVariable: FormatterToken = (name, value, versionPostfix) =>\n ` --${name}${versionPostfix}: ${value};`;\n\n// рендерит токены с использованием выбранных форматоров\n// дефолтные форматеры позволят получить токены в виде css переменных\nexport const renderTokensWithFormatter = (\n dictionary: Dictionary,\n versionPostfix: string,\n formatter = formatterTokenToCssVariable,\n formatterTypography = formatterTypographyToCssVariable\n): string => {\n const props = dictionary.allProperties\n .reduce<string[]>((result, token) => {\n const { name, value, type, rawValue } = token as RealTransformedToken;\n if (type === 'typography') {\n result.push(...formatterTypography(token, versionPostfix));\n } else if (type === 'fontWeights') {\n result.push(formatter(name, getFontWeightValue(value as TokenCasualValue), versionPostfix));\n } else if (type === 'animation') {\n const { x1, y1, x2, y2, duration } = rawValue as Duration & Ease;\n result.push(\n formatter(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`, versionPostfix)\n );\n result.push(formatter(`${name}-duration`, `${duration}ms`, versionPostfix));\n } else if (type === 'animationTime') {\n const { duration } = rawValue as Duration;\n result.push(formatter(`${name}-duration`, `${duration}ms`, versionPostfix));\n } else if (type === 'animationEaseBase') {\n const { x1, y1, x2, y2 } = rawValue as Ease;\n result.push(\n formatter(`${name}-timing-function`, `cubic-bezier(${x1}, ${y1}, ${x2}, ${y2})`, versionPostfix)\n );\n } else if (type === 'animationEaseSpring') {\n const { stiffness, damping, mass } = rawValue as Spring;\n const [easings] = CSSSpringEasing({ easing: `spring(${mass}, ${stiffness}, ${damping})` });\n result.push(formatter(`${name}-timing-function`, `linear(${easings})`, versionPostfix));\n } else if (type === 'border') {\n const { width, style } = rawValue as Record<string, string | number>;\n result.push(formatter(name, `${width}px ${style}`, versionPostfix));\n } else if (type === 'letterSpacing') {\n result.push(formatter(name, `${parseFloat(value as string) / 100}em`, versionPostfix));\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n result.push(formatter(name, `${value}${getVariableUnit(token)}`, versionPostfix));\n }\n return result;\n }, [])\n .join('\\n');\n\n return props;\n};\n\nexport const kebabWithUnderscoreTransformer: Named<Transform> = {\n type: 'name',\n name: 'name/cti/kebabWithUnderscore',\n transformer: (token, options = {}) =>\n paramCase([options.prefix].concat(token.path).join(' '), {\n stripRegexp: /[^A-Z0-9_]+/gi,\n }),\n};\n"],"names":[],"mappings":"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"}