@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
@@ -1,76 +0,0 @@
1
- import { actionButtonHandler } from "./handlers/action-button";
2
- import { actionChipHandler } from "./handlers/action-chip";
3
- import { actionSheetHandler } from "./handlers/action-sheet";
4
- import { appBarHandler } from "./handlers/app-bar";
5
- import { avatarHandler } from "./handlers/avatar";
6
- import { avatarStackHandler } from "./handlers/avatar-stack";
7
- import { badgeHandler } from "./handlers/badge";
8
- import { calloutHandler } from "./handlers/callout";
9
- import { checkboxHandler } from "./handlers/checkbox";
10
- import { chipTabsHandler } from "./handlers/chip-tabs";
11
- import { controlChipHandler } from "./handlers/control-chip";
12
- import { errorStateHandler } from "./handlers/error-state";
13
- import { extendedActionSheetHandler } from "./handlers/extended-action-sheet";
14
- import { extendedFabHandler } from "./handlers/extended-fab";
15
- import { fabHandler } from "./handlers/fab";
16
- import { helpBubbleHandler } from "./handlers/help-bubble";
17
- import { identityPlaceholderHandler } from "./handlers/identity-placeholder";
18
- import { inlineBannerHandler } from "./handlers/inline-banner";
19
- import { mannerTempBadgeHandler } from "./handlers/manner-temp-badge";
20
- import { multilineTextFieldHandler } from "./handlers/multiline-text-field";
21
- import { progressCircleHandler } from "./handlers/progress-circle";
22
- import { reactionButtonHandler } from "./handlers/reaction-button";
23
- import { segmentedControlHandler } from "./handlers/segmented-control";
24
- import { selectBoxGroupHandler, selectBoxHandler } from "./handlers/select-box";
25
- import { skeletonHandler } from "./handlers/skeleton";
26
- import { snackbarHandler } from "./handlers/snackbar";
27
- import { switchHandler } from "./handlers/switch";
28
- import { tabsHandler } from "./handlers/tabs";
29
- import { textButtonHandler } from "./handlers/text-button";
30
- import { textFieldHandler } from "./handlers/text-field";
31
- import { toggleButtonHandler } from "./handlers/toggle-button";
32
- import type { ComponentHandler } from "./type-helper";
33
-
34
- const componentHandlers = [
35
- actionButtonHandler,
36
- actionChipHandler,
37
- actionSheetHandler,
38
- appBarHandler,
39
- avatarHandler,
40
- avatarStackHandler,
41
- badgeHandler,
42
- calloutHandler,
43
- checkboxHandler,
44
- chipTabsHandler,
45
- controlChipHandler,
46
- errorStateHandler,
47
- extendedActionSheetHandler,
48
- extendedFabHandler,
49
- fabHandler,
50
- helpBubbleHandler,
51
- identityPlaceholderHandler,
52
- inlineBannerHandler,
53
- mannerTempBadgeHandler,
54
- multilineTextFieldHandler,
55
- progressCircleHandler,
56
- reactionButtonHandler,
57
- segmentedControlHandler,
58
- selectBoxGroupHandler,
59
- selectBoxHandler,
60
- skeletonHandler,
61
- snackbarHandler,
62
- switchHandler,
63
- tabsHandler,
64
- textButtonHandler,
65
- textFieldHandler,
66
- toggleButtonHandler,
67
- ] as ComponentHandler[];
68
-
69
- export const componentHandlerMap = new Map(
70
- componentHandlers.map((component) => [component.key, component]),
71
- );
72
-
73
- export const ignoredComponentKeys = new Set<string>([
74
- "1acdc7247c83a73a0504d6fad86d08783938cb1a",
75
- "b38b719b61cdf1a24458d7a7888bee74b7649084",
76
- ]);
@@ -1,251 +0,0 @@
1
- import { camelCase } from "change-case";
2
- import { componentHandlerMap, ignoredComponentKeys } from "./component";
3
- import { iconRecord } from "./data/icons";
4
- import { FIGMA_TEXT_STYLES } from "./data/styles";
5
- import { createIconTagNameFromKey, createMonochromeIconColorProps, isIconComponent } from "./icon";
6
- import type { ElementNode } from "./jsx";
7
- import { createElement, stringifyElement } from "./jsx";
8
- import { inferLayoutComponent } from "./layout";
9
- import type {
10
- NormalizedComponentNode,
11
- NormalizedFrameNode,
12
- NormalizedInstanceNode,
13
- NormalizedRectangleNode,
14
- NormalizedSceneNode,
15
- NormalizedTextNode,
16
- } from "./normalizer";
17
- import { createBackgroundProps, createBorderProps } from "./props/color";
18
- import { createLayoutProps } from "./props/layout";
19
- import { createSizingProps } from "./props/sizing";
20
- import { createTextProps } from "./props/text";
21
- import { getColorVariableName, getLayoutVariableName, inferDimension } from "./props/variable";
22
- import { compactObject } from "./utils/common";
23
-
24
- type PromiseLikeMaybe<T> = Promise<T | undefined> | T | undefined;
25
-
26
- export type FigmaNodeHandler = (node: NormalizedSceneNode) => PromiseLikeMaybe<ElementNode>;
27
-
28
- type FigmaNodeHandlerFactory<T extends NormalizedSceneNode> = (
29
- traverse: FigmaNodeHandler,
30
- ) => (node: T) => PromiseLikeMaybe<ElementNode>;
31
-
32
- export type FrameNodeHandlerFactory = FigmaNodeHandlerFactory<
33
- NormalizedFrameNode | NormalizedComponentNode | NormalizedInstanceNode
34
- >;
35
-
36
- export type TextNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedTextNode>;
37
-
38
- export type RectangleNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedRectangleNode>;
39
-
40
- export type ComponentNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedComponentNode>;
41
-
42
- export type InstanceNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedInstanceNode>;
43
-
44
- const defaultFrameHandler: FrameNodeHandlerFactory = (traverse) => async (node) => {
45
- const children = node.children;
46
-
47
- const props = {
48
- ...createLayoutProps(node),
49
- ...createSizingProps(node),
50
- ...createBackgroundProps(node),
51
- ...createBorderProps(node),
52
- };
53
-
54
- const layoutComponent = inferLayoutComponent(props);
55
-
56
- if (layoutComponent === "Stack") {
57
- const { flexDirection, ...rest } = props;
58
-
59
- return createElement("Stack", rest, await Promise.all(children.map(traverse)));
60
- }
61
-
62
- if (layoutComponent === "Inline") {
63
- const { flexDirection, flexWrap, alignItems, justifyContent, ...rest } = props;
64
-
65
- return createElement("Inline", rest, await Promise.all(children.map(traverse)));
66
- }
67
-
68
- if (layoutComponent === "Columns") {
69
- const { flexDirection, flexWrap, justifyContent, ...rest } = props;
70
-
71
- const childrenResult = await Promise.all(children.map(traverse));
72
-
73
- return createElement(
74
- "Columns",
75
- rest,
76
- childrenResult.map((child) => createElement("Column", {}, child)),
77
- );
78
- }
79
-
80
- return createElement("Flex", props, await Promise.all(children.map(traverse)));
81
- };
82
-
83
- const defaultTextNodeHandler: TextNodeHandlerFactory = () => (node) => {
84
- const maxLines =
85
- node.style.textTruncation === "ENDING" ? (node.style.maxLines ?? undefined) : undefined;
86
-
87
- if (node.fills.length > 1) {
88
- throw new Error("Expected a single fill");
89
- }
90
-
91
- const onlyFill = node.fills.length === 1 ? node.fills[0] : null;
92
- const fillBoundVariableId =
93
- onlyFill && onlyFill.type === "SOLID" ? (onlyFill.boundVariables?.color?.id ?? null) : null;
94
- const color = fillBoundVariableId ? getColorVariableName(fillBoundVariableId) : undefined;
95
-
96
- const style = FIGMA_TEXT_STYLES.find((s) => s.key === node.textStyleKey);
97
-
98
- if (style) {
99
- const styleNameSlugs = style.name.split("/");
100
- const styleName = styleNameSlugs[styleNameSlugs.length - 1]!;
101
- return createElement(
102
- "Text",
103
- compactObject({
104
- textStyle: camelCase(styleName, { mergeAmbiguousCharacters: true }),
105
- maxLines,
106
- color,
107
- }),
108
- node.characters.replace(/\n/g, "<br />"),
109
- color ? "" : "color 프로퍼티는 반영되지 않았습니다.",
110
- );
111
- }
112
-
113
- const { fontSize, fontWeight, lineHeight } = createTextProps(node.boundVariables);
114
-
115
- return createElement(
116
- "Text",
117
- compactObject({
118
- fontSize,
119
- fontWeight,
120
- lineHeight,
121
- color,
122
- }),
123
- node.characters.replace(/\n/g, "<br />"),
124
- );
125
- };
126
-
127
- const defaultRectangleNodeHandler: RectangleNodeHandlerFactory = () => (node) => {
128
- return createElement(
129
- "Box",
130
- { ...createSizingProps(node), background: "palette.gray200" },
131
- undefined,
132
- "Rectangle Node Placeholder",
133
- );
134
- };
135
-
136
- const defaultComponentNodeHandler: ComponentNodeHandlerFactory = (traverse) => async (node) => {
137
- return defaultFrameHandler(traverse)(node);
138
- };
139
-
140
- const defaultInstanceNodeHandler: InstanceNodeHandlerFactory = (traverse) => async (node) => {
141
- const { componentKey, componentSetKey } = node;
142
-
143
- if (isIconComponent(componentKey)) {
144
- const iconElement = createElement(createIconTagNameFromKey(componentKey));
145
-
146
- switch (iconRecord[componentKey]?.type) {
147
- case "monochrome":
148
- return createElement("Icon", {
149
- size:
150
- getLayoutVariableName(node.boundVariables?.size?.x?.id) ??
151
- inferDimension(node.absoluteBoundingBox?.width ?? 0),
152
- ...createMonochromeIconColorProps(node),
153
- svg: iconElement,
154
- });
155
- case "multicolor":
156
- return iconElement;
157
- default:
158
- return createElement("Icon", {
159
- size:
160
- getLayoutVariableName(node.boundVariables?.size?.x?.id) ??
161
- inferDimension(node.absoluteBoundingBox?.width ?? 0),
162
- svg: iconElement,
163
- ...createMonochromeIconColorProps(node),
164
- });
165
- }
166
- }
167
-
168
- if (ignoredComponentKeys.has(componentSetKey ?? componentKey)) {
169
- return;
170
- }
171
-
172
- const componentData = componentSetKey
173
- ? componentHandlerMap.get(componentSetKey)
174
- : componentHandlerMap.get(componentKey);
175
-
176
- if (componentData) {
177
- return componentData.codegen(node);
178
- }
179
-
180
- // if (node.id === selection.id) {
181
- return await defaultFrameHandler(traverse)(node);
182
- // }
183
-
184
- // const mainComponent = node.mainComponent;
185
-
186
- // return createElement(
187
- // mainComponent.parent?.type === "COMPONENT_SET"
188
- // ? mainComponent.parent.name
189
- // : mainComponent.name,
190
- // Object.fromEntries(
191
- // Object.entries(node.componentProperties)
192
- // .filter(([_, props]) => props.type === "VARIANT" || props.type === "TEXT")
193
- // .map(([key, props]) => [camelCase(key), camelCase(props.value as string)]),
194
- // ),
195
- // undefined,
196
- // "Custom Component",
197
- // );
198
- };
199
-
200
- export async function generateCode(
201
- selection: NormalizedSceneNode,
202
- options?: {
203
- handlers?: {
204
- frame?: FrameNodeHandlerFactory;
205
- text?: TextNodeHandlerFactory;
206
- rectangle?: RectangleNodeHandlerFactory;
207
- component?: ComponentNodeHandlerFactory;
208
- instance?: InstanceNodeHandlerFactory;
209
- };
210
- },
211
- ) {
212
- const handlers = {
213
- frame: defaultFrameHandler,
214
- text: defaultTextNodeHandler,
215
- rectangle: defaultRectangleNodeHandler,
216
- component: defaultComponentNodeHandler,
217
- instance: defaultInstanceNodeHandler,
218
- ...options?.handlers,
219
- };
220
-
221
- const handleFrameNode = handlers.frame(traverse);
222
- const handleTextNode = handlers.text(traverse);
223
- const handleRectangleNode = handlers.rectangle(traverse);
224
- const handleComponentNode = handlers.component(traverse);
225
- const handleInstanceNode = handlers.instance(traverse);
226
-
227
- async function traverse(node: NormalizedSceneNode): Promise<ElementNode | undefined> {
228
- if ("visible" in node && !node.visible) {
229
- return;
230
- }
231
-
232
- if (node.type === "FRAME") return await handleFrameNode(node);
233
- if (node.type === "TEXT") return handleTextNode(node);
234
- if (node.type === "RECTANGLE") return await handleRectangleNode(node);
235
- if (node.type === "COMPONENT") return await handleComponentNode(node);
236
- if (node.type === "INSTANCE") return await handleInstanceNode(node);
237
-
238
- return;
239
- }
240
-
241
- try {
242
- const rootEl = await traverse(selection);
243
- if (!rootEl) {
244
- return "";
245
- }
246
- return stringifyElement(rootEl);
247
- } catch (e) {
248
- console.error(e);
249
- return "";
250
- }
251
- }
package/src/icon.ts DELETED
@@ -1,46 +0,0 @@
1
- import { pascalCase } from "change-case";
2
-
3
- import { createColorProps } from "./props/color";
4
- import { iconRecord } from "./data/icons";
5
- import type { NormalizedInstanceNode } from "./normalizer";
6
-
7
- export function isIconComponent(componentKey: string) {
8
- return !!iconRecord[componentKey];
9
- }
10
-
11
- export function createIconTagNameFromKey(key?: string) {
12
- if (!key) {
13
- return "UnknownIcon";
14
- }
15
-
16
- const iconData = iconRecord[key];
17
- if (!iconData) {
18
- throw new Error(`Icon not found: ${key}`);
19
- }
20
-
21
- const { name, weight } = iconData;
22
-
23
- return pascalCase(`${name}${weight ? weight : ""}`);
24
- }
25
-
26
- export function createMonochromeIconColorProps(node: NormalizedInstanceNode) {
27
- if (node.children.length === 0) {
28
- throw new Error("Icon node has no children");
29
- }
30
-
31
- const icons = node.children.filter(
32
- (child) => child.type === "VECTOR" || child.type === "BOOLEAN_OPERATION",
33
- );
34
-
35
- const colorProps = icons.map(createColorProps);
36
-
37
- const fills = new Set(
38
- colorProps.map((props) => props.color).filter((color) => color !== undefined),
39
- );
40
-
41
- if (fills.size > 1) {
42
- throw new Error(`Children of the icon node ${node.name} has multiple colors`);
43
- }
44
-
45
- return { color: fills.values().next().value };
46
- }
package/src/layout.ts DELETED
@@ -1,31 +0,0 @@
1
- export interface LayoutComponentProps {
2
- flexDirection: string | number | boolean;
3
- alignItems: string | number | boolean;
4
- justifyContent: string | number | boolean;
5
- flexWrap: string | number | boolean;
6
- }
7
-
8
- export function inferLayoutComponent(props: LayoutComponentProps) {
9
- if (
10
- props.flexDirection === "row" &&
11
- props.alignItems === "flexStart" &&
12
- props.justifyContent === "flexStart" &&
13
- props.flexWrap === "wrap"
14
- ) {
15
- return "Inline";
16
- }
17
-
18
- if (
19
- props.flexDirection === "row" &&
20
- props.justifyContent === "flexStart" &&
21
- props.flexWrap === "nowrap"
22
- ) {
23
- return "Columns";
24
- }
25
-
26
- if (props.flexDirection === "column") {
27
- return "Stack";
28
- }
29
-
30
- return "Flex";
31
- }
@@ -1,78 +0,0 @@
1
- import type { NormalizedFrameNode, NormalizedTextNode } from "../normalizer";
2
- import { getColorVariableName } from "./variable";
3
-
4
- export function createBackgroundProps(
5
- node: Pick<NormalizedFrameNode, "fills" | "boundVariables">,
6
- ): Partial<Record<"background", string | undefined>> {
7
- const fills = node.fills;
8
- if (fills.length === 0) {
9
- return {};
10
- }
11
-
12
- const fill = fills[0];
13
- if (!fill || ("visible" in fill && !fill.visible) || fill.type !== "SOLID") {
14
- return {};
15
- }
16
-
17
- if (node.boundVariables?.fills?.length === 1) {
18
- return {
19
- background: getColorVariableName(node.boundVariables.fills[0]!.id),
20
- };
21
- }
22
-
23
- const color = fill.color;
24
- return {
25
- background: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${fill.opacity})`,
26
- };
27
- }
28
-
29
- export function createColorProps(
30
- node: Pick<NormalizedTextNode, "fills" | "boundVariables">,
31
- ): Partial<Record<"color", string | undefined>> {
32
- const fills = node.fills;
33
- if (fills.length === 0) {
34
- return {};
35
- }
36
-
37
- const fill = fills[0];
38
- if (!fill || ("visible" in fill && !fill.visible) || fill.type !== "SOLID") {
39
- return {};
40
- }
41
- if (node.boundVariables?.fills?.length === 1) {
42
- return {
43
- color: getColorVariableName(node.boundVariables.fills[0]!.id),
44
- };
45
- }
46
-
47
- const color = fill.color;
48
- return {
49
- color: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${fill.opacity})`,
50
- };
51
- }
52
-
53
- export function createBorderProps(
54
- node: Pick<NormalizedFrameNode, "strokeWeight" | "strokes" | "boundVariables">,
55
- ): Partial<Record<"borderWidth" | "borderColor", string | number | undefined>> {
56
- const strokes = node.strokes;
57
- if (strokes === undefined || strokes.length === 0) {
58
- return {};
59
- }
60
-
61
- const stroke = strokes[0];
62
- if (!stroke || ("visible" in stroke && !stroke.visible) || stroke.type !== "SOLID") {
63
- return {};
64
- }
65
-
66
- if (node.boundVariables?.strokes?.length === 1) {
67
- return {
68
- borderWidth: node.strokeWeight as number,
69
- borderColor: getColorVariableName(node.boundVariables.strokes[0]!.id),
70
- };
71
- }
72
-
73
- const color = stroke.color;
74
- return {
75
- borderWidth: node.strokeWeight as number,
76
- borderColor: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${stroke.opacity})`,
77
- };
78
- }