File size: 2,595 Bytes
dc7ee79
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**

 * src/utils/units.js

 * Unit conversion helpers for CSS β†’ Figma (always px).

 * Since we use computed styles from Playwright, most values

 * are already resolved to px by the browser. These helpers

 * handle the remaining edge cases.

 */

/**

 * Parse a CSS px string β†’ number.

 * e.g. "24px" β†’ 24, "0" β†’ 0

 */
export function parsePx(value) {
  if (!value || value === 'none' || value === 'auto') return 0;
  const n = parseFloat(value);
  return isNaN(n) ? 0 : n;
}

/**

 * Convert CSS letter-spacing (em) to px, given a font size.

 * e.g. "0.12em", fontSize=13 β†’ 1.56

 */
export function letterSpacingToPx(value, fontSize) {
  if (!value || value === 'normal') return 0;
  if (value.endsWith('em')) {
    return parseFloat(value) * parsePx(fontSize);
  }
  return parsePx(value);
}

/**

 * Convert CSS line-height to Figma format.

 * Returns { value: number, unit: "PERCENT" | "PIXELS" | "AUTO" }

 */
export function lineHeightToFigma(value, fontSize) {
  if (!value || value === 'normal') return { unit: 'AUTO' };

  // Unitless (e.g. 1.8) β†’ multiply by 100 for percent
  const n = parseFloat(value);
  if (!isNaN(n) && !value.includes('px') && !value.includes('%')) {
    return { value: Math.round(n * 100), unit: 'PERCENT' };
  }

  if (value.endsWith('%')) {
    return { value: parseFloat(value), unit: 'PERCENT' };
  }

  if (value.endsWith('px')) {
    return { value: n, unit: 'PIXELS' };
  }

  return { unit: 'AUTO' };
}

/**

 * Convert CSS font-weight number β†’ Figma style name.

 */
export const WEIGHT_MAP = {
  100: 'Thin',
  200: 'ExtraLight',
  300: 'Light',
  400: 'Regular',
  500: 'Medium',
  600: 'SemiBold',
  700: 'Bold',
  800: 'ExtraBold',
  900: 'Black',
};

/**

 * Convert CSS text-align β†’ Figma textAlignHorizontal.

 */
export const TEXT_ALIGN_MAP = {
  left: 'LEFT',
  center: 'CENTER',
  right: 'RIGHT',
  justify: 'JUSTIFIED',
};

/**

 * Convert CSS text-transform β†’ Figma textCase.

 */
export const TEXT_CASE_MAP = {
  uppercase: 'UPPER',
  lowercase: 'LOWER',
  capitalize: 'TITLE',
  none: 'ORIGINAL',
};

/**

 * Convert CSS justify-content β†’ Figma primaryAxisAlignItems.

 */
export const JUSTIFY_MAP = {
  'flex-start': 'MIN',
  'center': 'CENTER',
  'flex-end': 'MAX',
  'space-between': 'SPACE_BETWEEN',
};

/**

 * Convert CSS align-items β†’ Figma counterAxisAlignItems.

 */
export const ALIGN_MAP = {
  'flex-start': 'MIN',
  'center': 'CENTER',
  'flex-end': 'MAX',
  'stretch': 'STRETCH',
  'baseline': 'BASELINE',
};