@seed-design/figma 0.0.21 → 0.0.22

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.
Files changed (82) hide show
  1. package/lib/codegen/index.cjs +8019 -0
  2. package/lib/codegen/index.d.ts +1827 -0
  3. package/lib/codegen/index.js +7989 -0
  4. package/lib/codegen/targets/react/index.cjs +12205 -0
  5. package/lib/codegen/targets/react/index.d.ts +270 -0
  6. package/lib/codegen/targets/react/index.js +12187 -0
  7. package/lib/index.cjs +79 -2741
  8. package/lib/index.d.ts +17 -1937
  9. package/lib/index.js +61 -2715
  10. package/package.json +11 -1
  11. package/src/codegen/{targets/react/component/properties.type.ts → component-properties.ts} +43 -43
  12. package/src/codegen/core/codegen.ts +23 -8
  13. package/src/codegen/core/{component.ts → component-handler.ts} +3 -3
  14. package/src/codegen/core/component-type-helper.ts +35 -0
  15. package/src/codegen/core/context.ts +20 -0
  16. package/src/codegen/core/index.ts +16 -14
  17. package/src/codegen/core/{props.ts → props-converter.ts} +10 -13
  18. package/src/codegen/core/{value.ts → value-resolver.ts} +90 -52
  19. package/src/codegen/default-services.ts +44 -0
  20. package/src/codegen/index.ts +1 -44
  21. package/src/codegen/targets/figma/frame.ts +8 -8
  22. package/src/codegen/targets/figma/index.ts +1 -1
  23. package/src/codegen/targets/figma/pipeline.ts +71 -0
  24. package/src/codegen/targets/figma/props.ts +59 -70
  25. package/src/codegen/targets/figma/shape.ts +18 -18
  26. package/src/codegen/targets/figma/text.ts +6 -6
  27. package/src/codegen/targets/figma/value-resolver.ts +22 -0
  28. package/src/codegen/targets/react/component/deps.interface.ts +5 -4
  29. package/src/codegen/targets/react/component/{transformers → handlers}/action-button.ts +8 -14
  30. package/src/codegen/targets/react/component/{transformers → handlers}/action-chip.ts +10 -20
  31. package/src/codegen/targets/react/component/{transformers → handlers}/action-sheet.ts +13 -10
  32. package/src/codegen/targets/react/component/{transformers → handlers}/app-bar.ts +28 -36
  33. package/src/codegen/targets/react/component/handlers/avatar-stack.ts +29 -0
  34. package/src/codegen/targets/react/component/{transformers → handlers}/avatar.ts +12 -9
  35. package/src/codegen/targets/react/component/handlers/badge.ts +18 -0
  36. package/src/codegen/targets/react/component/{transformers → handlers}/callout.ts +6 -8
  37. package/src/codegen/targets/react/component/{transformers → handlers}/checkbox.ts +5 -5
  38. package/src/codegen/targets/react/component/{transformers → handlers}/chip-tabs.ts +10 -10
  39. package/src/codegen/targets/react/component/{transformers → handlers}/control-chip.ts +10 -20
  40. package/src/codegen/targets/react/component/{transformers → handlers}/error-state.ts +9 -9
  41. package/src/codegen/targets/react/component/{transformers → handlers}/extended-action-sheet.ts +16 -18
  42. package/src/codegen/targets/react/component/{transformers → handlers}/extended-fab.ts +6 -6
  43. package/src/codegen/targets/react/component/handlers/fab.ts +18 -0
  44. package/src/codegen/targets/react/component/{transformers → handlers}/help-bubble.ts +5 -5
  45. package/src/codegen/targets/react/component/{transformers → handlers}/identity-placeholder.ts +5 -5
  46. package/src/codegen/targets/react/component/{transformers → handlers}/inline-banner.ts +7 -10
  47. package/src/codegen/targets/react/component/{transformers → handlers}/manner-temp-badge.ts +5 -5
  48. package/src/codegen/targets/react/component/{transformers → handlers}/multiline-text-field.ts +5 -5
  49. package/src/codegen/targets/react/component/{transformers → handlers}/progress-circle.ts +5 -5
  50. package/src/codegen/targets/react/component/{transformers → handlers}/reaction-button.ts +6 -6
  51. package/src/codegen/targets/react/component/{transformers → handlers}/segmented-control.ts +10 -10
  52. package/src/codegen/targets/react/component/{transformers → handlers}/select-box.ts +10 -10
  53. package/src/codegen/targets/react/component/handlers/skeleton.ts +25 -0
  54. package/src/codegen/targets/react/component/{transformers → handlers}/snackbar.ts +5 -5
  55. package/src/codegen/targets/react/component/{transformers → handlers}/switch.ts +5 -5
  56. package/src/codegen/targets/react/component/{transformers → handlers}/tabs.ts +15 -15
  57. package/src/codegen/targets/react/component/{transformers → handlers}/text-button.ts +7 -13
  58. package/src/codegen/targets/react/component/{transformers → handlers}/text-field.ts +9 -9
  59. package/src/codegen/targets/react/component/{transformers → handlers}/toggle-button.ts +7 -11
  60. package/src/codegen/targets/react/component/index.ts +79 -75
  61. package/src/codegen/targets/react/frame.ts +8 -8
  62. package/src/codegen/targets/react/icon.ts +50 -0
  63. package/src/codegen/targets/react/index.ts +1 -1
  64. package/src/codegen/targets/react/instance.ts +19 -50
  65. package/src/codegen/targets/react/pipeline.ts +108 -0
  66. package/src/codegen/targets/react/props.ts +95 -73
  67. package/src/codegen/targets/react/shape.ts +5 -5
  68. package/src/codegen/targets/react/text.ts +6 -6
  69. package/src/codegen/targets/react/value-resolver.ts +35 -0
  70. package/src/entities/icon.repository.ts +2 -2
  71. package/src/entities/icon.service.ts +9 -20
  72. package/src/entities/style.service.ts +5 -17
  73. package/src/entities/variable.service.ts +36 -68
  74. package/src/utils/figma-variable.ts +39 -3
  75. package/src/codegen/core/component.types.ts +0 -29
  76. package/src/codegen/targets/figma/context.ts +0 -139
  77. package/src/codegen/targets/react/component/transformers/avatar-stack.ts +0 -29
  78. package/src/codegen/targets/react/component/transformers/badge.ts +0 -21
  79. package/src/codegen/targets/react/component/transformers/fab.ts +0 -18
  80. package/src/codegen/targets/react/component/transformers/skeleton.ts +0 -51
  81. package/src/codegen/targets/react/context.ts +0 -176
  82. /package/src/codegen/core/{element.ts → element-transformer.ts} +0 -0
