@seed-design/figma 0.0.4 → 0.0.5

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 (211) hide show
  1. package/lib/index.cjs +10589 -12261
  2. package/lib/index.d.ts +1732 -41
  3. package/lib/index.js +10565 -12262
  4. package/package.json +2 -2
  5. package/src/codegen/context.ts +148 -0
  6. package/src/{component/type-helper.ts → codegen/core/component.ts} +1 -12
  7. package/src/codegen/core/index.ts +14 -0
  8. package/src/{jsx.ts → codegen/core/jsx.ts} +13 -3
  9. package/src/codegen/core/transformer.ts +40 -0
  10. package/src/{data → codegen/data}/icons.ts +2 -6
  11. package/src/{data → codegen/data}/styles.ts +87 -29
  12. package/src/codegen/data/variable-collections.ts +310 -0
  13. package/src/{data → codegen/data}/variables.ts +2821 -5887
  14. package/src/codegen/domain/codegen.service.ts +69 -0
  15. package/src/codegen/domain/figma-component.service.ts +21 -0
  16. package/src/codegen/domain/frame.service.ts +108 -0
  17. package/src/codegen/domain/icon.interface.ts +5 -0
  18. package/src/codegen/domain/icon.repository.ts +11 -0
  19. package/src/codegen/domain/icon.service.ts +35 -0
  20. package/src/codegen/domain/index.ts +22 -0
  21. package/src/codegen/domain/instance.service.ts +91 -0
  22. package/src/codegen/domain/props/container-layout-props.service.ts +248 -0
  23. package/src/codegen/domain/props/fill-props.service.ts +75 -0
  24. package/src/codegen/domain/props/radius-props.service.ts +105 -0
  25. package/src/codegen/domain/props/self-layout-props.service.ts +127 -0
  26. package/src/codegen/domain/props/stroke-props.service.ts +45 -0
  27. package/src/codegen/domain/props/type-style-props.service.ts +31 -0
  28. package/src/codegen/domain/rectangle.service.ts +31 -0
  29. package/src/codegen/domain/seed-component/deps.interface.ts +6 -0
  30. package/src/codegen/domain/seed-component/index.ts +75 -0
  31. package/src/{component/type.ts → codegen/domain/seed-component/properties.type.ts} +2 -2
  32. package/src/{component/properties.ts → codegen/domain/seed-component/size.ts} +4 -2
  33. package/src/codegen/domain/seed-component/transformers/action-button.ts +69 -0
  34. package/src/codegen/domain/seed-component/transformers/action-chip.ts +82 -0
  35. package/src/codegen/domain/seed-component/transformers/action-sheet.ts +78 -0
  36. package/src/{component/handlers → codegen/domain/seed-component/transformers}/app-bar.ts +114 -111
  37. package/src/codegen/domain/seed-component/transformers/avatar-stack.ts +30 -0
  38. package/src/codegen/domain/seed-component/transformers/avatar.ts +39 -0
  39. package/src/codegen/domain/seed-component/transformers/badge.ts +22 -0
  40. package/src/codegen/domain/seed-component/transformers/callout.ts +90 -0
  41. package/src/codegen/domain/seed-component/transformers/checkbox.ts +34 -0
  42. package/src/codegen/domain/seed-component/transformers/chip-tabs.ts +55 -0
  43. package/src/codegen/domain/seed-component/transformers/control-chip.ts +86 -0
  44. package/src/codegen/domain/seed-component/transformers/error-state.ts +39 -0
  45. package/src/codegen/domain/seed-component/transformers/extended-action-sheet.ts +99 -0
  46. package/src/codegen/domain/seed-component/transformers/extended-fab.ts +25 -0
  47. package/src/codegen/domain/seed-component/transformers/fab.ts +18 -0
  48. package/src/codegen/domain/seed-component/transformers/help-bubble.ts +68 -0
  49. package/src/codegen/domain/seed-component/transformers/identity-placeholder.ts +18 -0
  50. package/src/{component/handlers → codegen/domain/seed-component/transformers}/inline-banner.ts +11 -13
  51. package/src/codegen/domain/seed-component/transformers/manner-temp-badge.ts +19 -0
  52. package/src/codegen/domain/seed-component/transformers/multiline-text-field.ts +82 -0
  53. package/src/codegen/domain/seed-component/transformers/progress-circle.ts +51 -0
  54. package/src/codegen/domain/seed-component/transformers/reaction-button.ts +37 -0
  55. package/src/codegen/domain/seed-component/transformers/segmented-control.ts +59 -0
  56. package/src/codegen/domain/seed-component/transformers/select-box.ts +82 -0
  57. package/src/codegen/domain/seed-component/transformers/skeleton.ts +52 -0
  58. package/src/codegen/domain/seed-component/transformers/snackbar.ts +23 -0
  59. package/src/codegen/domain/seed-component/transformers/switch.ts +31 -0
  60. package/src/codegen/domain/seed-component/transformers/tabs.ts +129 -0
  61. package/src/{component/handlers → codegen/domain/seed-component/transformers}/text-button.ts +16 -18
  62. package/src/codegen/domain/seed-component/transformers/text-field.ts +109 -0
  63. package/src/codegen/domain/seed-component/transformers/toggle-button.ts +47 -0
  64. package/src/codegen/domain/style.interface.ts +5 -0
  65. package/src/codegen/domain/style.repository.ts +23 -0
  66. package/src/codegen/domain/style.service.ts +38 -0
  67. package/src/codegen/domain/text.service.ts +62 -0
  68. package/src/codegen/domain/variable.interface.ts +18 -0
  69. package/src/codegen/domain/variable.repository.ts +44 -0
  70. package/src/codegen/domain/variable.service.ts +95 -0
  71. package/src/codegen/index.ts +13 -0
  72. package/src/index.ts +2 -2
  73. package/src/normalizer/from-plugin.ts +29 -28
  74. package/src/normalizer/from-rest.ts +5 -1
  75. package/src/normalizer/types.ts +80 -32
  76. package/src/utils/common.ts +19 -0
  77. package/src/utils/css.ts +13 -0
  78. package/src/utils/figma-variable.ts +13 -0
  79. package/src/component/handlers/action-button.ts +0 -66
  80. package/src/component/handlers/action-chip.ts +0 -71
  81. package/src/component/handlers/action-sheet.ts +0 -74
  82. package/src/component/handlers/avatar-stack.ts +0 -35
  83. package/src/component/handlers/avatar.ts +0 -37
  84. package/src/component/handlers/badge.ts +0 -20
  85. package/src/component/handlers/callout.ts +0 -87
  86. package/src/component/handlers/checkbox.ts +0 -32
  87. package/src/component/handlers/chip-tabs.ts +0 -51
  88. package/src/component/handlers/control-chip.ts +0 -75
  89. package/src/component/handlers/error-state.ts +0 -37
  90. package/src/component/handlers/extended-action-sheet.ts +0 -86
  91. package/src/component/handlers/extended-fab.ts +0 -24
  92. package/src/component/handlers/fab.ts +0 -17
  93. package/src/component/handlers/help-bubble.ts +0 -66
  94. package/src/component/handlers/identity-placeholder.ts +0 -16
  95. package/src/component/handlers/manner-temp-badge.ts +0 -17
  96. package/src/component/handlers/multiline-text-field.ts +0 -80
  97. package/src/component/handlers/progress-circle.ts +0 -49
  98. package/src/component/handlers/reaction-button.ts +0 -36
  99. package/src/component/handlers/segmented-control.ts +0 -51
  100. package/src/component/handlers/select-box.ts +0 -76
  101. package/src/component/handlers/skeleton.ts +0 -51
  102. package/src/component/handlers/snackbar.ts +0 -21
  103. package/src/component/handlers/switch.ts +0 -29
  104. package/src/component/handlers/tabs.ts +0 -107
  105. package/src/component/handlers/text-field.ts +0 -108
  106. package/src/component/handlers/toggle-button.ts +0 -44
  107. package/src/component/index.ts +0 -76
  108. package/src/generate-code.ts +0 -251
  109. package/src/icon.ts +0 -46
  110. package/src/layout.ts +0 -31
  111. package/src/props/color.ts +0 -78
  112. package/src/props/layout.ts +0 -292
  113. package/src/props/sizing.ts +0 -58
  114. package/src/props/text.ts +0 -21
  115. package/src/props/variable.ts +0 -66
  116. /package/src/{data → codegen/data}/__generated__/component-sets/action-button.d.ts +0 -0
  117. /package/src/{data → codegen/data}/__generated__/component-sets/action-button.mjs +0 -0
  118. /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.d.ts +0 -0
  119. /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.mjs +0 -0
  120. /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.d.ts +0 -0
  121. /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.mjs +0 -0
  122. /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.d.ts +0 -0
  123. /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.mjs +0 -0
  124. /package/src/{data → codegen/data}/__generated__/component-sets/avatar.d.ts +0 -0
  125. /package/src/{data → codegen/data}/__generated__/component-sets/avatar.mjs +0 -0
  126. /package/src/{data → codegen/data}/__generated__/component-sets/badge.d.ts +0 -0
  127. /package/src/{data → codegen/data}/__generated__/component-sets/badge.mjs +0 -0
  128. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.d.ts +0 -0
  129. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.mjs +0 -0
  130. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.d.ts +0 -0
  131. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.mjs +0 -0
  132. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.d.ts +0 -0
  133. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.mjs +0 -0
  134. /package/src/{data → codegen/data}/__generated__/component-sets/callout.d.ts +0 -0
  135. /package/src/{data → codegen/data}/__generated__/component-sets/callout.mjs +0 -0
  136. /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.d.ts +0 -0
  137. /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.mjs +0 -0
  138. /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.d.ts +0 -0
  139. /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.mjs +0 -0
  140. /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.d.ts +0 -0
  141. /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.mjs +0 -0
  142. /package/src/{data → codegen/data}/__generated__/component-sets/divider.d.ts +0 -0
  143. /package/src/{data → codegen/data}/__generated__/component-sets/divider.mjs +0 -0
  144. /package/src/{data → codegen/data}/__generated__/component-sets/error-state.d.ts +0 -0
  145. /package/src/{data → codegen/data}/__generated__/component-sets/error-state.mjs +0 -0
  146. /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.d.ts +0 -0
  147. /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.mjs +0 -0
  148. /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.d.ts +0 -0
  149. /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.mjs +0 -0
  150. /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.d.ts +0 -0
  151. /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.mjs +0 -0
  152. /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.d.ts +0 -0
  153. /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.mjs +0 -0
  154. /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.d.ts +0 -0
  155. /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.mjs +0 -0
  156. /package/src/{data → codegen/data}/__generated__/component-sets/index.d.ts +0 -0
  157. /package/src/{data → codegen/data}/__generated__/component-sets/index.mjs +0 -0
  158. /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.d.ts +0 -0
  159. /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.mjs +0 -0
  160. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.d.ts +0 -0
  161. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.mjs +0 -0
  162. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.d.ts +0 -0
  163. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.mjs +0 -0
  164. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.d.ts +0 -0
  165. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.mjs +0 -0
  166. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.d.ts +0 -0
  167. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.mjs +0 -0
  168. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.d.ts +0 -0
  169. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.mjs +0 -0
  170. /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.d.ts +0 -0
  171. /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.mjs +0 -0
  172. /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.d.ts +0 -0
  173. /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.mjs +0 -0
  174. /package/src/{data → codegen/data}/__generated__/component-sets/radio.d.ts +0 -0
  175. /package/src/{data → codegen/data}/__generated__/component-sets/radio.mjs +0 -0
  176. /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.d.ts +0 -0
  177. /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.mjs +0 -0
  178. /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.d.ts +0 -0
  179. /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.mjs +0 -0
  180. /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.d.ts +0 -0
  181. /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.mjs +0 -0
  182. /package/src/{data → codegen/data}/__generated__/component-sets/select-box.d.ts +0 -0
  183. /package/src/{data → codegen/data}/__generated__/component-sets/select-box.mjs +0 -0
  184. /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.d.ts +0 -0
  185. /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.mjs +0 -0
  186. /package/src/{data → codegen/data}/__generated__/component-sets/slider.d.ts +0 -0
  187. /package/src/{data → codegen/data}/__generated__/component-sets/slider.mjs +0 -0
  188. /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.d.ts +0 -0
  189. /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.mjs +0 -0
  190. /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.d.ts +0 -0
  191. /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.mjs +0 -0
  192. /package/src/{data → codegen/data}/__generated__/component-sets/switch.d.ts +0 -0
  193. /package/src/{data → codegen/data}/__generated__/component-sets/switch.mjs +0 -0
  194. /package/src/{data → codegen/data}/__generated__/component-sets/tablist.d.ts +0 -0
  195. /package/src/{data → codegen/data}/__generated__/component-sets/tablist.mjs +0 -0
  196. /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.d.ts +0 -0
  197. /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.mjs +0 -0
  198. /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.d.ts +0 -0
  199. /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.mjs +0 -0
  200. /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.d.ts +0 -0
  201. /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.mjs +0 -0
  202. /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.d.ts +0 -0
  203. /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.mjs +0 -0
  204. /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.d.ts +0 -0
  205. /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.mjs +0 -0
  206. /package/src/{data → codegen/data}/__generated__/component-sets/text-button.d.ts +0 -0
  207. /package/src/{data → codegen/data}/__generated__/component-sets/text-button.mjs +0 -0
  208. /package/src/{data → codegen/data}/__generated__/component-sets/text-field.d.ts +0 -0
  209. /package/src/{data → codegen/data}/__generated__/component-sets/text-field.mjs +0 -0
  210. /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.d.ts +0 -0
  211. /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.mjs +0 -0
