@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,25 @@
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 { ExtendedFabProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createExtendedFabTransformer = (ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<ExtendedFabProperties>(
11
+ metadata.extendedFloatingActionButton.key,
12
+ ({ componentProperties: props }) => {
13
+ const commonProps = {
14
+ size: handleSizeProp(props.Size.value),
15
+ variant: camelCase(props.Variant.value),
16
+ };
17
+
18
+ return createElement("ExtendedFab", commonProps, [
19
+ createElement("PrefixIcon", {
20
+ svg: createElement(ctx.iconService.createIconTagName(props["Icon#28796:0"].componentKey)),
21
+ }),
22
+ props["Label#28936:0"].value,
23
+ ]);
24
+ },
25
+ );
@@ -0,0 +1,18 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import type { FabProperties } from "../properties.type";
5
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
6
+
7
+ export const createFabTransformer = (ctx: SeedComponentTransformerDeps) =>
8
+ defineComponentTransformer<FabProperties>(
9
+ metadata.floatingActionButton.key,
10
+ ({ componentProperties: props }) => {
11
+ return createElement(
12
+ "Fab",
13
+ undefined,
14
+ createElement(ctx.iconService.createIconTagName(props["Icon#28796:0"].componentKey)),
15
+ "aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
16
+ );
17
+ },
18
+ );
@@ -0,0 +1,68 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import type { HelpBubbleProperties } from "../properties.type";
5
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
6
+
7
+ export const createHelpBubbleTransformer = (_ctx: SeedComponentTransformerDeps) =>
8
+ defineComponentTransformer<HelpBubbleProperties>(
9
+ metadata.helpBubble.key,
10
+ ({ componentProperties: props }) => {
11
+ const placement:
12
+ | "top"
13
+ | "right"
14
+ | "bottom"
15
+ | "left"
16
+ | "top-end"
17
+ | "top-start"
18
+ | "right-end"
19
+ | "right-start"
20
+ | "bottom-end"
21
+ | "bottom-start"
22
+ | "left-end"
23
+ | "left-start" = (() => {
24
+ switch (props.Placement.value) {
25
+ case "Bottom-Left":
26
+ return "top-start";
27
+ case "Bottom-Center":
28
+ return "top";
29
+ case "Bottom-Right":
30
+ return "top-end";
31
+ case "Left-Top":
32
+ return "right-start";
33
+ case "Left-Center":
34
+ return "right";
35
+ case "Left-Bottom":
36
+ return "right-end";
37
+ case "Top-Left":
38
+ return "bottom-start";
39
+ case "Top-Center":
40
+ return "bottom";
41
+ case "Top-Right":
42
+ return "bottom-end";
43
+ case "Right-Top":
44
+ return "left-start";
45
+ case "Right-Center":
46
+ return "left";
47
+ case "Right-Bottom":
48
+ return "left-end";
49
+ }
50
+ })();
51
+
52
+ const commonProps = {
53
+ title: props["Title#62535:0"].value,
54
+ ...(props["Show Description#62499:0"].value && {
55
+ description: props["Description#62535:98"].value,
56
+ }),
57
+ showCloseButton: props["Show Close Button"].value === "True",
58
+ defaultOpen: true,
59
+ placement,
60
+ };
61
+
62
+ return createElement(
63
+ "HelpBubbleTrigger",
64
+ commonProps,
65
+ createElement("ActionButton", undefined, "열기", "HelpBubble을 여는 요소를 제공해주세요."),
66
+ );
67
+ },
68
+ );
@@ -0,0 +1,18 @@
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 { IdentityPlaceholderProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createIdentityPlaceholderTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<IdentityPlaceholderProperties>(
10
+ metadata.identityPlaceholder.key,
11
+ ({ componentProperties: props }) => {
12
+ const commonProps = {
13
+ identity: camelCase(props.Identity.value),
14
+ };
15
+
16
+ return createElement("IdentityPlaceholder", commonProps);
17
+ },
18
+ );
@@ -0,0 +1,81 @@
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 { findOne } from "../../../../utils/figma-node";
6
+ import type { NormalizedInstanceNode, NormalizedTextNode } from "../../../../normalizer";
7
+ import type { InlineBannerProperties } from "../properties.type";
8
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
9
+
10
+ export const createInlineBannerTransformer = (ctx: SeedComponentTransformerDeps) =>
11
+ defineComponentTransformer<InlineBannerProperties>(metadata.inlineBanner.key, (node) => {
12
+ const { componentProperties: props } = node;
13
+
14
+ const tag = (() => {
15
+ switch (props.Interaction.value) {
16
+ case "Default":
17
+ return "InlineBanner";
18
+ case "Actionable":
19
+ return "ActionableInlineBanner";
20
+ case "Dismissible":
21
+ return "DismissibleInlineBanner";
22
+ case "Link":
23
+ return "InlineBanner";
24
+ default:
25
+ return "InlineBanner";
26
+ }
27
+ })();
28
+
29
+ const textNode = findOne(
30
+ node,
31
+ (child) => child.type === "TEXT" && child.name === "Label",
32
+ ) as NormalizedTextNode | null;
33
+
34
+ if (!textNode) {
35
+ return createElement(tag, undefined, undefined, "내용을 제공해주세요.");
36
+ }
37
+
38
+ const slices = textNode.segments;
39
+
40
+ let title: string | undefined;
41
+ let description: string | undefined;
42
+
43
+ switch (slices.length) {
44
+ case 1: {
45
+ description = slices[0]?.characters.trim();
46
+
47
+ break;
48
+ }
49
+ case 2: {
50
+ title = slices[0]?.characters.trim();
51
+ description = slices[1]?.characters.trim();
52
+
53
+ break;
54
+ }
55
+ }
56
+
57
+ const iconNode = findOne(
58
+ node,
59
+ (child) => child.type === "INSTANCE" && child.name === "icon",
60
+ ) as NormalizedInstanceNode | null;
61
+
62
+ const iconComponentKey =
63
+ props["Show Icon#11840:27"] && iconNode ? iconNode.componentKey : undefined;
64
+ const prefixIcon = iconComponentKey
65
+ ? createElement(ctx.iconService.createIconTagName(iconComponentKey))
66
+ : undefined;
67
+
68
+ const commonProps = {
69
+ variant: camelCase(props.Variant.value),
70
+ title,
71
+ description,
72
+ ...(props.Interaction.value === "Link" && {
73
+ linkProps: {
74
+ children: props["Link Label#1547:81"].value,
75
+ },
76
+ }),
77
+ prefixIcon,
78
+ };
79
+
80
+ return createElement(tag, commonProps);
81
+ });
@@ -0,0 +1,19 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import type { MannerTempBadgeProperties } from "../properties.type";
5
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
6
+
7
+ export const createMannerTempBadgeTransformer = (_ctx: SeedComponentTransformerDeps) =>
8
+ defineComponentTransformer<MannerTempBadgeProperties>(
9
+ metadata.mannerTempBadge.key,
10
+ ({ children }) => {
11
+ const textNode = children.find((child) => child.type === "TEXT");
12
+
13
+ const commonProps = {
14
+ temperature: Number(textNode?.characters.replace(/[^\d.-]/g, "") ?? "-1"),
15
+ };
16
+
17
+ return createElement("MannerTempBadge", commonProps);
18
+ },
19
+ );
@@ -0,0 +1,82 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import { handleSizeProp } from "../size";
5
+ import type { MultilineTextFieldProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createMultilineTextFieldTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<MultilineTextFieldProperties>(
10
+ metadata.multilineTextField.key,
11
+ ({ componentProperties: props }) => {
12
+ const {
13
+ Size: { value: size },
14
+ State: { value: state },
15
+ Filled: { value: filled },
16
+ "Show Header#870:0": { value: showHeader },
17
+ "Label#15327:323": { value: label },
18
+ "Show Indicator#1259:0": { value: showIndicator },
19
+ "Indicator#15327:286": { value: indicator },
20
+ "Placeholder#958:0": { value: placeholder },
21
+ "Filled Text#1304:0": { value: defaultValue },
22
+ "Show Footer#958:25": { value: showFooter },
23
+ "Show Description#958:50": { value: showDescription },
24
+ "Description#15327:212": { value: description },
25
+ "Show Character count#958:75": { value: showCharacterCount },
26
+ "Character Count#15327:360": { value: _characterCount },
27
+ "Max Character Count#15327:175": { value: maxCharacterCount },
28
+ } = props;
29
+
30
+ const states = state.split("-");
31
+
32
+ const commonProps = {
33
+ size: handleSizeProp(size),
34
+ // header
35
+ ...(showHeader && {
36
+ label,
37
+ }),
38
+ ...(showHeader &&
39
+ showIndicator && {
40
+ indicator,
41
+ }),
42
+ // input
43
+ ...(filled === "True" && {
44
+ defaultValue,
45
+ }),
46
+ ...(states.includes("Invalid") && {
47
+ invalid: true,
48
+ }),
49
+ ...(states.includes("Disabled") && {
50
+ disabled: true,
51
+ }),
52
+ ...(states.includes("Read Only") && {
53
+ readOnly: true,
54
+ }),
55
+ // footer
56
+ ...(showFooter &&
57
+ showDescription &&
58
+ states.includes("Invalid") && {
59
+ // invalid인 경우 description을 error로 사용
60
+ errorMessage: description,
61
+ }),
62
+ ...(showFooter &&
63
+ showDescription &&
64
+ !states.includes("Invalid") && {
65
+ // invalid가 아닌 경우 description을 description으로 사용
66
+ description,
67
+ }),
68
+ ...(showFooter &&
69
+ showCharacterCount && {
70
+ maxGraphemeCount: Number(maxCharacterCount),
71
+ }),
72
+ };
73
+
74
+ const inputProps = {
75
+ placeholder,
76
+ };
77
+
78
+ const TextFieldChildren = createElement("TextFieldTextarea", inputProps);
79
+
80
+ return createElement("TextField", commonProps, TextFieldChildren);
81
+ },
82
+ );
@@ -0,0 +1,51 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import { camelCase } from "change-case";
3
+ import { match } from "ts-pattern";
4
+ import * as metadata from "../../../data/__generated__/component-sets";
5
+ import { createElement } from "../../../core/jsx";
6
+ import type { ProgressCircleProperties } from "../properties.type";
7
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+
9
+ export const createProgressCircleTransformer = (_ctx: SeedComponentTransformerDeps) =>
10
+ defineComponentTransformer<ProgressCircleProperties>(
11
+ metadata.progressCircle.key,
12
+ ({ componentProperties: props }) => {
13
+ const { value, minValue, maxValue } = match(props.Value.value)
14
+ .with("Indeterminate", () => ({
15
+ value: undefined,
16
+ minValue: undefined,
17
+ maxValue: undefined,
18
+ }))
19
+ .with("0%", () => ({
20
+ value: 0,
21
+ minValue: 0,
22
+ maxValue: 100,
23
+ }))
24
+ .with("25%", () => ({
25
+ value: 25,
26
+ minValue: 0,
27
+ maxValue: 100,
28
+ }))
29
+ .with("75%", () => ({
30
+ value: 75,
31
+ minValue: 0,
32
+ maxValue: 100,
33
+ }))
34
+ .with("100%", () => ({
35
+ value: 100,
36
+ minValue: 0,
37
+ maxValue: 100,
38
+ }))
39
+ .exhaustive();
40
+
41
+ const commonProps = {
42
+ value,
43
+ minValue,
44
+ maxValue,
45
+ size: props.Size.value,
46
+ tone: camelCase(props.Tone.value),
47
+ };
48
+
49
+ return createElement("ProgressCircle", commonProps);
50
+ },
51
+ );
@@ -0,0 +1,37 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import { handleSizeProp } from "../size";
5
+ import type { ReactionButtonProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createReactionButtonTransformer = (ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<ReactionButtonProperties>(
10
+ metadata.reactionButton.key,
11
+ ({ componentProperties: props }) => {
12
+ const states = props.State.value.split("-");
13
+
14
+ const commonProps = {
15
+ size: handleSizeProp(props.Size.value),
16
+ ...(states.includes("Loading") && {
17
+ loading: true,
18
+ }),
19
+ ...(states.includes("Disabled") && {
20
+ disabled: true,
21
+ }),
22
+ ...(states.includes("Selected") && {
23
+ defaultPressed: true,
24
+ }),
25
+ };
26
+
27
+ return createElement("ReactionButton", commonProps, [
28
+ createElement("PrefixIcon", {
29
+ svg: createElement(ctx.iconService.createIconTagName(props["Icon#12379:0"].componentKey)),
30
+ }),
31
+ props["Label#6397:0"].value,
32
+ props["Show Count#6397:33"].value
33
+ ? createElement("Count", {}, props["Count#15816:0"].value)
34
+ : undefined,
35
+ ]);
36
+ },
37
+ );
@@ -0,0 +1,59 @@
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 {
6
+ SegmentedControlItemProperties,
7
+ SegmentedControlProperties,
8
+ } from "../properties.type";
9
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
10
+
11
+ const SEGMENTED_CONTROL_ITEM_KEY = "9a7ba0d4c041ddbce84ee48881788434fd6bccc8";
12
+ const createSegmentedControlItemTransformer = (_ctx: SeedComponentTransformerDeps) =>
13
+ defineComponentTransformer<SegmentedControlItemProperties>(
14
+ SEGMENTED_CONTROL_ITEM_KEY,
15
+ ({ componentProperties: props }) => {
16
+ const states = props.State.value.split("-");
17
+ const commonProps = {
18
+ value: props["Label#11366:15"].value,
19
+ ...(states.includes("Disabled") && {
20
+ disabled: true,
21
+ }),
22
+ };
23
+
24
+ return createElement("SegmentedControlItem", commonProps, props["Label#11366:15"].value);
25
+ },
26
+ );
27
+
28
+ export const createSegmentedControlTransformer = (ctx: SeedComponentTransformerDeps) => {
29
+ const segmentedControlItemTransformer = createSegmentedControlItemTransformer(ctx);
30
+
31
+ return defineComponentTransformer<SegmentedControlProperties>(
32
+ metadata.segmentedControl.key,
33
+ (node) => {
34
+ const segments = findAllInstances<SegmentedControlItemProperties>({
35
+ node,
36
+ key: segmentedControlItemTransformer.key,
37
+ });
38
+
39
+ const selectedSegment = segments.find((segment) =>
40
+ segment.componentProperties.State.value.split("-").includes("Selected"),
41
+ );
42
+
43
+ const segmentedControlChildren = segments.map(segmentedControlItemTransformer.transform);
44
+
45
+ const commonProps = {
46
+ ...(selectedSegment && {
47
+ defaultValue: selectedSegment.componentProperties["Label#11366:15"].value,
48
+ }),
49
+ };
50
+
51
+ return createElement(
52
+ "SegmentedControl",
53
+ commonProps,
54
+ segmentedControlChildren,
55
+ "aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
56
+ );
57
+ },
58
+ );
59
+ };
@@ -0,0 +1,82 @@
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 { SelectBoxGroupProperties, SelectBoxProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createSelectBoxTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<SelectBoxProperties>(
10
+ metadata.selectBox.key,
11
+ ({ componentProperties: props }) => {
12
+ const tag = (() => {
13
+ switch (props.Control.value) {
14
+ case "Checkbox":
15
+ return "CheckSelectBox";
16
+ case "Radio":
17
+ return "RadioSelectBox";
18
+ }
19
+ })();
20
+
21
+ const states = props.State.value.split("-");
22
+
23
+ const commonProps = {
24
+ label: props["Label#3635:0"].value,
25
+ ...(props["Show Description#3033:0"].value && {
26
+ description: props["Description #3033:5"].value,
27
+ }),
28
+ ...(tag === "RadioSelectBox" && {
29
+ value: props["Label#3635:0"].value,
30
+ }),
31
+ ...(tag === "CheckSelectBox" &&
32
+ states.includes("Selected") && {
33
+ defaultChecked: true,
34
+ }),
35
+ };
36
+
37
+ return createElement(tag, commonProps);
38
+ },
39
+ );
40
+
41
+ export const createSelectBoxGroupTransformer = (ctx: SeedComponentTransformerDeps) => {
42
+ const selectBoxTransformer = createSelectBoxTransformer(ctx);
43
+
44
+ return defineComponentTransformer<SelectBoxGroupProperties>(
45
+ metadata.templateSelectBoxGroup.key,
46
+ (node) => {
47
+ const props = node.componentProperties;
48
+
49
+ const tag = (() => {
50
+ switch (props.Control.value) {
51
+ case "Checkbox":
52
+ return "CheckSelectBoxGroup";
53
+ case "Radio":
54
+ return "RadioSelectBoxGroup";
55
+ }
56
+ })();
57
+
58
+ const selectBoxes = findAllInstances<SelectBoxProperties>({
59
+ node,
60
+ key: selectBoxTransformer.key,
61
+ });
62
+
63
+ const selectedSelectBox = selectBoxes.find((selectBox) =>
64
+ selectBox.componentProperties.State.value.split("-").includes("Selected"),
65
+ );
66
+
67
+ const stack = createElement(
68
+ "Stack",
69
+ { gap: "spacingY.componentDefault" },
70
+ selectBoxes.map(selectBoxTransformer.transform),
71
+ );
72
+
73
+ const commonProps = {
74
+ ...(tag === "RadioSelectBoxGroup" && {
75
+ defaultValue: selectedSelectBox?.componentProperties["Label#3635:0"].value,
76
+ }),
77
+ };
78
+
79
+ return createElement(tag, commonProps, stack);
80
+ },
81
+ );
82
+ };
@@ -0,0 +1,52 @@
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 { SkeletonProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createSkeletonTransformer = (ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<SkeletonProperties>(
10
+ metadata.skeleton.key,
11
+ ({
12
+ componentProperties: props,
13
+ absoluteBoundingBox,
14
+ layoutSizingHorizontal,
15
+ layoutSizingVertical,
16
+ boundVariables,
17
+ }) => {
18
+ const commonProps = {
19
+ radius: camelCase(props.Radius.value),
20
+ width: (() => {
21
+ switch (layoutSizingHorizontal) {
22
+ case "FIXED": {
23
+ const variableId = boundVariables?.size?.x?.id;
24
+ if (variableId) return ctx.variableService.getVariableName(variableId);
25
+
26
+ return `${absoluteBoundingBox?.width}px`;
27
+ }
28
+ case "FILL":
29
+ return "full";
30
+ default:
31
+ return "full";
32
+ }
33
+ })(),
34
+ height: (() => {
35
+ switch (layoutSizingVertical) {
36
+ case "FIXED": {
37
+ const variableId = boundVariables?.size?.y?.id;
38
+ if (variableId) return ctx.variableService.getVariableName(variableId);
39
+
40
+ return `${absoluteBoundingBox?.height}px`;
41
+ }
42
+ case "FILL":
43
+ return "full";
44
+ default:
45
+ return "full";
46
+ }
47
+ })(),
48
+ };
49
+
50
+ return createElement("Skeleton", commonProps);
51
+ },
52
+ );
@@ -0,0 +1,23 @@
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 { SnackbarProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createSnackbarTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<SnackbarProperties>(
10
+ metadata.snackbar.key,
11
+ ({ componentProperties: props }) => {
12
+ const commonProps = {
13
+ message: props["Message#1528:4"].value,
14
+ variant: camelCase(props.Variant.value),
15
+ ...(props["Show Action Button#1528:0"].value && {
16
+ actionLabel: props["Action Button Label#1528:8"].value,
17
+ }),
18
+ };
19
+
20
+ // TODO: adapter.create({ render })
21
+ return createElement("Snackbar", commonProps);
22
+ },
23
+ );
@@ -0,0 +1,31 @@
1
+ import { defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "../../../data/__generated__/component-sets";
3
+ import { createElement } from "../../../core/jsx";
4
+ import { handleSizeProp } from "../size";
5
+ import type { SwitchProperties } from "../properties.type";
6
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+
8
+ export const createSwitchTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
+ defineComponentTransformer<SwitchProperties>(
10
+ metadata.switch.key,
11
+ ({ componentProperties: props }) => {
12
+ const states = props.State.value.split("-");
13
+
14
+ const size = handleSizeProp(props.Size.value);
15
+
16
+ const commonProps = {
17
+ size,
18
+ ...(size === "small" && {
19
+ label: props["Label#15191:2"].value,
20
+ }),
21
+ ...(states.includes("Selected") && {
22
+ defaultChecked: true,
23
+ }),
24
+ ...(states.includes("Disabled") && {
25
+ disabled: true,
26
+ }),
27
+ };
28
+
29
+ return createElement("Switch", commonProps);
30
+ },
31
+ );