@@ -1,3 +1,4 @@
1
+ import type { StyleService, VariableValueResolved } from "@/entities";
1
2
  import type {
2
3
  NormalizedCornerTrait,
3
4
  NormalizedHasFramePropertiesTrait,
@@ -14,8 +15,9 @@ import {
14
15
  } from "@/utils/figma-node";
15
16
  import type { RGBA } from "@figma/rest-api-spec";
16
17
  import type { VariableService } from "../../entities/variable.service";
18
+ import { useCodegenOptions } from "./context";
17
19
 
18
- export interface ValueTransformer<TColor, TDimension, TFontDimension, TFontWeight> {
20
+ export interface ValueResolver<TColor, TDimension, TFontDimension, TFontWeight> {
19
21
  getFormattedValue: {
20
22
  frameFill: (
21
23
  node: NormalizedHasGeometryTrait & NormalizedIsLayerTrait,
@@ -84,44 +86,83 @@ export interface ValueTransformer<TColor, TDimension, TFontDimension, TFontWeigh
84
86
  node: NormalizedTypePropertiesTrait & NormalizedIsLayerTrait,
85
87
  ) => string | TFontDimension | undefined;
86
88
  };
89
+ getTextStyleValue: (
90
+ node: NormalizedTypePropertiesTrait & NormalizedIsLayerTrait,
91
+ ) => string | undefined; // TODO: we might turn this into a generic; not sure yet
87
92
  }
88
93
 
89
- export interface ValueTransformerDeps<TColor, TDimension, TFontDimension, TFontWeight> {
94
+ export interface ValueResolverDeps<TColor, TDimension, TFontDimension, TFontWeight> {
90
95
  variableService: VariableService;
91
- formatters: {
96
+ variableNameFormatter: (props: { slug: string[] }) => string;
97
+ styleService: StyleService;
98
+ styleNameFormatter: (props: { slug: string[] }) => string;
99
+ rawValueFormatters: {
92
100
  color: (value: RGBA) => string | TColor;
93
101
  dimension: (value: number) => string | TDimension;
94
102
  fontDimension: (value: number) => string | TFontDimension;
95
103
  fontWeight: (value: number) => string | TFontWeight;
96
104
  };
97
- shouldInferVariableName: boolean;
98
105
  }
99
106
 
100
- export function createValueTransformer<TColor, TDimension, TFontDimension, TFontWeight>({
107
+ export function createValueResolver<TColor, TDimension, TFontDimension, TFontWeight>({
101
108
  variableService,
102
- formatters,
103
- shouldInferVariableName,
104
- }: ValueTransformerDeps<TColor, TDimension, TFontDimension, TFontWeight>): ValueTransformer<
109
+ variableNameFormatter,
110
+ styleService,
111
+ styleNameFormatter,
112
+ rawValueFormatters,
113
+ }: ValueResolverDeps<TColor, TDimension, TFontDimension, TFontWeight>): ValueResolver<
105
114
  TColor,
106
115
  TDimension,
107
116
  TFontDimension,
108
117
  TFontWeight
109
118
  > {
119
+ function getVariableName(key: string) {
120
+ const slug = variableService.getSlug(key);
121
+
122
+ if (!slug) {
123
+ return undefined;
124
+ }
125
+
126
+ return variableNameFormatter({ slug });
127
+ }
128
+
129
+ function inferVariableName(value: VariableValueResolved, scope: VariableScope) {
130
+ const { shouldInferVariableName } = useCodegenOptions();
131
+
132
+ if (!shouldInferVariableName) {
133
+ return undefined;
134
+ }
135
+
136
+ const inferred = variableService.infer(value, scope);
137
+
138
+ if (!inferred) {
139
+ return undefined;
140
+ }
141
+
142
+ return getVariableName(inferred.key);
143
+ }
144
+
145
+ function getStyleName(key: string) {
146
+ const slug = styleService.getSlug(key);
147
+
148
+ if (!slug) {
149
+ return undefined;
150
+ }
151
+
152
+ return styleNameFormatter({ slug });
153
+ }
154
+
110
155
  function processColor(
111
156
  key: string | undefined,
112
157
  value: RGBA | undefined,
113
158
  scope: "FRAME_FILL" | "SHAPE_FILL" | "STROKE_COLOR" | "TEXT_FILL",
114
159
  ) {
115
160
  if (key) {
116
- return variableService.getVariableName(key);
161
+ return getVariableName(key);
117
162
  }
118
163
 
119
- if (value) {
120
- if (shouldInferVariableName) {
121
- return variableService.inferVariableName(value, scope) ?? formatters.color(value);
122
- }
123
-
124
- return formatters.color(value);
164
+ if (value !== undefined) {
165
+ return inferVariableName(value, scope) ?? rawValueFormatters.color(value);
125
166
  }
126
167
 
127
168
  return undefined;
@@ -133,15 +174,11 @@ export function createValueTransformer<TColor, TDimension, TFontDimension, TFont
133
174
  scope: "WIDTH_HEIGHT" | "GAP" | "CORNER_RADIUS",
134
175
  ) {
135
176
  if (key) {
136
- return variableService.getVariableName(key);
177
+ return getVariableName(key);
137
178
  }
138
179
 
139
- if (value) {
140
- if (shouldInferVariableName) {
141
- return variableService.inferVariableName(value, scope) ?? formatters.dimension(value);
142
- }
143
-
144
- return formatters.dimension(value);
180
+ if (value !== undefined) {
181
+ return inferVariableName(value, scope) ?? rawValueFormatters.dimension(value);
145
182
  }
146
183
 
147
184
  return undefined;
@@ -153,15 +190,11 @@ export function createValueTransformer<TColor, TDimension, TFontDimension, TFont
153
190
  scope: "FONT_SIZE" | "LINE_HEIGHT",
154
191
  ) {
155
192
  if (key) {
156
- return variableService.getVariableName(key);
193
+ return getVariableName(key);
157
194
  }
158
195
 
159
- if (value) {
160
- if (shouldInferVariableName) {
161
- return variableService.inferVariableName(value, scope) ?? formatters.fontDimension(value);
162
- }
163
-
164
- return formatters.fontDimension(value);
196
+ if (value !== undefined) {
197
+ return inferVariableName(value, scope) ?? rawValueFormatters.fontDimension(value);
165
198
  }
166
199
 
167
200
  return undefined;
@@ -169,37 +202,33 @@ export function createValueTransformer<TColor, TDimension, TFontDimension, TFont
169
202
 
170
203
  function processFontWeight(key: string | undefined, value: number | undefined) {
171
204
  if (key) {
172
- return variableService.getVariableName(key);
205
+ return getVariableName(key);
173
206
  }
174
207
 
175
- if (value) {
176
- if (shouldInferVariableName) {
177
- const fontWeightToString: Record<number, string> = {
178
- 100: "thin",
179
- 200: "extra-light",
180
- 300: "light",
181
- 400: "regular",
182
- 500: "medium",
183
- 600: "semi-bold",
184
- 700: "bold",
185
- 800: "extra-bold",
186
- 900: "black",
187
- };
208
+ if (value !== undefined) {
209
+ const fontWeightToString: Record<number, string> = {
210
+ 100: "thin",
211
+ 200: "extra-light",
212
+ 300: "light",
213
+ 400: "regular",
214
+ 500: "medium",
215
+ 600: "semi-bold",
216
+ 700: "bold",
217
+ 800: "extra-bold",
218
+ 900: "black",
219
+ };
188
220
 
189
- return (
190
- variableService.inferVariableName(value, "FONT_WEIGHT") ??
191
- variableService.inferVariableName(fontWeightToString[value], "FONT_STYLE") ??
192
- formatters.fontWeight(value)
193
- );
194
- }
195
-
196
- return formatters.fontWeight(value);
221
+ return (
222
+ inferVariableName(value, "FONT_WEIGHT") ??
223
+ inferVariableName(fontWeightToString[value], "FONT_STYLE") ??
224
+ rawValueFormatters.fontWeight(value)
225
+ );
197
226
  }
198
227
 
199
228
  return undefined;
200
229
  }
201
230
 
202
- const getFormattedValue: ValueTransformer<
231
+ const getFormattedValue: ValueResolver<
203
232
  TColor,
204
233
  TDimension,
205
234
  TFontDimension,
@@ -283,7 +312,16 @@ export function createValueTransformer<TColor, TDimension, TFontDimension, TFont
283
312
  ),
284
313
  };
285
314
 
315
+ function getTextStyleValue(node: NormalizedTypePropertiesTrait & NormalizedIsLayerTrait) {
316
+ if (node.textStyleKey) {
317
+ return getStyleName(node.textStyleKey);
318
+ }
319
+
320
+ return undefined;
321
+ }
322
+
286
323
  return {
287
324
  getFormattedValue,
325
+ getTextStyleValue,
288
326
  };
289
327
  }
@@ -0,0 +1,44 @@
1
+ import {
2
+ createIconService,
3
+ createStyleService,
4
+ createVariableService,
5
+ iconRepository,
6
+ styleRepository,
7
+ variableRepository,
8
+ } from "@/entities";
9
+
10
+ export const styleService = createStyleService({
11
+ styleRepository,
12
+ });
13
+ export const variableService = createVariableService({
14
+ variableRepository,
15
+ inferCompareFunction: (a, b) => {
16
+ const scoreFn = (name: string) => {
17
+ let score = 0;
18
+ if (name.includes("bg")) {
19
+ score += 100;
20
+ }
21
+ if (name.includes("fg")) {
22
+ score += 100;
23
+ }
24
+ if (name.includes("stroke")) {
25
+ score += 100;
26
+ }
27
+ if (name.includes("spacing-x")) {
28
+ score -= 100;
29
+ }
30
+ if (name.includes("spacing-y")) {
31
+ score -= 100;
32
+ }
33
+ if (name.endsWith("pressed")) {
34
+ score -= 100;
35
+ }
36
+ return score;
37
+ };
38
+
39
+ return scoreFn(b.name) - scoreFn(a.name);
40
+ },
41
+ });
42
+ export const iconService = createIconService({
43
+ iconRepository,
44
+ });
@@ -1,46 +1,3 @@
1
+ export * from "./component-properties";
1
2
  export * from "./core";
2
3
  export * from "./targets";
3
-
4
- import type { NormalizedSceneNode } from "@/normalizer";
5
- import { stringifyElement } from "./core/jsx";
6
- import { figma, react } from "./targets";
7
-
8
- export function generateJsxTree(
9
- node: NormalizedSceneNode,
10
- options: Partial<react.CreateContextOptions> = {},
11
- ) {
12
- const { shouldInferVariableName = true, shouldInferAutoLayout = true } = options;
13
- const codegen = react.createContext({
14
- shouldInferVariableName,
15
- shouldInferAutoLayout,
16
- });
17
-
18
- return codegen(node);
19
- }
20
-
21
- export function generateCode(
22
- node: NormalizedSceneNode,
23
- options: Partial<react.CreateContextOptions> & { shouldPrintSource?: boolean } = {},
24
- ) {
25
- const result = generateJsxTree(node, options);
26
- return result ? stringifyElement(result, { printSource: options.shouldPrintSource }) : undefined;
27
- }
28
-
29
- export function generateFigmaSummary(
30
- node: NormalizedSceneNode,
31
- options: Partial<figma.CreateContextOptions> & { shouldPrintSource?: boolean } = {},
32
- ) {
33
- const {
34
- shouldInferVariableName = false,
35
- shouldPrintSource = false,
36
- shouldInferAutoLayout = false,
37
- } = options;
38
- const codegen = figma.createContext({
39
- shouldInferVariableName,
40
- shouldInferAutoLayout,
41
- });
42
-
43
- const result = codegen(node);
44
-
45
- return result ? stringifyElement(result, { printSource: shouldPrintSource }) : undefined;
46
- }
@@ -4,14 +4,14 @@ import type {
4
4
  NormalizedInstanceNode,
5
5
  } from "@/normalizer";
6
6
  import { createElement, defineElementTransformer, type ElementTransformer } from "../../core";
7
- import type { PropsTransformers } from "./props";
7
+ import type { PropsConverters } from "./props";
8
8
 
9
9
  export interface FrameTransformerDeps {
10
- propsTransformers: PropsTransformers;
10
+ propsConverters: PropsConverters;
11
11
  }
12
12
 
13
13
  export function createFrameTransformer({
14
- propsTransformers,
14
+ propsConverters,
15
15
  }: FrameTransformerDeps): ElementTransformer<
16
16
  NormalizedFrameNode | NormalizedInstanceNode | NormalizedComponentNode
17
17
  > {
@@ -20,11 +20,11 @@ export function createFrameTransformer({
20
20
  const children = node.children;
21
21
 
22
22
  const props = {
23
- ...propsTransformers.radius(node, traverse),
24
- ...propsTransformers.containerLayout(node, traverse),
25
- ...propsTransformers.selfLayout(node, traverse),
26
- ...propsTransformers.frameFill(node, traverse),
27
- ...propsTransformers.stroke(node, traverse),
23
+ ...propsConverters.radius(node),
24
+ ...propsConverters.containerLayout(node),
25
+ ...propsConverters.selfLayout(node),
26
+ ...propsConverters.frameFill(node),
27
+ ...propsConverters.stroke(node),
28
28
  };
29
29
 
30
30
  return createElement(
@@ -1,4 +1,4 @@
1
- export * from "./context";
1
+ export * from "./pipeline";
2
2
  export * from "./frame";
3
3
  export * from "./instance";
4
4
  export * from "./props";
@@ -0,0 +1,71 @@
1
+ import { createCodeGenerator } from "@/codegen/core";
2
+ import { createFrameTransformer } from "./frame";
3
+ import { createInstanceTransformer } from "./instance";
4
+ import {
5
+ createContainerLayoutPropsConverter,
6
+ createFrameFillPropsConverter,
7
+ createRadiusPropsConverter,
8
+ createSelfLayoutPropsConverter,
9
+ createShapeFillPropsConverter,
10
+ createStrokePropsConverter,
11
+ createTextFillPropsConverter,
12
+ createTypeStylePropsConverter,
13
+ } from "./props";
14
+ import {
15
+ createBooleanOperationTransformer,
16
+ createRectangleTransformer,
17
+ createVectorTransformer,
18
+ } from "./shape";
19
+ import { createTextTransformer } from "./text";
20
+ import { valueResolver } from "./value-resolver";
21
+
22
+ export function createPipeline() {
23
+ const containerLayoutPropsConverter = createContainerLayoutPropsConverter(valueResolver);
24
+ const selfLayoutPropsConverter = createSelfLayoutPropsConverter(valueResolver);
25
+ const frameFillPropsConverter = createFrameFillPropsConverter(valueResolver);
26
+ const shapeFillPropsConverter = createShapeFillPropsConverter(valueResolver);
27
+ const textFillPropsConverter = createTextFillPropsConverter(valueResolver);
28
+ const radiusPropsConverter = createRadiusPropsConverter(valueResolver);
29
+ const strokePropsConverter = createStrokePropsConverter(valueResolver);
30
+ const typeStylePropsConverter = createTypeStylePropsConverter(valueResolver);
31
+ const propsConverters = {
32
+ containerLayout: containerLayoutPropsConverter,
33
+ selfLayout: selfLayoutPropsConverter,
34
+ frameFill: frameFillPropsConverter,
35
+ shapeFill: shapeFillPropsConverter,
36
+ textFill: textFillPropsConverter,
37
+ radius: radiusPropsConverter,
38
+ stroke: strokePropsConverter,
39
+ typeStyle: typeStylePropsConverter,
40
+ };
41
+
42
+ const frameTransformer = createFrameTransformer({
43
+ propsConverters,
44
+ });
45
+ const instanceTransformer = createInstanceTransformer({
46
+ frameTransformer,
47
+ });
48
+ const textTransformer = createTextTransformer({
49
+ propsConverters,
50
+ });
51
+ const rectangleTransformer = createRectangleTransformer({
52
+ propsConverters,
53
+ });
54
+ const vectorTransformer = createVectorTransformer({
55
+ propsConverters,
56
+ });
57
+ const booleanOperationTransformer = createBooleanOperationTransformer({
58
+ propsConverters,
59
+ });
60
+
61
+ const codegenTransformer = createCodeGenerator({
62
+ frameTransformer,
63
+ textTransformer,
64
+ rectangleTransformer,
65
+ instanceTransformer,
66
+ vectorTransformer,
67
+ booleanOperationTransformer,
68
+ });
69
+
70
+ return codegenTransformer;
71
+ }
@@ -1,10 +1,4 @@
1
- import {
2
- createPropsTransformer,
3
- definePropsTransformer,
4
- type PropsTransformer,
5
- type ValueTransformer,
6
- } from "@/codegen/core";
7
- import type { StyleService } from "@/entities";
1
+ import { createPropsConverter, definePropsConverter, type PropsConverter } from "@/codegen/core";
8
2
  import type {
9
3
  NormalizedCornerTrait,
10
4
  NormalizedHasChildrenTrait,
@@ -14,16 +8,17 @@ import type {
14
8
  NormalizedIsLayerTrait,
15
9
  NormalizedTypePropertiesTrait,
16
10
  } from "@/normalizer";
17
-
18
- export interface PropsTransformers {
19
- containerLayout: PropsTransformer<ContainerLayoutTrait, ContainerLayoutProps>;
20
- selfLayout: PropsTransformer<SelfLayoutTrait, SelfLayoutProps>;
21
- radius: PropsTransformer<RadiusTrait, RadiusProps>;
22
- frameFill: PropsTransformer<FillTrait, FillProps>;
23
- shapeFill: PropsTransformer<FillTrait, FillProps>;
24
- textFill: PropsTransformer<FillTrait, FillProps>;
25
- stroke: PropsTransformer<StrokeTrait, StrokeProps>;
26
- typeStyle: PropsTransformer<TypeStyleTrait, TypeStyleProps>;
11
+ import type { FigmaValueResolver } from "./value-resolver";
12
+
13
+ export interface PropsConverters {
14
+ containerLayout: PropsConverter<ContainerLayoutTrait, ContainerLayoutProps>;
15
+ selfLayout: PropsConverter<SelfLayoutTrait, SelfLayoutProps>;
16
+ radius: PropsConverter<RadiusTrait, RadiusProps>;
17
+ frameFill: PropsConverter<FillTrait, FillProps>;
18
+ shapeFill: PropsConverter<FillTrait, FillProps>;
19
+ textFill: PropsConverter<FillTrait, FillProps>;
20
+ stroke: PropsConverter<StrokeTrait, StrokeProps>;
21
+ typeStyle: PropsConverter<TypeStyleTrait, TypeStyleProps>;
27
22
  }
28
23
 
29
24
  export type ContainerLayoutTrait = NormalizedHasFramePropertiesTrait &
@@ -55,12 +50,10 @@ export interface ContainerLayoutProps {
55
50
  verticalPadding?: number | string; // string when variable
56
51
  }
57
52
 
58
- type FigmaValueTransformer = ValueTransformer<string, number, number, number>;
59
-
60
- export function createContainerLayoutPropsTransformer(
61
- valueTransformer: FigmaValueTransformer,
62
- ): PropsTransformer<ContainerLayoutTrait, ContainerLayoutProps> {
63
- return createPropsTransformer({
53
+ export function createContainerLayoutPropsConverter(
54
+ valueResolver: FigmaValueResolver,
55
+ ): PropsConverter<ContainerLayoutTrait, ContainerLayoutProps> {
56
+ return createPropsConverter({
64
57
  _types: {
65
58
  trait: {} as ContainerLayoutTrait,
66
59
  props: {} as ContainerLayoutProps,
@@ -70,11 +63,11 @@ export function createContainerLayoutPropsTransformer(
70
63
  primaryAxisAlignItems: ({ primaryAxisAlignItems }) => primaryAxisAlignItems,
71
64
  counterAxisAlignItems: ({ counterAxisAlignItems }) => counterAxisAlignItems,
72
65
  layoutWrap: ({ layoutWrap }) => layoutWrap,
73
- itemSpacing: ({ itemSpacing }) => itemSpacing,
74
- paddingTop: (node) => valueTransformer.getFormattedValue.paddingTop(node),
75
- paddingBottom: (node) => valueTransformer.getFormattedValue.paddingBottom(node),
76
- paddingLeft: (node) => valueTransformer.getFormattedValue.paddingLeft(node),
77
- paddingRight: (node) => valueTransformer.getFormattedValue.paddingRight(node),
66
+ itemSpacing: (node) => valueResolver.getFormattedValue.itemSpacing(node),
67
+ paddingTop: (node) => valueResolver.getFormattedValue.paddingTop(node),
68
+ paddingBottom: (node) => valueResolver.getFormattedValue.paddingBottom(node),
69
+ paddingLeft: (node) => valueResolver.getFormattedValue.paddingLeft(node),
70
+ paddingRight: (node) => valueResolver.getFormattedValue.paddingRight(node),
78
71
  },
79
72
  shorthands: {
80
73
  horizontalPadding: ["paddingLeft", "paddingRight"],
@@ -97,10 +90,10 @@ export interface SelfLayoutProps {
97
90
  maxHeight?: string | number; // string when variable
98
91
  }
99
92
 
100
- export function createSelfLayoutPropsTransformer(
101
- valueTransformer: FigmaValueTransformer,
102
- ): PropsTransformer<SelfLayoutTrait, SelfLayoutProps> {
103
- return createPropsTransformer({
93
+ export function createSelfLayoutPropsConverter(
94
+ valueResolver: FigmaValueResolver,
95
+ ): PropsConverter<SelfLayoutTrait, SelfLayoutProps> {
96
+ return createPropsConverter({
104
97
  _types: {
105
98
  trait: {} as SelfLayoutTrait,
106
99
  props: {} as SelfLayoutProps,
@@ -110,12 +103,12 @@ export function createSelfLayoutPropsTransformer(
110
103
  layoutAlign: ({ layoutAlign }) => layoutAlign,
111
104
  layoutSizingVertical: ({ layoutSizingVertical }) => layoutSizingVertical,
112
105
  layoutSizingHorizontal: ({ layoutSizingHorizontal }) => layoutSizingHorizontal,
113
- width: (node) => valueTransformer.getFormattedValue.width(node),
114
- height: (node) => valueTransformer.getFormattedValue.height(node),
115
- minWidth: (node) => valueTransformer.getFormattedValue.minWidth(node),
116
- minHeight: (node) => valueTransformer.getFormattedValue.minHeight(node),
117
- maxWidth: (node) => valueTransformer.getFormattedValue.maxWidth(node),
118
- maxHeight: (node) => valueTransformer.getFormattedValue.maxHeight(node),
106
+ width: (node) => valueResolver.getFormattedValue.width(node),
107
+ height: (node) => valueResolver.getFormattedValue.height(node),
108
+ minWidth: (node) => valueResolver.getFormattedValue.minWidth(node),
109
+ minHeight: (node) => valueResolver.getFormattedValue.minHeight(node),
110
+ maxWidth: (node) => valueResolver.getFormattedValue.maxWidth(node),
111
+ maxHeight: (node) => valueResolver.getFormattedValue.maxHeight(node),
119
112
  },
120
113
  defaults: {},
121
114
  });
@@ -129,17 +122,17 @@ export interface RadiusProps {
129
122
  bottomRightRadius?: number | string; // string when variable
130
123
  }
131
124
 
132
- export function createRadiusPropsTransformer(valueTransformer: FigmaValueTransformer) {
133
- return createPropsTransformer({
125
+ export function createRadiusPropsConverter(valueResolver: FigmaValueResolver) {
126
+ return createPropsConverter({
134
127
  _types: {
135
128
  trait: {} as RadiusTrait,
136
129
  props: {} as RadiusProps,
137
130
  },
138
131
  handlers: {
139
- topLeftRadius: (node) => valueTransformer.getFormattedValue.topLeftRadius(node),
140
- topRightRadius: (node) => valueTransformer.getFormattedValue.topRightRadius(node),
141
- bottomLeftRadius: (node) => valueTransformer.getFormattedValue.bottomLeftRadius(node),
142
- bottomRightRadius: (node) => valueTransformer.getFormattedValue.bottomRightRadius(node),
132
+ topLeftRadius: (node) => valueResolver.getFormattedValue.topLeftRadius(node),
133
+ topRightRadius: (node) => valueResolver.getFormattedValue.topRightRadius(node),
134
+ bottomLeftRadius: (node) => valueResolver.getFormattedValue.bottomLeftRadius(node),
135
+ bottomRightRadius: (node) => valueResolver.getFormattedValue.bottomRightRadius(node),
143
136
  },
144
137
  shorthands: {
145
138
  cornerRadius: ["topLeftRadius", "topRightRadius", "bottomLeftRadius", "bottomRightRadius"],
@@ -158,9 +151,9 @@ export interface FillProps {
158
151
  fill?: string;
159
152
  }
160
153
 
161
- export function createFrameFillPropsTransformer(valueTransformer: FigmaValueTransformer) {
162
- return definePropsTransformer<FillTrait, FillProps>((node: FillTrait) => {
163
- const fill = valueTransformer.getFormattedValue.frameFill(node);
154
+ export function createFrameFillPropsConverter(valueResolver: FigmaValueResolver) {
155
+ return definePropsConverter<FillTrait, FillProps>((node: FillTrait) => {
156
+ const fill = valueResolver.getFormattedValue.frameFill(node);
164
157
 
165
158
  return {
166
159
  fill,
@@ -168,9 +161,9 @@ export function createFrameFillPropsTransformer(valueTransformer: FigmaValueTran
168
161
  });
169
162
  }
170
163
 
171
- export function createShapeFillPropsTransformer(valueTransformer: FigmaValueTransformer) {
172
- return definePropsTransformer<FillTrait, FillProps>((node: FillTrait) => {
173
- const fill = valueTransformer.getFormattedValue.shapeFill(node);
164
+ export function createShapeFillPropsConverter(valueResolver: FigmaValueResolver) {
165
+ return definePropsConverter<FillTrait, FillProps>((node: FillTrait) => {
166
+ const fill = valueResolver.getFormattedValue.shapeFill(node);
174
167
 
175
168
  return {
176
169
  fill,
@@ -178,9 +171,9 @@ export function createShapeFillPropsTransformer(valueTransformer: FigmaValueTran
178
171
  });
179
172
  }
180
173
 
181
- export function createTextFillPropsTransformer(valueTransformer: FigmaValueTransformer) {
182
- return definePropsTransformer<FillTrait, FillProps>((node: FillTrait) => {
183
- const fill = valueTransformer.getFormattedValue.textFill(node);
174
+ export function createTextFillPropsConverter(valueResolver: FigmaValueResolver) {
175
+ return definePropsConverter<FillTrait, FillProps>((node: FillTrait) => {
176
+ const fill = valueResolver.getFormattedValue.textFill(node);
184
177
 
185
178
  return {
186
179
  fill,
@@ -193,11 +186,11 @@ export interface StrokeProps {
193
186
  strokeWeight?: number;
194
187
  }
195
188
 
196
- export function createStrokePropsTransformer(
197
- valueTransformer: FigmaValueTransformer,
198
- ): PropsTransformer<StrokeTrait, StrokeProps> {
199
- return definePropsTransformer((node: StrokeTrait) => {
200
- const stroke = valueTransformer.getFormattedValue.stroke(node);
189
+ export function createStrokePropsConverter(
190
+ valueResolver: FigmaValueResolver,
191
+ ): PropsConverter<StrokeTrait, StrokeProps> {
192
+ return definePropsConverter((node: StrokeTrait) => {
193
+ const stroke = valueResolver.getFormattedValue.stroke(node);
201
194
  const strokeWeight = node.strokeWeight;
202
195
 
203
196
  return {
@@ -215,15 +208,11 @@ export interface TypeStyleProps {
215
208
  maxLines?: number;
216
209
  }
217
210
 
218
- export function createTypeStylePropsTransformer({
219
- valueTransformer,
220
- styleService,
221
- }: {
222
- valueTransformer: FigmaValueTransformer;
223
- styleService: StyleService;
224
- }): PropsTransformer<TypeStyleTrait, TypeStyleProps> {
225
- return definePropsTransformer((node) => {
226
- const styleName = node.textStyleKey ? styleService.getStyleName(node.textStyleKey) : undefined;
211
+ export function createTypeStylePropsConverter(
212
+ valueResolver: FigmaValueResolver,
213
+ ): PropsConverter<TypeStyleTrait, TypeStyleProps> {
214
+ return definePropsConverter((node) => {
215
+ const styleName = valueResolver.getTextStyleValue(node);
227
216
  const maxLines =
228
217
  node.style.textTruncation === "ENDING" ? (node.style.maxLines ?? undefined) : undefined;
229
218
 
@@ -235,9 +224,9 @@ export function createTypeStylePropsTransformer({
235
224
  }
236
225
 
237
226
  return {
238
- fontSize: valueTransformer.getFormattedValue.fontSize(node),
239
- fontWeight: valueTransformer.getFormattedValue.fontWeight(node),
240
- lineHeight: valueTransformer.getFormattedValue.lineHeight(node),
227
+ fontSize: valueResolver.getFormattedValue.fontSize(node),
228
+ fontWeight: valueResolver.getFormattedValue.fontWeight(node),
229
+ lineHeight: valueResolver.getFormattedValue.lineHeight(node),
241
230
  maxLines,
242
231
  };
243
232
  });