@@ -0,0 +1,105 @@
1
+ import { definePropsTransformer, type PropsTransformer } from "@/codegen/core";
2
+ import type { NormalizedCornerTrait, NormalizedIsLayerTrait } from "@/normalizer";
3
+ import { objectEntries } from "@/utils/common";
4
+ import { toCssPixel } from "@/utils/css";
5
+ import type { VariableService } from "../variable.service";
6
+
7
+ type RadiusTrait = NormalizedCornerTrait & NormalizedIsLayerTrait;
8
+
9
+ export interface RadiusPropsService<T extends Record<string, any>> {
10
+ transform: PropsTransformer<RadiusTrait, T>;
11
+ }
12
+
13
+ type RadiusPropsKey =
14
+ | "borderRadius"
15
+ | "borderTopLeftRadius"
16
+ | "borderTopRightRadius"
17
+ | "borderBottomLeftRadius"
18
+ | "borderBottomRightRadius";
19
+
20
+ type ApperancePropHandler = (props: RadiusTrait) => string | number | boolean | undefined;
21
+
22
+ export type SeedRadiusProps = Partial<Record<RadiusPropsKey, string | number | boolean>>;
23
+
24
+ export function createRadiusPropsService({
25
+ variableService,
26
+ shouldInferVariableName,
27
+ }: {
28
+ variableService: VariableService;
29
+ shouldInferVariableName: boolean;
30
+ }): RadiusPropsService<SeedRadiusProps> {
31
+ const getLayoutVariableName = (id: string) => variableService.getVariableName(id);
32
+ const inferRadiusVariableName = (value?: number) => {
33
+ if (value === undefined) {
34
+ return undefined;
35
+ }
36
+
37
+ if (shouldInferVariableName) {
38
+ const inferred = variableService.inferVariableName("CORNER_RADIUS", value);
39
+ if (inferred) {
40
+ return inferred;
41
+ }
42
+ }
43
+
44
+ return value === 0 ? 0 : toCssPixel(value);
45
+ };
46
+
47
+ const radiusPropHandlers: Record<RadiusPropsKey, ApperancePropHandler> = {
48
+ borderRadius: ({ cornerRadius, boundVariables }) => {
49
+ // If all corner radii are the same, use the first one
50
+ if (
51
+ cornerRadius &&
52
+ boundVariables?.bottomLeftRadius === boundVariables?.bottomRightRadius &&
53
+ boundVariables?.bottomLeftRadius === boundVariables?.topLeftRadius &&
54
+ boundVariables?.bottomLeftRadius === boundVariables?.topRightRadius
55
+ ) {
56
+ return boundVariables?.bottomLeftRadius
57
+ ? getLayoutVariableName(boundVariables.bottomLeftRadius.id)
58
+ : inferRadiusVariableName(cornerRadius);
59
+ }
60
+
61
+ // TODO: handle individual corner radii
62
+ return undefined;
63
+ },
64
+ borderTopLeftRadius: ({ rectangleCornerRadii, boundVariables }) =>
65
+ boundVariables?.topLeftRadius
66
+ ? getLayoutVariableName(boundVariables.topLeftRadius.id)
67
+ : inferRadiusVariableName(rectangleCornerRadii?.[0]),
68
+ borderTopRightRadius: ({ rectangleCornerRadii, boundVariables }) =>
69
+ boundVariables?.topRightRadius
70
+ ? getLayoutVariableName(boundVariables.topRightRadius.id)
71
+ : inferRadiusVariableName(rectangleCornerRadii?.[1]),
72
+ borderBottomLeftRadius: ({ rectangleCornerRadii, boundVariables }) =>
73
+ boundVariables?.bottomLeftRadius
74
+ ? getLayoutVariableName(boundVariables.bottomLeftRadius.id)
75
+ : inferRadiusVariableName(rectangleCornerRadii?.[2]),
76
+ borderBottomRightRadius: ({ rectangleCornerRadii, boundVariables }) =>
77
+ boundVariables?.bottomRightRadius
78
+ ? getLayoutVariableName(boundVariables.bottomRightRadius.id)
79
+ : inferRadiusVariableName(rectangleCornerRadii?.[3]),
80
+ };
81
+
82
+ // Default values
83
+ const radiusPropDefaults: SeedRadiusProps = {
84
+ borderRadius: 0,
85
+ borderTopLeftRadius: 0,
86
+ borderTopRightRadius: 0,
87
+ borderBottomLeftRadius: 0,
88
+ borderBottomRightRadius: 0,
89
+ };
90
+
91
+ const transform = definePropsTransformer((node: RadiusTrait) => {
92
+ const result: SeedRadiusProps = {};
93
+
94
+ for (const [prop, handler] of objectEntries(radiusPropHandlers)) {
95
+ const value = handler(node);
96
+ if (value !== undefined && value !== radiusPropDefaults[prop]) {
97
+ result[prop] = value;
98
+ }
99
+ }
100
+
101
+ return result;
102
+ });
103
+
104
+ return { transform };
105
+ }
@@ -0,0 +1,127 @@
1
+ import { definePropsTransformer, type PropsTransformer } from "@/codegen/core";
2
+ import type {
3
+ NormalizedHasFramePropertiesTrait,
4
+ NormalizedHasLayoutTrait,
5
+ NormalizedIsLayerTrait,
6
+ } from "@/normalizer";
7
+ import { objectEntries } from "@/utils/common";
8
+ import { toCssPixel } from "@/utils/css";
9
+ import type { VariableService } from "../variable.service";
10
+
11
+ type SelfLayoutTrait = NormalizedIsLayerTrait &
12
+ NormalizedHasLayoutTrait &
13
+ NormalizedHasFramePropertiesTrait;
14
+
15
+ export interface SelfLayoutPropsService<T extends Record<string, any>> {
16
+ transform: PropsTransformer<SelfLayoutTrait, T>;
17
+ }
18
+
19
+ type LayoutPropsKey =
20
+ | "flexGrow"
21
+ | "alignSelf"
22
+ | "width"
23
+ | "height"
24
+ | "minWidth"
25
+ | "minHeight"
26
+ | "maxWidth"
27
+ | "maxHeight";
28
+
29
+ type LayoutPropHandler = (props: SelfLayoutTrait) => string | number | boolean | undefined;
30
+
31
+ export type SeedSelfLayoutProps = Partial<Record<LayoutPropsKey, string | number | boolean>>;
32
+
33
+ export function createSelfLayoutPropsService({
34
+ variableService,
35
+ shouldInferVariableName,
36
+ }: {
37
+ variableService: VariableService;
38
+ shouldInferVariableName: boolean;
39
+ }): SelfLayoutPropsService<SeedSelfLayoutProps> {
40
+ const getLayoutVariableName = (id: string) => variableService.getVariableName(id);
41
+ const inferSizeVariableName = (value?: number) => {
42
+ if (value === undefined) {
43
+ return undefined;
44
+ }
45
+
46
+ if (shouldInferVariableName) {
47
+ const inferred = variableService.inferVariableName("WIDTH_HEIGHT", value);
48
+ if (inferred) {
49
+ return inferred;
50
+ }
51
+ }
52
+
53
+ return value === 0 ? 0 : toCssPixel(value);
54
+ };
55
+
56
+ const layoutPropHandlers: Record<LayoutPropsKey, LayoutPropHandler> = {
57
+ flexGrow: ({ layoutGrow }) => layoutGrow,
58
+ alignSelf: ({ layoutAlign }) => {
59
+ switch (layoutAlign) {
60
+ case "STRETCH":
61
+ return "stretch";
62
+ case "MIN":
63
+ return "flexStart";
64
+ case "CENTER":
65
+ return "center";
66
+ case "MAX":
67
+ return "flexEnd";
68
+ }
69
+ },
70
+ height: ({ boundVariables, layoutSizingVertical, absoluteBoundingBox }) =>
71
+ layoutSizingVertical === "FIXED" || layoutSizingVertical === undefined
72
+ ? boundVariables?.size?.y
73
+ ? getLayoutVariableName(boundVariables.size.y.id)
74
+ : inferSizeVariableName(absoluteBoundingBox?.height)
75
+ : undefined,
76
+ width: ({ boundVariables, layoutSizingHorizontal, absoluteBoundingBox }) =>
77
+ layoutSizingHorizontal === "FIXED" || layoutSizingHorizontal === undefined
78
+ ? boundVariables?.size?.x
79
+ ? getLayoutVariableName(boundVariables.size.x.id)
80
+ : inferSizeVariableName(absoluteBoundingBox?.width)
81
+ : undefined,
82
+ minHeight: ({ boundVariables, layoutSizingVertical, minHeight }) =>
83
+ layoutSizingVertical === "HUG"
84
+ ? boundVariables?.minHeight
85
+ ? getLayoutVariableName(boundVariables.minHeight.id)
86
+ : inferSizeVariableName(minHeight)
87
+ : undefined,
88
+ maxHeight: ({ boundVariables, layoutSizingVertical, maxHeight }) =>
89
+ layoutSizingVertical === "HUG"
90
+ ? boundVariables?.maxHeight
91
+ ? getLayoutVariableName(boundVariables.maxHeight.id)
92
+ : inferSizeVariableName(maxHeight)
93
+ : undefined,
94
+ minWidth: ({ boundVariables, layoutSizingHorizontal, minWidth }) =>
95
+ layoutSizingHorizontal === "HUG"
96
+ ? boundVariables?.minWidth
97
+ ? getLayoutVariableName(boundVariables.minWidth.id)
98
+ : inferSizeVariableName(minWidth)
99
+ : undefined,
100
+ maxWidth: ({ boundVariables, layoutSizingHorizontal, maxWidth }) =>
101
+ layoutSizingHorizontal === "HUG"
102
+ ? boundVariables?.maxWidth
103
+ ? getLayoutVariableName(boundVariables.maxWidth.id)
104
+ : inferSizeVariableName(maxWidth)
105
+ : undefined,
106
+ };
107
+
108
+ // Default values
109
+ const layoutPropDefaults: SeedSelfLayoutProps = {
110
+ flexGrow: 0,
111
+ };
112
+
113
+ const transform = definePropsTransformer((node: SelfLayoutTrait) => {
114
+ const result: SeedSelfLayoutProps = {};
115
+
116
+ for (const [prop, handler] of objectEntries(layoutPropHandlers)) {
117
+ const value = handler(node);
118
+ if (value !== undefined && value !== layoutPropDefaults[prop]) {
119
+ result[prop] = value;
120
+ }
121
+ }
122
+
123
+ return result;
124
+ });
125
+
126
+ return { transform };
127
+ }
@@ -0,0 +1,45 @@
1
+ import { definePropsTransformer, type PropsTransformer } from "@/codegen/core";
2
+ import type { NormalizedHasGeometryTrait, NormalizedIsLayerTrait } from "@/normalizer";
3
+ import type { VariableService } from "../variable.service";
4
+
5
+ type StrokeTrait = NormalizedIsLayerTrait & NormalizedHasGeometryTrait;
6
+
7
+ export interface StrokePropsService<T extends Record<string, any>> {
8
+ transform: PropsTransformer<StrokeTrait, T>;
9
+ }
10
+
11
+ export interface SeedFrameStrokeProps {
12
+ borderWidth?: number;
13
+ borderColor?: string;
14
+ }
15
+
16
+ export function createFrameStrokePropsService({
17
+ variableService,
18
+ }: { variableService: VariableService }): StrokePropsService<SeedFrameStrokeProps> {
19
+ const transform = definePropsTransformer((node: StrokeTrait) => {
20
+ const strokes = node.strokes;
21
+ if (strokes === undefined || strokes.length === 0) {
22
+ return {};
23
+ }
24
+
25
+ const stroke = strokes[0];
26
+ if (!stroke || ("visible" in stroke && !stroke.visible) || stroke.type !== "SOLID") {
27
+ return {};
28
+ }
29
+
30
+ if (node.boundVariables?.strokes?.length === 1) {
31
+ return {
32
+ borderWidth: node.strokeWeight as number,
33
+ borderColor: variableService.getVariableName(node.boundVariables.strokes[0]!.id),
34
+ };
35
+ }
36
+
37
+ const color = stroke.color;
38
+ return {
39
+ borderWidth: node.strokeWeight as number,
40
+ borderColor: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${stroke.opacity})`,
41
+ };
42
+ });
43
+
44
+ return { transform };
45
+ }
@@ -0,0 +1,31 @@
1
+ import { definePropsTransformer, type PropsTransformer } from "@/codegen/core";
2
+ import type { NormalizedTextNode } from "@/normalizer";
3
+ import type { VariableService } from "../variable.service";
4
+
5
+ export interface TypeStylePropsService {
6
+ transform: PropsTransformer<NormalizedTextNode>;
7
+ }
8
+
9
+ export function createFrameTypeStylePropsService({
10
+ variableService,
11
+ }: { variableService: VariableService }) {
12
+ const transform = definePropsTransformer((node: NormalizedTextNode) => {
13
+ const fontSizeBoundVariables = node.boundVariables?.fontSize?.[0];
14
+ const fontStyleBoundVariables = node.boundVariables?.fontStyle?.[0];
15
+ const lineHeightBoundVariables = node.boundVariables?.lineHeight?.[0];
16
+
17
+ return {
18
+ fontSize: fontSizeBoundVariables
19
+ ? variableService.getVariableName(fontSizeBoundVariables.id)
20
+ : undefined,
21
+ fontWeight: fontStyleBoundVariables
22
+ ? variableService.getVariableName(fontStyleBoundVariables.id)
23
+ : undefined,
24
+ lineHeight: lineHeightBoundVariables
25
+ ? variableService.getVariableName(lineHeightBoundVariables.id)
26
+ : undefined,
27
+ };
28
+ });
29
+
30
+ return { transform } satisfies TypeStylePropsService;
31
+ }
@@ -0,0 +1,31 @@
1
+ import type { NormalizedRectangleNode } from "@/normalizer";
2
+ import { createElement, defineElementTransformer, type ElementTransformer } from "../core";
3
+ import type {
4
+ SeedSelfLayoutProps,
5
+ SelfLayoutPropsService,
6
+ } from "./props/self-layout-props.service";
7
+
8
+ export interface RectangleService {
9
+ transform: ElementTransformer<NormalizedRectangleNode>;
10
+ }
11
+
12
+ export interface SeedRectangleServiceDeps {
13
+ selfLayoutPropsService: SelfLayoutPropsService<SeedSelfLayoutProps>;
14
+ }
15
+
16
+ export function createSeedRectangleService({
17
+ selfLayoutPropsService,
18
+ }: SeedRectangleServiceDeps): RectangleService {
19
+ const transform = defineElementTransformer((node: NormalizedRectangleNode, traverse) => {
20
+ return createElement(
21
+ "Box",
22
+ { ...selfLayoutPropsService.transform(node, traverse), background: "palette.gray200" },
23
+ undefined,
24
+ "Rectangle Node Placeholder",
25
+ );
26
+ });
27
+
28
+ return {
29
+ transform,
30
+ };
31
+ }
@@ -0,0 +1,6 @@
1
+ import type { IconService } from "../icon.service";
2
+ import type { VariableService } from "../variable.service";
3
+ export interface SeedComponentTransformerDeps {
4
+ iconService: IconService;
5
+ variableService: VariableService;
6
+ }
@@ -0,0 +1,75 @@
1
+ import type { ComponentTransformer } from "@/codegen/core";
2
+ import type { SeedComponentTransformerDeps } from "./deps.interface";
3
+ import { createActionButtonTransformer } from "./transformers/action-button";
4
+ import { createActionChipTransformer } from "./transformers/action-chip";
5
+ import { createActionSheetTransformer } from "./transformers/action-sheet";
6
+ import { createAppBarTransformer } from "./transformers/app-bar";
7
+ import { createAvatarTransformer } from "./transformers/avatar";
8
+ import { createAvatarStackTransformer } from "./transformers/avatar-stack";
9
+ import { createBadgeTransformer } from "./transformers/badge";
10
+ import { createCalloutTransformer } from "./transformers/callout";
11
+ import { createCheckboxTransformer } from "./transformers/checkbox";
12
+ import { createChipTabsTransformer } from "./transformers/chip-tabs";
13
+ import { createControlChipTransformer } from "./transformers/control-chip";
14
+ import { createErrorStateTransformer } from "./transformers/error-state";
15
+ import { createExtendedActionSheetTransformer } from "./transformers/extended-action-sheet";
16
+ import { createExtendedFabTransformer } from "./transformers/extended-fab";
17
+ import { createFabTransformer } from "./transformers/fab";
18
+ import { createHelpBubbleTransformer } from "./transformers/help-bubble";
19
+ import { createIdentityPlaceholderTransformer } from "./transformers/identity-placeholder";
20
+ import { createInlineBannerTransformer } from "./transformers/inline-banner";
21
+ import { createMannerTempBadgeTransformer } from "./transformers/manner-temp-badge";
22
+ import { createMultilineTextFieldTransformer } from "./transformers/multiline-text-field";
23
+ import { createProgressCircleTransformer } from "./transformers/progress-circle";
24
+ import { createReactionButtonTransformer } from "./transformers/reaction-button";
25
+ import { createSegmentedControlTransformer } from "./transformers/segmented-control";
26
+ import {
27
+ createSelectBoxGroupTransformer,
28
+ createSelectBoxTransformer,
29
+ } from "./transformers/select-box";
30
+ import { createSkeletonTransformer } from "./transformers/skeleton";
31
+ import { createSnackbarTransformer } from "./transformers/snackbar";
32
+ import { createSwitchTransformer } from "./transformers/switch";
33
+ import { createTabsTransformer } from "./transformers/tabs";
34
+ import { createTextButtonTransformer } from "./transformers/text-button";
35
+ import { createTextFieldTransformer } from "./transformers/text-field";
36
+ import { createToggleButtonTransformer } from "./transformers/toggle-button";
37
+
38
+ export type { SeedComponentTransformerDeps };
39
+ export type * from "./properties.type";
40
+
41
+ export const createSeedComponentTransformers = (ctx: SeedComponentTransformerDeps) =>
42
+ [
43
+ createActionButtonTransformer(ctx),
44
+ createActionChipTransformer(ctx),
45
+ createActionSheetTransformer(ctx),
46
+ createAppBarTransformer(ctx),
47
+ createAvatarTransformer(ctx),
48
+ createAvatarStackTransformer(ctx),
49
+ createBadgeTransformer(ctx),
50
+ createCalloutTransformer(ctx),
51
+ createCheckboxTransformer(ctx),
52
+ createChipTabsTransformer(ctx),
53
+ createControlChipTransformer(ctx),
54
+ createErrorStateTransformer(ctx),
55
+ createExtendedActionSheetTransformer(ctx),
56
+ createExtendedFabTransformer(ctx),
57
+ createFabTransformer(ctx),
58
+ createHelpBubbleTransformer(ctx),
59
+ createIdentityPlaceholderTransformer(ctx),
60
+ createInlineBannerTransformer(ctx),
61
+ createMannerTempBadgeTransformer(ctx),
62
+ createMultilineTextFieldTransformer(ctx),
63
+ createProgressCircleTransformer(ctx),
64
+ createReactionButtonTransformer(ctx),
65
+ createSegmentedControlTransformer(ctx),
66
+ createSelectBoxGroupTransformer(ctx),
67
+ createSelectBoxTransformer(ctx),
68
+ createSkeletonTransformer(ctx),
69
+ createSnackbarTransformer(ctx),
70
+ createSwitchTransformer(ctx),
71
+ createTabsTransformer(ctx),
72
+ createTextButtonTransformer(ctx),
73
+ createTextFieldTransformer(ctx),
74
+ createToggleButtonTransformer(ctx),
75
+ ] as Array<ComponentTransformer>;
@@ -1,5 +1,5 @@
1
- import type { InferFromDefinition } from "./type-helper";
2
- import type * as metadata from "../data/__generated__/component-sets";
1
+ import type { InferFromDefinition } from "../../core/component";
2
+ import type * as metadata from "../../data/__generated__/component-sets";
3
3
 
4
4
  export type ActionButtonProperties = InferFromDefinition<
5
5
  typeof metadata.actionButton.componentPropertyDefinitions
@@ -1,8 +1,10 @@
1
+ // TODO: move this file to relevant directory
2
+
1
3
  import { camelCase } from "change-case";
2
4
 
3
- type Size = "XSmall" | "Small" | "Medium" | "Large" | "XLarge" | ({} & string);
5
+ type SizeProp = "XSmall" | "Small" | "Medium" | "Large" | "XLarge" | ({} & string);
4
6
 
5
- export function handleSize(size: Size) {
7
+ export function handleSizeProp(size: SizeProp) {
6
8
  switch (size) {
7
9
  case "XSmall":
8
10
  return "xsmall";
@@ -0,0 +1,69 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import { match } from "ts-pattern";
4
+ import { createElement } from "../../../core/jsx";
5
+ import * as metadata from "../../../data/__generated__/component-sets";
6
+ import { handleSizeProp } from "../size";
7
+ import type { ActionButtonProperties } from "../properties.type";
8
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
9
+
10
+ export const createActionButtonTransformer = (ctx: SeedComponentTransformerDeps) =>
11
+ defineComponentTransformer<ActionButtonProperties>(
12
+ metadata.actionButton.key,
13
+ ({ componentProperties: props }) => {
14
+ const states = props.State.value.split("-");
15
+
16
+ const { layout, children } = match(props.Layout.value)
17
+ .with("Icon Only", () => ({
18
+ layout: "iconOnly",
19
+ children: [
20
+ createElement("Icon", {
21
+ svg: createElement(
22
+ ctx.iconService.createIconTagName(props["Icon#7574:0"].componentKey),
23
+ ),
24
+ }),
25
+ ],
26
+ }))
27
+ .with("Icon First", () => ({
28
+ layout: "withText",
29
+ children: [
30
+ createElement("PrefixIcon", {
31
+ svg: createElement(
32
+ ctx.iconService.createIconTagName(props["Prefix Icon#5987:305"].componentKey),
33
+ ),
34
+ }),
35
+ props["Label#5987:61"].value,
36
+ ],
37
+ }))
38
+ .with("Icon Last", () => ({
39
+ layout: "withText",
40
+ children: [
41
+ props["Label#5987:61"].value,
42
+ createElement("SuffixIcon", {
43
+ svg: createElement(
44
+ ctx.iconService.createIconTagName(props["Suffix Icon#5987:244"].componentKey),
45
+ ),
46
+ }),
47
+ ],
48
+ }))
49
+ .with("Text Only", () => ({
50
+ layout: "withText",
51
+ children: props["Label#5987:61"].value,
52
+ }))
53
+ .exhaustive();
54
+
55
+ const commonProps = {
56
+ ...(states.includes("Disabled") && {
57
+ disabled: true,
58
+ }),
59
+ ...(states.includes("Loading") && {
60
+ loading: true,
61
+ }),
62
+ size: handleSizeProp(props.Size.value),
63
+ variant: camelCase(props.Variant.value),
64
+ layout,
65
+ };
66
+
67
+ return createElement("ActionButton", commonProps, children);
68
+ },
69
+ );
@@ -0,0 +1,82 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { match } from "ts-pattern";
3
+ import { createElement } from "../../../core/jsx";
4
+ import * as metadata from "../../../data/__generated__/component-sets";
5
+ import type { ActionChipProperties } from "../properties.type";
6
+ import { handleSizeProp } from "../size";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createActionChipTransformer = (ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<ActionChipProperties>(
11
+ metadata.actionChip.key,
12
+ ({ componentProperties: props }) => {
13
+ const states = props.State.value.split("-");
14
+
15
+ const { layout, children } = match(props.Layout.value)
16
+ .with("Icon Only", () => ({
17
+ layout: "iconOnly",
18
+ children: [
19
+ createElement("Icon", {
20
+ svg: createElement(
21
+ ctx.iconService.createIconTagName(props["Icon#8714:0"].componentKey),
22
+ ),
23
+ }),
24
+ ],
25
+ }))
26
+ .with("Icon First", () => ({
27
+ layout: "withText",
28
+ children: [
29
+ createElement("PrefixIcon", {
30
+ svg: createElement(
31
+ ctx.iconService.createIconTagName(props["Prefix Icon#8711:0"].componentKey),
32
+ ),
33
+ }),
34
+ props["Label#7185:0"].value,
35
+ ],
36
+ }))
37
+ .with("Icon Last", () => ({
38
+ layout: "withText",
39
+ children: [
40
+ props["Label#7185:0"].value,
41
+ createElement("SuffixIcon", {
42
+ svg: createElement(
43
+ ctx.iconService.createIconTagName(props["Suffix Icon#8711:3"].componentKey),
44
+ ),
45
+ }),
46
+ ],
47
+ }))
48
+ .with("Icon Both", () => ({
49
+ layout: "withText",
50
+ children: [
51
+ createElement("PrefixIcon", {
52
+ svg: createElement(
53
+ ctx.iconService.createIconTagName(props["Prefix Icon#8711:0"].componentKey),
54
+ ),
55
+ }),
56
+ props["Label#7185:0"].value,
57
+ createElement("SuffixIcon", {
58
+ svg: createElement(
59
+ ctx.iconService.createIconTagName(props["Suffix Icon#8711:3"].componentKey),
60
+ ),
61
+ }),
62
+ ],
63
+ }))
64
+ .with("Text Only", () => ({
65
+ layout: "withText",
66
+ children: props["Label#7185:0"].value,
67
+ }))
68
+ .exhaustive();
69
+
70
+ const commonProps = {
71
+ size: handleSizeProp(props.Size.value),
72
+ layout,
73
+ ...(states.includes("Disabled") && {
74
+ disabled: true,
75
+ }),
76
+ ...(props["Show Count#7185:42"].value && {
77
+ count: Number(props["Count#7185:21"].value),
78
+ }),
79
+ };
80
+ return createElement("ActionChip", commonProps, children);
81
+ },
82
+ );
@@ -0,0 +1,78 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import { match } from "ts-pattern";
4
+ import * as metadata from "../../../data/__generated__/component-sets";
5
+ import { createElement } from "../../../core/jsx";
6
+ import { findAllInstances } from "../../../../utils/figma-node";
7
+ import type { ActionSheetItemProperties, ActionSheetProperties } from "../properties.type";
8
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
9
+
10
+ const ACTION_SHEET_ITEM_KEY = "c3cafd3a3fdcd45fecb6971019d88eaf39a2e381";
11
+ const createActionSheetItemTransformer = (_ctx: SeedComponentTransformerDeps) =>
12
+ defineComponentTransformer<ActionSheetItemProperties>(
13
+ ACTION_SHEET_ITEM_KEY,
14
+ ({ componentProperties: props }) => {
15
+ const states = props.State.value.split("-");
16
+
17
+ const commonProps = {
18
+ label: props["Label#15420:4"].value,
19
+ tone: camelCase(props.Tone.value),
20
+ ...(states.includes("Disabled") && {
21
+ disabled: true,
22
+ }),
23
+ };
24
+
25
+ return createElement("ActionSheetItem", commonProps);
26
+ },
27
+ );
28
+
29
+ export const createActionSheetTransformer = (ctx: SeedComponentTransformerDeps) => {
30
+ const actionSheetItemTransformer = createActionSheetItemTransformer(ctx);
31
+
32
+ return defineComponentTransformer<ActionSheetProperties>(metadata.actionSheet.key, (node) => {
33
+ const { componentProperties: props } = node;
34
+
35
+ const contentProps = match(props.Header.value)
36
+ .with("None", () => ({
37
+ title: undefined,
38
+ description: undefined,
39
+ }))
40
+ .with("Title Only", () => ({
41
+ title: props["Title#15641:37"].value,
42
+ description: undefined,
43
+ }))
44
+ .with("Description Only", () => ({
45
+ title: undefined,
46
+ description: props["Description#15641:70"].value,
47
+ }))
48
+ .with("Title With Description", () => ({
49
+ title: props["Title#15641:37"].value,
50
+ description: props["Description#15641:70"].value,
51
+ }))
52
+ .exhaustive();
53
+
54
+ const items = findAllInstances<ActionSheetItemProperties>({
55
+ node,
56
+ key: actionSheetItemTransformer.key,
57
+ });
58
+
59
+ const contentChildren = items.map(actionSheetItemTransformer.transform);
60
+
61
+ const content = createElement(
62
+ "ActionSheetContent",
63
+ contentProps,
64
+ contentChildren,
65
+ contentProps.title
66
+ ? ""
67
+ : "title을 제공하지 않는 경우 aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
68
+ );
69
+
70
+ const trigger = createElement(
71
+ "ActionSheetTrigger",
72
+ { asChild: true },
73
+ createElement("ActionButton", undefined, "열기", "ActionSheet을 여는 요소를 제공해주세요."),
74
+ );
75
+
76
+ return createElement("ActionSheet", undefined, [trigger, content]);
77
+ });
78
+ };