@seed-design/figma 0.0.2 → 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 (185) hide show
  1. package/lib/index.cjs +10622 -12209
  2. package/lib/index.d.ts +1734 -18
  3. package/lib/index.js +10598 -12210
  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 -1
  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/codegen/domain/seed-component/transformers/app-bar.ts +186 -0
  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/codegen/domain/seed-component/transformers/inline-banner.ts +81 -0
  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/codegen/domain/seed-component/transformers/text-button.ts +55 -0
  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 -3
  73. package/src/normalizer/from-plugin.ts +52 -31
  74. package/src/normalizer/from-rest.ts +27 -5
  75. package/src/normalizer/index.ts +3 -0
  76. package/src/normalizer/types.ts +81 -31
  77. package/src/utils/common.ts +34 -0
  78. package/src/utils/css.ts +13 -0
  79. package/src/{node-util.ts → utils/figma-node.ts} +1 -1
  80. package/src/utils/figma-variable.ts +13 -0
  81. package/src/color.ts +0 -78
  82. package/src/component/index.ts +0 -1688
  83. package/src/generate-code.ts +0 -213
  84. package/src/icon.ts +0 -46
  85. package/src/layout.ts +0 -289
  86. package/src/sizing.ts +0 -58
  87. package/src/text.ts +0 -20
  88. package/src/util.ts +0 -17
  89. package/src/variable.ts +0 -66
  90. /package/src/{data → codegen/data}/__generated__/component-sets/action-button.d.ts +0 -0
  91. /package/src/{data → codegen/data}/__generated__/component-sets/action-button.mjs +0 -0
  92. /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.d.ts +0 -0
  93. /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.mjs +0 -0
  94. /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.d.ts +0 -0
  95. /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.mjs +0 -0
  96. /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.d.ts +0 -0
  97. /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.mjs +0 -0
  98. /package/src/{data → codegen/data}/__generated__/component-sets/avatar.d.ts +0 -0
  99. /package/src/{data → codegen/data}/__generated__/component-sets/avatar.mjs +0 -0
  100. /package/src/{data → codegen/data}/__generated__/component-sets/badge.d.ts +0 -0
  101. /package/src/{data → codegen/data}/__generated__/component-sets/badge.mjs +0 -0
  102. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.d.ts +0 -0
  103. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.mjs +0 -0
  104. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.d.ts +0 -0
  105. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.mjs +0 -0
  106. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.d.ts +0 -0
  107. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.mjs +0 -0
  108. /package/src/{data → codegen/data}/__generated__/component-sets/callout.d.ts +0 -0
  109. /package/src/{data → codegen/data}/__generated__/component-sets/callout.mjs +0 -0
  110. /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.d.ts +0 -0
  111. /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.mjs +0 -0
  112. /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.d.ts +0 -0
  113. /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.mjs +0 -0
  114. /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.d.ts +0 -0
  115. /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.mjs +0 -0
  116. /package/src/{data → codegen/data}/__generated__/component-sets/divider.d.ts +0 -0
  117. /package/src/{data → codegen/data}/__generated__/component-sets/divider.mjs +0 -0
  118. /package/src/{data → codegen/data}/__generated__/component-sets/error-state.d.ts +0 -0
  119. /package/src/{data → codegen/data}/__generated__/component-sets/error-state.mjs +0 -0
  120. /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.d.ts +0 -0
  121. /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.mjs +0 -0
  122. /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.d.ts +0 -0
  123. /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.mjs +0 -0
  124. /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.d.ts +0 -0
  125. /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.mjs +0 -0
  126. /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.d.ts +0 -0
  127. /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.mjs +0 -0
  128. /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.d.ts +0 -0
  129. /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.mjs +0 -0
  130. /package/src/{data → codegen/data}/__generated__/component-sets/index.d.ts +0 -0
  131. /package/src/{data → codegen/data}/__generated__/component-sets/index.mjs +0 -0
  132. /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.d.ts +0 -0
  133. /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.mjs +0 -0
  134. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.d.ts +0 -0
  135. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.mjs +0 -0
  136. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.d.ts +0 -0
  137. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.mjs +0 -0
  138. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.d.ts +0 -0
  139. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.mjs +0 -0
  140. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.d.ts +0 -0
  141. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.mjs +0 -0
  142. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.d.ts +0 -0
  143. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.mjs +0 -0
  144. /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.d.ts +0 -0
  145. /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.mjs +0 -0
  146. /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.d.ts +0 -0
  147. /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.mjs +0 -0
  148. /package/src/{data → codegen/data}/__generated__/component-sets/radio.d.ts +0 -0
  149. /package/src/{data → codegen/data}/__generated__/component-sets/radio.mjs +0 -0
  150. /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.d.ts +0 -0
  151. /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.mjs +0 -0
  152. /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.d.ts +0 -0
  153. /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.mjs +0 -0
  154. /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.d.ts +0 -0
  155. /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.mjs +0 -0
  156. /package/src/{data → codegen/data}/__generated__/component-sets/select-box.d.ts +0 -0
  157. /package/src/{data → codegen/data}/__generated__/component-sets/select-box.mjs +0 -0
  158. /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.d.ts +0 -0
  159. /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.mjs +0 -0
  160. /package/src/{data → codegen/data}/__generated__/component-sets/slider.d.ts +0 -0
  161. /package/src/{data → codegen/data}/__generated__/component-sets/slider.mjs +0 -0
  162. /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.d.ts +0 -0
  163. /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.mjs +0 -0
  164. /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.d.ts +0 -0
  165. /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.mjs +0 -0
  166. /package/src/{data → codegen/data}/__generated__/component-sets/switch.d.ts +0 -0
  167. /package/src/{data → codegen/data}/__generated__/component-sets/switch.mjs +0 -0
  168. /package/src/{data → codegen/data}/__generated__/component-sets/tablist.d.ts +0 -0
  169. /package/src/{data → codegen/data}/__generated__/component-sets/tablist.mjs +0 -0
  170. /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.d.ts +0 -0
  171. /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.mjs +0 -0
  172. /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.d.ts +0 -0
  173. /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.mjs +0 -0
  174. /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.d.ts +0 -0
  175. /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.mjs +0 -0
  176. /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.d.ts +0 -0
  177. /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.mjs +0 -0
  178. /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.d.ts +0 -0
  179. /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.mjs +0 -0
  180. /package/src/{data → codegen/data}/__generated__/component-sets/text-button.d.ts +0 -0
  181. /package/src/{data → codegen/data}/__generated__/component-sets/text-button.mjs +0 -0
  182. /package/src/{data → codegen/data}/__generated__/component-sets/text-field.d.ts +0 -0
  183. /package/src/{data → codegen/data}/__generated__/component-sets/text-field.mjs +0 -0
  184. /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.d.ts +0 -0
  185. /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.mjs +0 -0
