@seed-design/figma 0.0.4 → 0.0.6

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,113 +1,60 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
1
2
  import { match } from "ts-pattern";
2
- import * as metadata from "../../data/__generated__/component-sets";
3
- import { createIconTagNameFromKey } from "../../icon";
4
- import { createElement } from "../../jsx";
5
- import { findAll, findAllInstances, findOne } from "../../utils/figma-node";
6
- import type { NormalizedInstanceNode, NormalizedTextNode } from "../../normalizer";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import { findAll, findAllInstances, findOne } from "../../../../utils/figma-node";
6
+ import type { NormalizedInstanceNode, NormalizedTextNode } from "../../../../normalizer";
7
7
  import type {
8
8
  AppBarLeftProperties,
9
9
  AppBarMainProperties,
10
10
  AppBarProperties,
11
11
  AppBarRightProperties,
12
- } from "../type";
13
- import type { ComponentHandler } from "../type-helper";
14
-
15
- export const appBarHandler: ComponentHandler<AppBarProperties> = {
16
- key: metadata.standardNavigation.key,
17
- codegen: async (node) => {
12
+ } from "../properties.type";
13
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
14
+
15
+ const APP_BAR_MAIN_KEY = "336b49b26c3933485d87cc460b06c390976ea58e";
16
+ const createAppBarMainTransformer = (_ctx: SeedComponentTransformerDeps) =>
17
+ defineComponentTransformer<AppBarMainProperties>(
18
+ APP_BAR_MAIN_KEY,
19
+ ({ componentProperties: props }) => {
20
+ const { title, subtitle, layout } = match(props.Type.value)
21
+ .with("Title", () => ({
22
+ title: props["Title#16944:0"].value,
23
+ subtitle: undefined,
24
+ layout: undefined,
25
+ }))
26
+ .with("Title-Subtitle", () => ({
27
+ title: props["Title#16944:0"].value,
28
+ subtitle: props["Subtitle#16958:9"].value,
29
+ layout: "withSubtitle",
30
+ }))
31
+ .otherwise(() => ({
32
+ title: undefined,
33
+ subtitle: undefined,
34
+ layout: undefined,
35
+ }));
36
+
37
+ const commonProps = {
38
+ title,
39
+ subtitle,
40
+ layout,
41
+ };
42
+
43
+ return createElement(
44
+ "AppBarMain",
45
+ commonProps,
46
+ undefined,
47
+ title === undefined ? "Title을 제공해주세요." : undefined,
48
+ );
49
+ },
50
+ );
51
+
52
+ const APP_BAR_LEFT_KEY = "e5d2e47052a22395db79f195a0991a570dc1b6c9";
53
+ const createAppBarLeftTransformer = (ctx: SeedComponentTransformerDeps) =>
54
+ defineComponentTransformer<AppBarLeftProperties>(APP_BAR_LEFT_KEY, (node) => {
18
55
  const props = node.componentProperties;
19
56
 
20
- const theme = (() => {
21
- switch (props.OS.value) {
22
- case "Android":
23
- return "android";
24
- case "iOS":
25
- return "cupertino";
26
- }
27
- })();
28
-
29
- const tone = (() => {
30
- switch (props.Variant.value) {
31
- case "Layer Default":
32
- return "layer";
33
- case "Transparent":
34
- return "transparent";
35
- }
36
- })();
37
-
38
- const mainNode = await findAllInstances<AppBarMainProperties>({
39
- key: appBarMainHandler.key,
40
- node,
41
- });
42
- const onlyMainNode = mainNode.length === 1 ? mainNode[0] : undefined;
43
- const main = onlyMainNode ? await appBarMainHandler.codegen(onlyMainNode) : undefined;
44
-
45
- const leftNode = await findAllInstances<AppBarLeftProperties>({
46
- key: appBarLeftHandler.key,
47
- node,
48
- });
49
- const onlyLeftNode = leftNode.length === 1 ? leftNode[0] : undefined;
50
- const left = onlyLeftNode ? await appBarLeftHandler.codegen(onlyLeftNode) : undefined;
51
-
52
- const rightNode = await findAllInstances<AppBarRightProperties>({
53
- key: appBarRightHandler.key,
54
- node,
55
- });
56
- const onlyRightNode = rightNode.length === 1 ? rightNode[0] : undefined;
57
- const right = onlyRightNode ? await appBarRightHandler.codegen(onlyRightNode) : undefined;
58
-
59
- return createElement(
60
- "AppBar",
61
- { theme, tone },
62
- [left, main, right].filter(Boolean),
63
- tone === "transparent"
64
- ? `<AppScreen layerOffsetTop="none">으로 상단 패딩을 제거할 수 있습니다.`
65
- : undefined,
66
- );
67
- },
68
- };
69
-
70
- const appBarMainHandler: ComponentHandler<AppBarMainProperties> = {
71
- key: "336b49b26c3933485d87cc460b06c390976ea58e",
72
- codegen: async ({ componentProperties: props }) => {
73
- const { title, subtitle, layout } = match(props.Type.value)
74
- .with("Title", () => ({
75
- title: props["Title#16944:0"].value,
76
- subtitle: undefined,
77
- layout: undefined,
78
- }))
79
- .with("Title-Subtitle", () => ({
80
- title: props["Title#16944:0"].value,
81
- subtitle: props["Subtitle#16958:9"].value,
82
- layout: "withSubtitle",
83
- }))
84
- .otherwise(() => ({
85
- title: undefined,
86
- subtitle: undefined,
87
- layout: undefined,
88
- }));
89
-
90
- const commonProps = {
91
- title,
92
- subtitle,
93
- layout,
94
- };
95
-
96
- return createElement(
97
- "AppBarMain",
98
- commonProps,
99
- undefined,
100
- title === undefined ? "Title을 제공해주세요." : undefined,
101
- );
102
- },
103
- };
104
-
105
- const appBarLeftHandler: ComponentHandler<AppBarLeftProperties> = {
106
- key: "e5d2e47052a22395db79f195a0991a570dc1b6c9",
107
- codegen: async (node) => {
108
- const props = node.componentProperties;
109
-
110
- const children = await (async () => {
57
+ const children = (() => {
111
58
  switch (props.Action.value) {
112
59
  case "Back":
113
60
  return createElement("AppBarBackButton", undefined);
@@ -125,7 +72,7 @@ const appBarLeftHandler: ComponentHandler<AppBarLeftProperties> = {
125
72
  "AppBarIconButton",
126
73
  undefined,
127
74
  iconComponentKey
128
- ? createElement(createIconTagNameFromKey(iconComponentKey))
75
+ ? createElement(ctx.iconService.createIconTagName(iconComponentKey))
129
76
  : undefined,
130
77
  iconComponentKey === undefined
131
78
  ? "아이콘과, aria-label 또는 aria-labelledby를 제공해주세요."
@@ -136,15 +83,14 @@ const appBarLeftHandler: ComponentHandler<AppBarLeftProperties> = {
136
83
  })();
137
84
 
138
85
  return createElement("AppBarLeft", undefined, children);
139
- },
140
- };
86
+ });
141
87
 
142
- const appBarRightHandler: ComponentHandler<AppBarRightProperties> = {
143
- key: "9e157fc2d1f89ffee938a5bc62f4a58064fec44e",
144
- codegen: async (node) => {
88
+ const APP_BAR_RIGHT_KEY = "9e157fc2d1f89ffee938a5bc62f4a58064fec44e";
89
+ const createAppBarRightTransformer = (ctx: SeedComponentTransformerDeps) =>
90
+ defineComponentTransformer<AppBarRightProperties>(APP_BAR_RIGHT_KEY, (node) => {
145
91
  const props = node.componentProperties;
146
92
 
147
- const children = await (async () => {
93
+ const children = (() => {
148
94
  switch (props.Type.value) {
149
95
  case "1 Text": {
150
96
  const textNode = findOne(
@@ -167,7 +113,7 @@ const appBarRightHandler: ComponentHandler<AppBarRightProperties> = {
167
113
  "AppBarIconButton",
168
114
  undefined,
169
115
  iconComponentKey
170
- ? createElement(createIconTagNameFromKey(iconComponentKey))
116
+ ? createElement(ctx.iconService.createIconTagName(iconComponentKey))
171
117
  : undefined,
172
118
  iconComponentKey === undefined
173
119
  ? "아이콘과, aria-label 또는 aria-labelledby를 제공해주세요."
@@ -179,5 +125,62 @@ const appBarRightHandler: ComponentHandler<AppBarRightProperties> = {
179
125
  })();
180
126
 
181
127
  return createElement("AppBarRight", undefined, children);
182
- },
128
+ });
129
+
130
+ export const createAppBarTransformer = (ctx: SeedComponentTransformerDeps) => {
131
+ const appBarMainTransformer = createAppBarMainTransformer(ctx);
132
+ const appBarLeftTransformer = createAppBarLeftTransformer(ctx);
133
+ const appBarRightTransformer = createAppBarRightTransformer(ctx);
134
+
135
+ return defineComponentTransformer<AppBarProperties>(metadata.standardNavigation.key, (node) => {
136
+ const props = node.componentProperties;
137
+
138
+ const theme = (() => {
139
+ switch (props.OS.value) {
140
+ case "Android":
141
+ return "android";
142
+ case "iOS":
143
+ return "cupertino";
144
+ }
145
+ })();
146
+
147
+ const tone = (() => {
148
+ switch (props.Variant.value) {
149
+ case "Layer Default":
150
+ return "layer";
151
+ case "Transparent":
152
+ return "transparent";
153
+ }
154
+ })();
155
+
156
+ const mainNode = findAllInstances<AppBarMainProperties>({
157
+ key: appBarMainTransformer.key,
158
+ node,
159
+ });
160
+ const onlyMainNode = mainNode.length === 1 ? mainNode[0] : undefined;
161
+ const main = onlyMainNode ? appBarMainTransformer.transform(onlyMainNode) : undefined;
162
+
163
+ const leftNode = findAllInstances<AppBarLeftProperties>({
164
+ key: appBarLeftTransformer.key,
165
+ node,
166
+ });
167
+ const onlyLeftNode = leftNode.length === 1 ? leftNode[0] : undefined;
168
+ const left = onlyLeftNode ? appBarLeftTransformer.transform(onlyLeftNode) : undefined;
169
+
170
+ const rightNode = findAllInstances<AppBarRightProperties>({
171
+ key: appBarRightTransformer.key,
172
+ node,
173
+ });
174
+ const onlyRightNode = rightNode.length === 1 ? rightNode[0] : undefined;
175
+ const right = onlyRightNode ? appBarRightTransformer.transform(onlyRightNode) : undefined;
176
+
177
+ return createElement(
178
+ "AppBar",
179
+ { theme, tone },
180
+ [left, main, right].filter(Boolean),
181
+ tone === "transparent"
182
+ ? `<AppScreen layerOffsetTop="none">으로 상단 패딩을 제거할 수 있습니다.`
183
+ : undefined,
184
+ );
185
+ });
183
186
  };
@@ -0,0 +1,30 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import { findAllInstances } from "../../../../utils/figma-node";
5
+ import type { AvatarProperties, AvatarStackProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+ import { createAvatarTransformer } from "./avatar";
8
+
9
+ export const createAvatarStackTransformer = (ctx: SeedComponentTransformerDeps) => {
10
+ const avatarTransformer = createAvatarTransformer(ctx);
11
+
12
+ return defineComponentTransformer<AvatarStackProperties>(metadata.avatarStack.key, (node) => {
13
+ const avatarNodes = findAllInstances<AvatarProperties>({
14
+ node,
15
+ key: avatarTransformer.key,
16
+ });
17
+
18
+ const { componentProperties: props } = node;
19
+
20
+ const commonProps = {
21
+ size: props.Size.value,
22
+ // TODO: 구현될 예정
23
+ // topItem: camelCase(props["Top Item"].value),
24
+ };
25
+
26
+ const avatarStackChildren = avatarNodes.map(avatarTransformer.transform);
27
+
28
+ return createElement("AvatarStack", commonProps, avatarStackChildren);
29
+ });
30
+ };
@@ -0,0 +1,39 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import { findAllInstances } from "../../../../utils/figma-node";
5
+ import type { AvatarProperties, IdentityPlaceholderProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+ import { createIdentityPlaceholderTransformer } from "./identity-placeholder";
8
+
9
+ export const createAvatarTransformer = (ctx: SeedComponentTransformerDeps) => {
10
+ const identityPlaceholderTransformer = createIdentityPlaceholderTransformer(ctx);
11
+
12
+ return defineComponentTransformer<AvatarProperties>(metadata.avatar.key, (node) => {
13
+ const [placeholder] = findAllInstances<IdentityPlaceholderProperties>({
14
+ node,
15
+ key: identityPlaceholderTransformer.key,
16
+ });
17
+ const { componentProperties: props } = node;
18
+
19
+ const avatarHasSrc = props["Show Image#71850:57"].value;
20
+
21
+ const commonProps = {
22
+ ...(avatarHasSrc && {
23
+ // Placeholder
24
+ src: `https://placehold.co/${props.Size.value}x${props.Size.value}`,
25
+ }),
26
+ ...(placeholder && {
27
+ fallback: identityPlaceholderTransformer.transform(placeholder),
28
+ }),
29
+ size: props.Size.value,
30
+ };
31
+
32
+ return createElement(
33
+ "Avatar",
34
+ commonProps,
35
+ props["Show Badge#1398:26"].value ? createElement("AvatarBadge", {}) : undefined,
36
+ avatarHasSrc ? "alt 텍스트를 제공해야 합니다." : undefined,
37
+ );
38
+ });
39
+ };
@@ -0,0 +1,22 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import { handleSizeProp } from "../size";
6
+ import type { BadgeProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createBadgeTransformer = (_ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<BadgeProperties>(
11
+ metadata.badge.key,
12
+ ({ componentProperties: props }) => {
13
+ const commonProps = {
14
+ size: handleSizeProp(props.Size.value),
15
+ tone: camelCase(props.Tone.value),
16
+ variant: camelCase(props.Variant.value),
17
+ shape: camelCase(props.Shape.value),
18
+ };
19
+
20
+ return createElement("Badge", commonProps, props["Label#1584:0"].value);
21
+ },
22
+ );
@@ -0,0 +1,90 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import type { NormalizedTextNode } from "../../../../normalizer";
6
+ import type { CalloutProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createCalloutTransformer = (ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<CalloutProperties>(
11
+ metadata.callout.key,
12
+ ({ componentProperties: props, children }) => {
13
+ const tag = (() => {
14
+ switch (props.Interaction.value) {
15
+ case "Default":
16
+ return "Callout";
17
+ case "Actionable":
18
+ return "ActionableCallout";
19
+ case "Dismissible":
20
+ return "DismissibleCallout";
21
+ default:
22
+ return "Callout";
23
+ }
24
+ })();
25
+
26
+ const textNode = children.find((child) => child.type === "TEXT") as NormalizedTextNode | null;
27
+
28
+ if (!textNode) {
29
+ return createElement(tag, undefined, undefined, "내용을 제공해주세요.");
30
+ }
31
+
32
+ const slices = textNode.segments;
33
+
34
+ let title: string | undefined;
35
+ let description: string | undefined;
36
+ let linkLabel: string | undefined;
37
+
38
+ switch (slices.length) {
39
+ case 1: {
40
+ description = slices[0]?.characters.trim();
41
+
42
+ break;
43
+ }
44
+ case 2: {
45
+ const firstSlice = slices[0];
46
+ const secondSlice = slices[1];
47
+
48
+ if (firstSlice?.style.fontWeight === 700) {
49
+ title = firstSlice?.characters.trim();
50
+ description = secondSlice?.characters.trim();
51
+ break;
52
+ }
53
+
54
+ description = firstSlice?.characters.trim();
55
+
56
+ if (tag !== "ActionableCallout") {
57
+ linkLabel = secondSlice?.characters.trim();
58
+ }
59
+
60
+ break;
61
+ }
62
+ case 3: {
63
+ title = slices[0]?.characters.trim();
64
+ description = slices[1]?.characters.trim();
65
+
66
+ if (tag !== "ActionableCallout") {
67
+ linkLabel = slices[2]?.characters.trim();
68
+ }
69
+
70
+ break;
71
+ }
72
+ }
73
+
74
+ const commonProps = {
75
+ tone: camelCase(props.Tone.value),
76
+ title,
77
+ description,
78
+ linkProps: {
79
+ children: linkLabel,
80
+ },
81
+ ...(props["Icon#12598:210"].value && {
82
+ prefixIcon: createElement(
83
+ ctx.iconService.createIconTagName(props["Icon#12598:210"].componentKey),
84
+ ),
85
+ }),
86
+ };
87
+
88
+ return createElement(tag, commonProps);
89
+ },
90
+ );
@@ -0,0 +1,34 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import { handleSizeProp } from "../size";
6
+ import type { CheckboxProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createCheckboxTransformer = (_ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<CheckboxProperties>(
11
+ metadata.checkbox.key,
12
+ ({ componentProperties: props }) => {
13
+ const states = props.State.value.split("-");
14
+
15
+ const commonProps = {
16
+ label: props["Label#49990:0"].value,
17
+ weight: camelCase(props.Weight.value),
18
+ variant: camelCase(props.Shape.value),
19
+ size: handleSizeProp(props.Size.value),
20
+ ...(states.includes("Selected") && {
21
+ defaultChecked: true,
22
+ }),
23
+ ...(states.includes("Indeterminate") && {
24
+ defaultChecked: true,
25
+ indeterminate: true,
26
+ }),
27
+ ...(states.includes("Disabled") && {
28
+ disabled: true,
29
+ }),
30
+ };
31
+
32
+ return createElement("Checkbox", commonProps);
33
+ },
34
+ );
@@ -0,0 +1,55 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import { findAllInstances } from "../../../../utils/figma-node";
6
+ import type { ChipTabsItemProperties, ChipTabsProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ const CHIP_TABS_ITEM_KEY = "fa80168b02051fbb0ba032238bd76d840dbe2e15";
10
+ const createChipTabsItemTransformer = (_ctx: SeedComponentTransformerDeps) =>
11
+ defineComponentTransformer<ChipTabsItemProperties>(
12
+ CHIP_TABS_ITEM_KEY,
13
+ ({ componentProperties: props }) => {
14
+ const states = props.State.value.split("-");
15
+
16
+ const commonProps = {
17
+ value: props["Label#8876:0"].value,
18
+ ...(states.includes("Disabled") && {
19
+ disabled: true,
20
+ }),
21
+ };
22
+
23
+ return createElement("ChipTabsTrigger", commonProps, props["Label#8876:0"].value);
24
+ },
25
+ );
26
+
27
+ export const createChipTabsTransformer = (ctx: SeedComponentTransformerDeps) => {
28
+ const chipTabsItemTransformer = createChipTabsItemTransformer(ctx);
29
+
30
+ return defineComponentTransformer<ChipTabsProperties>(metadata.chipTablist.key, (node) => {
31
+ const chipTabsItems = findAllInstances<ChipTabsItemProperties>({
32
+ node,
33
+ key: chipTabsItemTransformer.key,
34
+ });
35
+
36
+ const selectedChipTabsItem = chipTabsItems.find((chipTabsItem) =>
37
+ chipTabsItem.componentProperties.State.value.split("-").includes("Selected"),
38
+ );
39
+
40
+ const chipTabsList = createElement(
41
+ "ChipTabsList",
42
+ undefined,
43
+ chipTabsItems.map(chipTabsItemTransformer.transform),
44
+ );
45
+
46
+ const commonProps = {
47
+ variant: camelCase(node.componentProperties.Variant.value),
48
+ ...(selectedChipTabsItem && {
49
+ defaultValue: selectedChipTabsItem.componentProperties["Label#8876:0"].value,
50
+ }),
51
+ };
52
+
53
+ return createElement("ChipTabs", commonProps, chipTabsList);
54
+ });
55
+ };
@@ -0,0 +1,86 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { match } from "ts-pattern";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import { handleSizeProp } from "../size";
6
+ import type { ControlChipProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createControlChipTransformer = (ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<ControlChipProperties>(
11
+ metadata.controlChip.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#8722:41"].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#8722: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#8722:82"].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#8722:0"].componentKey),
54
+ ),
55
+ }),
56
+ props["Label#7185:0"].value,
57
+ createElement("SuffixIcon", {
58
+ svg: createElement(
59
+ ctx.iconService.createIconTagName(props["Suffix Icon#8722:82"].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("Selected") && {
74
+ defaultChecked: true,
75
+ }),
76
+ ...(states.includes("Disabled") && {
77
+ disabled: true,
78
+ }),
79
+ ...(props["Show Count#7185:42"].value && {
80
+ count: Number(props["Count#7185:21"].value),
81
+ }),
82
+ };
83
+
84
+ return createElement("ControlChip.Toggle", commonProps, children);
85
+ },
86
+ );
@@ -0,0 +1,39 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import * as metadata from "../../../data/__generated__/component-sets";
4
+ import { createElement } from "../../../core/jsx";
5
+ import { findAllInstances } from "../../../../utils/figma-node";
6
+ import type { ActionButtonProperties, ErrorStateProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+ import { createActionButtonTransformer } from "./action-button";
9
+
10
+ export const createErrorStateTransformer = (ctx: SeedComponentTransformerDeps) => {
11
+ const actionButtonTransformer = createActionButtonTransformer(ctx);
12
+
13
+ return defineComponentTransformer<ErrorStateProperties>(metadata.errorState.key, (node) => {
14
+ const props = node.componentProperties;
15
+
16
+ const [actionButtonNode] = findAllInstances<ActionButtonProperties>({
17
+ node,
18
+ key: actionButtonTransformer.key,
19
+ });
20
+
21
+ const commonProps = {
22
+ variant: camelCase(props.Variant.value),
23
+ ...(props.Layout.value === "With Title" && {
24
+ title: props["Title#16237:0"].value,
25
+ }),
26
+ description: props["Description#16237:5"].value,
27
+ ...(actionButtonNode && {
28
+ primaryActionProps: {
29
+ children: actionButtonTransformer.transform(actionButtonNode).children[0],
30
+ },
31
+ secondaryActionProps: {
32
+ children: props["Secondary Action Label#17042:0"].value,
33
+ },
34
+ }),
35
+ };
36
+
37
+ return createElement("ErrorState", commonProps);
38
+ });
39
+ };