@@ -0,0 +1,186 @@
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 { findAll, findAllInstances, findOne } from "../../../../utils/figma-node";
6
+ import type { NormalizedInstanceNode, NormalizedTextNode } from "../../../../normalizer";
7
+ import type {
8
+ AppBarLeftProperties,
9
+ AppBarMainProperties,
10
+ AppBarProperties,
11
+ AppBarRightProperties,
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) => {
55
+ const props = node.componentProperties;
56
+
57
+ const children = (() => {
58
+ switch (props.Action.value) {
59
+ case "Back":
60
+ return createElement("AppBarBackButton", undefined);
61
+ case "Close":
62
+ return createElement("AppBarCloseButton", undefined);
63
+ case "Other": {
64
+ const iconNode = findOne(
65
+ node,
66
+ (child) => child.type === "INSTANCE" && child.name === "Icon",
67
+ ) as NormalizedInstanceNode | null;
68
+
69
+ const iconComponentKey = iconNode?.componentKey ?? undefined;
70
+
71
+ return createElement(
72
+ "AppBarIconButton",
73
+ undefined,
74
+ iconComponentKey
75
+ ? createElement(ctx.iconService.createIconTagName(iconComponentKey))
76
+ : undefined,
77
+ iconComponentKey === undefined
78
+ ? "아이콘과, aria-label 또는 aria-labelledby를 제공해주세요."
79
+ : "aria-label 또는 aria-labelledby를 제공해주세요.",
80
+ );
81
+ }
82
+ }
83
+ })();
84
+
85
+ return createElement("AppBarLeft", undefined, children);
86
+ });
87
+
88
+ const APP_BAR_RIGHT_KEY = "9e157fc2d1f89ffee938a5bc62f4a58064fec44e";
89
+ const createAppBarRightTransformer = (ctx: SeedComponentTransformerDeps) =>
90
+ defineComponentTransformer<AppBarRightProperties>(APP_BAR_RIGHT_KEY, (node) => {
91
+ const props = node.componentProperties;
92
+
93
+ const children = (() => {
94
+ switch (props.Type.value) {
95
+ case "1 Text": {
96
+ const textNode = findOne(
97
+ node,
98
+ (child) => child.type === "TEXT",
99
+ ) as NormalizedTextNode | null;
100
+
101
+ return textNode?.characters;
102
+ }
103
+ default: {
104
+ const iconNodes = findAll(
105
+ node,
106
+ (child) => child.type === "INSTANCE" && child.name === "Icon",
107
+ ) as NormalizedInstanceNode[];
108
+
109
+ const iconComponentKeys = iconNodes.map((iconNode) => iconNode.componentKey);
110
+
111
+ return iconComponentKeys.map((iconComponentKey) =>
112
+ createElement(
113
+ "AppBarIconButton",
114
+ undefined,
115
+ iconComponentKey
116
+ ? createElement(ctx.iconService.createIconTagName(iconComponentKey))
117
+ : undefined,
118
+ iconComponentKey === undefined
119
+ ? "아이콘과, aria-label 또는 aria-labelledby를 제공해주세요."
120
+ : "aria-label 또는 aria-labelledby를 제공해주세요.",
121
+ ),
122
+ );
123
+ }
124
+ }
125
+ })();
126
+
127
+ return createElement("AppBarRight", undefined, children);
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
+ });
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
+ };
@@ -0,0 +1,99 @@
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 {
7
+ ExtendedActionSheetGroupProperties,
8
+ ExtendedActionSheetItemProperties,
9
+ ExtendedActionSheetProperties,
10
+ } from "../properties.type";
11
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
12
+
13
+ const EXTENDED_ACTION_SHEET_ITEM_KEY = "057083e95466da59051119eec0b41d4ad5a07f8f";
14
+ const createExtendedActionSheetItemTransformer = (ctx: SeedComponentTransformerDeps) =>
15
+ defineComponentTransformer<ExtendedActionSheetItemProperties>(
16
+ EXTENDED_ACTION_SHEET_ITEM_KEY,
17
+ ({ componentProperties: props }) => {
18
+ const states = props.State.value.split("-");
19
+
20
+ const commonProps = {
21
+ tone: camelCase(props.Tone.value),
22
+ ...(states.includes("Disabled") && {
23
+ disabled: true,
24
+ }),
25
+ };
26
+
27
+ return createElement("ExtendedActionSheetItem", commonProps, [
28
+ props["Show Prefix Icon#17043:5"].value
29
+ ? createElement("PrefixIcon", {
30
+ svg: createElement(
31
+ ctx.iconService.createIconTagName(props["Prefix Icon#55948:0"].componentKey),
32
+ ),
33
+ })
34
+ : undefined,
35
+ props["Label#55905:8"].value,
36
+ ]);
37
+ },
38
+ );
39
+
40
+ const EXTENDED_ACTION_SHEET_GROUP_KEY = "2a504a1c6b7810d5e652862dcba2cb7048f9eb16";
41
+ const createExtendedActionSheetGroupTransformer = (ctx: SeedComponentTransformerDeps) => {
42
+ const extendedActionSheetItemTransformer = createExtendedActionSheetItemTransformer(ctx);
43
+
44
+ return defineComponentTransformer<ExtendedActionSheetGroupProperties>(
45
+ EXTENDED_ACTION_SHEET_GROUP_KEY,
46
+ (node) => {
47
+ const items = findAllInstances<ExtendedActionSheetItemProperties>({
48
+ node,
49
+ key: extendedActionSheetItemTransformer.key,
50
+ });
51
+
52
+ const contentChildren = items.map(extendedActionSheetItemTransformer.transform);
53
+
54
+ return createElement("ExtendedActionSheetGroup", undefined, contentChildren);
55
+ },
56
+ );
57
+ };
58
+
59
+ export const createExtendedActionSheetTransformer = (ctx: SeedComponentTransformerDeps) => {
60
+ const extendedActionSheetGroupTransformer = createExtendedActionSheetGroupTransformer(ctx);
61
+
62
+ return defineComponentTransformer<ExtendedActionSheetProperties>(
63
+ metadata.extendedActionSheet.key,
64
+ (node) => {
65
+ const { componentProperties: props } = node;
66
+
67
+ const groups = findAllInstances<ExtendedActionSheetGroupProperties>({
68
+ node,
69
+ key: extendedActionSheetGroupTransformer.key,
70
+ });
71
+
72
+ const contentChildren = groups.map(extendedActionSheetGroupTransformer.transform);
73
+
74
+ const title = props["Show Title#17043:12"].value ? props["Title#14599:0"].value : undefined;
75
+
76
+ const content = createElement(
77
+ "ExtendedActionSheetContent",
78
+ { title },
79
+ contentChildren,
80
+ title
81
+ ? undefined
82
+ : "title을 제공하지 않는 경우 aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
83
+ );
84
+
85
+ const trigger = createElement(
86
+ "ExtendedActionSheetTrigger",
87
+ { asChild: true },
88
+ createElement(
89
+ "ActionButton",
90
+ undefined,
91
+ "열기",
92
+ "ExtendedActionSheet을 여는 요소를 제공해주세요.",
93
+ ),
94
+ );
95
+
96
+ return createElement("ExtendedActionSheet", undefined, [trigger, content]);
97
+ },
98
+ );
99
+ };