@seed-design/figma 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/lib/index.cjs +10589 -12261
  2. package/lib/index.d.ts +1732 -41
  3. package/lib/index.js +10565 -12262
  4. package/package.json +2 -2
  5. package/src/codegen/context.ts +148 -0
  6. package/src/{component/type-helper.ts → codegen/core/component.ts} +1 -12
  7. package/src/codegen/core/index.ts +14 -0
  8. package/src/{jsx.ts → codegen/core/jsx.ts} +13 -3
  9. package/src/codegen/core/transformer.ts +40 -0
  10. package/src/{data → codegen/data}/icons.ts +2 -6
  11. package/src/{data → codegen/data}/styles.ts +87 -29
  12. package/src/codegen/data/variable-collections.ts +310 -0
  13. package/src/{data → codegen/data}/variables.ts +2821 -5887
  14. package/src/codegen/domain/codegen.service.ts +69 -0
  15. package/src/codegen/domain/figma-component.service.ts +21 -0
  16. package/src/codegen/domain/frame.service.ts +108 -0
  17. package/src/codegen/domain/icon.interface.ts +5 -0
  18. package/src/codegen/domain/icon.repository.ts +11 -0
  19. package/src/codegen/domain/icon.service.ts +35 -0
  20. package/src/codegen/domain/index.ts +22 -0
  21. package/src/codegen/domain/instance.service.ts +91 -0
  22. package/src/codegen/domain/props/container-layout-props.service.ts +248 -0
  23. package/src/codegen/domain/props/fill-props.service.ts +75 -0
  24. package/src/codegen/domain/props/radius-props.service.ts +105 -0
  25. package/src/codegen/domain/props/self-layout-props.service.ts +127 -0
  26. package/src/codegen/domain/props/stroke-props.service.ts +45 -0
  27. package/src/codegen/domain/props/type-style-props.service.ts +31 -0
  28. package/src/codegen/domain/rectangle.service.ts +31 -0
  29. package/src/codegen/domain/seed-component/deps.interface.ts +6 -0
  30. package/src/codegen/domain/seed-component/index.ts +75 -0
  31. package/src/{component/type.ts → codegen/domain/seed-component/properties.type.ts} +2 -2
  32. package/src/{component/properties.ts → codegen/domain/seed-component/size.ts} +4 -2
  33. package/src/codegen/domain/seed-component/transformers/action-button.ts +69 -0
  34. package/src/codegen/domain/seed-component/transformers/action-chip.ts +82 -0
  35. package/src/codegen/domain/seed-component/transformers/action-sheet.ts +78 -0
  36. package/src/{component/handlers → codegen/domain/seed-component/transformers}/app-bar.ts +114 -111
  37. package/src/codegen/domain/seed-component/transformers/avatar-stack.ts +30 -0
  38. package/src/codegen/domain/seed-component/transformers/avatar.ts +39 -0
  39. package/src/codegen/domain/seed-component/transformers/badge.ts +22 -0
  40. package/src/codegen/domain/seed-component/transformers/callout.ts +90 -0
  41. package/src/codegen/domain/seed-component/transformers/checkbox.ts +34 -0
  42. package/src/codegen/domain/seed-component/transformers/chip-tabs.ts +55 -0
  43. package/src/codegen/domain/seed-component/transformers/control-chip.ts +86 -0
  44. package/src/codegen/domain/seed-component/transformers/error-state.ts +39 -0
  45. package/src/codegen/domain/seed-component/transformers/extended-action-sheet.ts +99 -0
  46. package/src/codegen/domain/seed-component/transformers/extended-fab.ts +25 -0
  47. package/src/codegen/domain/seed-component/transformers/fab.ts +18 -0
  48. package/src/codegen/domain/seed-component/transformers/help-bubble.ts +68 -0
  49. package/src/codegen/domain/seed-component/transformers/identity-placeholder.ts +18 -0
  50. package/src/{component/handlers → codegen/domain/seed-component/transformers}/inline-banner.ts +11 -13
  51. package/src/codegen/domain/seed-component/transformers/manner-temp-badge.ts +19 -0
  52. package/src/codegen/domain/seed-component/transformers/multiline-text-field.ts +82 -0
  53. package/src/codegen/domain/seed-component/transformers/progress-circle.ts +51 -0
  54. package/src/codegen/domain/seed-component/transformers/reaction-button.ts +37 -0
  55. package/src/codegen/domain/seed-component/transformers/segmented-control.ts +59 -0
  56. package/src/codegen/domain/seed-component/transformers/select-box.ts +82 -0
  57. package/src/codegen/domain/seed-component/transformers/skeleton.ts +52 -0
  58. package/src/codegen/domain/seed-component/transformers/snackbar.ts +23 -0
  59. package/src/codegen/domain/seed-component/transformers/switch.ts +31 -0
  60. package/src/codegen/domain/seed-component/transformers/tabs.ts +129 -0
  61. package/src/{component/handlers → codegen/domain/seed-component/transformers}/text-button.ts +16 -18
  62. package/src/codegen/domain/seed-component/transformers/text-field.ts +109 -0
  63. package/src/codegen/domain/seed-component/transformers/toggle-button.ts +47 -0
  64. package/src/codegen/domain/style.interface.ts +5 -0
  65. package/src/codegen/domain/style.repository.ts +23 -0
  66. package/src/codegen/domain/style.service.ts +38 -0
  67. package/src/codegen/domain/text.service.ts +62 -0
  68. package/src/codegen/domain/variable.interface.ts +18 -0
  69. package/src/codegen/domain/variable.repository.ts +44 -0
  70. package/src/codegen/domain/variable.service.ts +95 -0
  71. package/src/codegen/index.ts +13 -0
  72. package/src/index.ts +2 -2
  73. package/src/normalizer/from-plugin.ts +29 -28
  74. package/src/normalizer/from-rest.ts +5 -1
  75. package/src/normalizer/types.ts +80 -32
  76. package/src/utils/common.ts +19 -0
  77. package/src/utils/css.ts +13 -0
  78. package/src/utils/figma-variable.ts +13 -0
  79. package/src/component/handlers/action-button.ts +0 -66
  80. package/src/component/handlers/action-chip.ts +0 -71
  81. package/src/component/handlers/action-sheet.ts +0 -74
  82. package/src/component/handlers/avatar-stack.ts +0 -35
  83. package/src/component/handlers/avatar.ts +0 -37
  84. package/src/component/handlers/badge.ts +0 -20
  85. package/src/component/handlers/callout.ts +0 -87
  86. package/src/component/handlers/checkbox.ts +0 -32
  87. package/src/component/handlers/chip-tabs.ts +0 -51
  88. package/src/component/handlers/control-chip.ts +0 -75
  89. package/src/component/handlers/error-state.ts +0 -37
  90. package/src/component/handlers/extended-action-sheet.ts +0 -86
  91. package/src/component/handlers/extended-fab.ts +0 -24
  92. package/src/component/handlers/fab.ts +0 -17
  93. package/src/component/handlers/help-bubble.ts +0 -66
  94. package/src/component/handlers/identity-placeholder.ts +0 -16
  95. package/src/component/handlers/manner-temp-badge.ts +0 -17
  96. package/src/component/handlers/multiline-text-field.ts +0 -80
  97. package/src/component/handlers/progress-circle.ts +0 -49
  98. package/src/component/handlers/reaction-button.ts +0 -36
  99. package/src/component/handlers/segmented-control.ts +0 -51
  100. package/src/component/handlers/select-box.ts +0 -76
  101. package/src/component/handlers/skeleton.ts +0 -51
  102. package/src/component/handlers/snackbar.ts +0 -21
  103. package/src/component/handlers/switch.ts +0 -29
  104. package/src/component/handlers/tabs.ts +0 -107
  105. package/src/component/handlers/text-field.ts +0 -108
  106. package/src/component/handlers/toggle-button.ts +0 -44
  107. package/src/component/index.ts +0 -76
  108. package/src/generate-code.ts +0 -251
  109. package/src/icon.ts +0 -46
  110. package/src/layout.ts +0 -31
  111. package/src/props/color.ts +0 -78
  112. package/src/props/layout.ts +0 -292
  113. package/src/props/sizing.ts +0 -58
  114. package/src/props/text.ts +0 -21
  115. package/src/props/variable.ts +0 -66
  116. /package/src/{data → codegen/data}/__generated__/component-sets/action-button.d.ts +0 -0
  117. /package/src/{data → codegen/data}/__generated__/component-sets/action-button.mjs +0 -0
  118. /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.d.ts +0 -0
  119. /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.mjs +0 -0
  120. /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.d.ts +0 -0
  121. /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.mjs +0 -0
  122. /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.d.ts +0 -0
  123. /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.mjs +0 -0
  124. /package/src/{data → codegen/data}/__generated__/component-sets/avatar.d.ts +0 -0
  125. /package/src/{data → codegen/data}/__generated__/component-sets/avatar.mjs +0 -0
  126. /package/src/{data → codegen/data}/__generated__/component-sets/badge.d.ts +0 -0
  127. /package/src/{data → codegen/data}/__generated__/component-sets/badge.mjs +0 -0
  128. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.d.ts +0 -0
  129. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.mjs +0 -0
  130. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.d.ts +0 -0
  131. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.mjs +0 -0
  132. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.d.ts +0 -0
  133. /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.mjs +0 -0
  134. /package/src/{data → codegen/data}/__generated__/component-sets/callout.d.ts +0 -0
  135. /package/src/{data → codegen/data}/__generated__/component-sets/callout.mjs +0 -0
  136. /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.d.ts +0 -0
  137. /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.mjs +0 -0
  138. /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.d.ts +0 -0
  139. /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.mjs +0 -0
  140. /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.d.ts +0 -0
  141. /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.mjs +0 -0
  142. /package/src/{data → codegen/data}/__generated__/component-sets/divider.d.ts +0 -0
  143. /package/src/{data → codegen/data}/__generated__/component-sets/divider.mjs +0 -0
  144. /package/src/{data → codegen/data}/__generated__/component-sets/error-state.d.ts +0 -0
  145. /package/src/{data → codegen/data}/__generated__/component-sets/error-state.mjs +0 -0
  146. /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.d.ts +0 -0
  147. /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.mjs +0 -0
  148. /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.d.ts +0 -0
  149. /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.mjs +0 -0
  150. /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.d.ts +0 -0
  151. /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.mjs +0 -0
  152. /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.d.ts +0 -0
  153. /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.mjs +0 -0
  154. /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.d.ts +0 -0
  155. /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.mjs +0 -0
  156. /package/src/{data → codegen/data}/__generated__/component-sets/index.d.ts +0 -0
  157. /package/src/{data → codegen/data}/__generated__/component-sets/index.mjs +0 -0
  158. /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.d.ts +0 -0
  159. /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.mjs +0 -0
  160. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.d.ts +0 -0
  161. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.mjs +0 -0
  162. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.d.ts +0 -0
  163. /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.mjs +0 -0
  164. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.d.ts +0 -0
  165. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.mjs +0 -0
  166. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.d.ts +0 -0
  167. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.mjs +0 -0
  168. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.d.ts +0 -0
  169. /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.mjs +0 -0
  170. /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.d.ts +0 -0
  171. /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.mjs +0 -0
  172. /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.d.ts +0 -0
  173. /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.mjs +0 -0
  174. /package/src/{data → codegen/data}/__generated__/component-sets/radio.d.ts +0 -0
  175. /package/src/{data → codegen/data}/__generated__/component-sets/radio.mjs +0 -0
  176. /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.d.ts +0 -0
  177. /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.mjs +0 -0
  178. /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.d.ts +0 -0
  179. /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.mjs +0 -0
  180. /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.d.ts +0 -0
  181. /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.mjs +0 -0
  182. /package/src/{data → codegen/data}/__generated__/component-sets/select-box.d.ts +0 -0
  183. /package/src/{data → codegen/data}/__generated__/component-sets/select-box.mjs +0 -0
  184. /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.d.ts +0 -0
  185. /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.mjs +0 -0
  186. /package/src/{data → codegen/data}/__generated__/component-sets/slider.d.ts +0 -0
  187. /package/src/{data → codegen/data}/__generated__/component-sets/slider.mjs +0 -0
  188. /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.d.ts +0 -0
  189. /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.mjs +0 -0
  190. /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.d.ts +0 -0
  191. /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.mjs +0 -0
  192. /package/src/{data → codegen/data}/__generated__/component-sets/switch.d.ts +0 -0
  193. /package/src/{data → codegen/data}/__generated__/component-sets/switch.mjs +0 -0
  194. /package/src/{data → codegen/data}/__generated__/component-sets/tablist.d.ts +0 -0
  195. /package/src/{data → codegen/data}/__generated__/component-sets/tablist.mjs +0 -0
  196. /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.d.ts +0 -0
  197. /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.mjs +0 -0
  198. /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.d.ts +0 -0
  199. /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.mjs +0 -0
  200. /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.d.ts +0 -0
  201. /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.mjs +0 -0
  202. /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.d.ts +0 -0
  203. /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.mjs +0 -0
  204. /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.d.ts +0 -0
  205. /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.mjs +0 -0
  206. /package/src/{data → codegen/data}/__generated__/component-sets/text-button.d.ts +0 -0
  207. /package/src/{data → codegen/data}/__generated__/component-sets/text-button.mjs +0 -0
  208. /package/src/{data → codegen/data}/__generated__/component-sets/text-field.d.ts +0 -0
  209. /package/src/{data → codegen/data}/__generated__/component-sets/text-field.mjs +0 -0
  210. /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.d.ts +0 -0
  211. /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.mjs +0 -0
@@ -1,80 +0,0 @@
1
- import * as metadata from "../../data/__generated__/component-sets";
2
- import { createElement } from "../../jsx";
3
- import { handleSize } from "../properties";
4
- import type { MultilineTextFieldProperties } from "../type";
5
- import type { ComponentHandler } from "../type-helper";
6
-
7
- export const multilineTextFieldHandler: ComponentHandler<MultilineTextFieldProperties> = {
8
- key: metadata.multilineTextField.key,
9
- codegen: async ({ componentProperties: props }) => {
10
- const {
11
- Size: { value: size },
12
- State: { value: state },
13
- Filled: { value: filled },
14
- "Show Header#870:0": { value: showHeader },
15
- "Label#15327:323": { value: label },
16
- "Show Indicator#1259:0": { value: showIndicator },
17
- "Indicator#15327:286": { value: indicator },
18
- "Placeholder#958:0": { value: placeholder },
19
- "Filled Text#1304:0": { value: defaultValue },
20
- "Show Footer#958:25": { value: showFooter },
21
- "Show Description#958:50": { value: showDescription },
22
- "Description#15327:212": { value: description },
23
- "Show Character count#958:75": { value: showCharacterCount },
24
- "Character Count#15327:360": { value: _characterCount },
25
- "Max Character Count#15327:175": { value: maxCharacterCount },
26
- } = props;
27
-
28
- const states = state.split("-");
29
-
30
- const commonProps = {
31
- size: handleSize(size),
32
- // header
33
- ...(showHeader && {
34
- label,
35
- }),
36
- ...(showHeader &&
37
- showIndicator && {
38
- indicator,
39
- }),
40
- // input
41
- ...(filled === "True" && {
42
- defaultValue,
43
- }),
44
- ...(states.includes("Invalid") && {
45
- invalid: true,
46
- }),
47
- ...(states.includes("Disabled") && {
48
- disabled: true,
49
- }),
50
- ...(states.includes("Read Only") && {
51
- readOnly: true,
52
- }),
53
- // footer
54
- ...(showFooter &&
55
- showDescription &&
56
- states.includes("Invalid") && {
57
- // invalid인 경우 description을 error로 사용
58
- errorMessage: description,
59
- }),
60
- ...(showFooter &&
61
- showDescription &&
62
- !states.includes("Invalid") && {
63
- // invalid가 아닌 경우 description을 description으로 사용
64
- description,
65
- }),
66
- ...(showFooter &&
67
- showCharacterCount && {
68
- maxGraphemeCount: Number(maxCharacterCount),
69
- }),
70
- };
71
-
72
- const inputProps = {
73
- placeholder,
74
- };
75
-
76
- const TextFieldChildren = createElement("TextFieldTextarea", inputProps);
77
-
78
- return createElement("TextField", commonProps, TextFieldChildren);
79
- },
80
- };
@@ -1,49 +0,0 @@
1
- import { camelCase } from "change-case";
2
- import { match } from "ts-pattern";
3
- import * as metadata from "../../data/__generated__/component-sets";
4
- import { createElement } from "../../jsx";
5
- import type { ProgressCircleProperties } from "../type";
6
- import type { ComponentHandler } from "../type-helper";
7
-
8
- export const progressCircleHandler: ComponentHandler<ProgressCircleProperties> = {
9
- key: metadata.progressCircle.key,
10
- codegen: async ({ componentProperties: props }) => {
11
- const { value, minValue, maxValue } = match(props.Value.value)
12
- .with("Indeterminate", () => ({
13
- value: undefined,
14
- minValue: undefined,
15
- maxValue: undefined,
16
- }))
17
- .with("0%", () => ({
18
- value: 0,
19
- minValue: 0,
20
- maxValue: 100,
21
- }))
22
- .with("25%", () => ({
23
- value: 25,
24
- minValue: 0,
25
- maxValue: 100,
26
- }))
27
- .with("75%", () => ({
28
- value: 75,
29
- minValue: 0,
30
- maxValue: 100,
31
- }))
32
- .with("100%", () => ({
33
- value: 100,
34
- minValue: 0,
35
- maxValue: 100,
36
- }))
37
- .exhaustive();
38
-
39
- const commonProps = {
40
- value,
41
- minValue,
42
- maxValue,
43
- size: props.Size.value,
44
- tone: camelCase(props.Tone.value),
45
- };
46
-
47
- return createElement("ProgressCircle", commonProps);
48
- },
49
- };
@@ -1,36 +0,0 @@
1
- import * as metadata from "../../data/__generated__/component-sets";
2
- import { createIconTagNameFromKey } from "../../icon";
3
- import { createElement } from "../../jsx";
4
- import { handleSize } from "../properties";
5
- import type { ReactionButtonProperties } from "../type";
6
- import type { ComponentHandler } from "../type-helper";
7
-
8
- export const reactionButtonHandler: ComponentHandler<ReactionButtonProperties> = {
9
- key: metadata.reactionButton.key,
10
- codegen: async ({ componentProperties: props }) => {
11
- const states = props.State.value.split("-");
12
-
13
- const commonProps = {
14
- size: handleSize(props.Size.value),
15
- ...(states.includes("Loading") && {
16
- loading: true,
17
- }),
18
- ...(states.includes("Disabled") && {
19
- disabled: true,
20
- }),
21
- ...(states.includes("Selected") && {
22
- defaultPressed: true,
23
- }),
24
- };
25
-
26
- return createElement("ReactionButton", commonProps, [
27
- createElement("PrefixIcon", {
28
- svg: createElement(createIconTagNameFromKey(props["Icon#12379:0"].componentKey)),
29
- }),
30
- props["Label#6397:0"].value,
31
- props["Show Count#6397:33"].value
32
- ? createElement("Count", {}, props["Count#15816:0"].value)
33
- : undefined,
34
- ]);
35
- },
36
- };
@@ -1,51 +0,0 @@
1
- import * as metadata from "../../data/__generated__/component-sets";
2
- import { createElement } from "../../jsx";
3
- import { findAllInstances } from "../../utils/figma-node";
4
- import type { ComponentHandler } from "../type-helper";
5
- import type { SegmentedControlItemProperties, SegmentedControlProperties } from "../type";
6
-
7
- export const segmentedControlHandler: ComponentHandler<SegmentedControlProperties> = {
8
- key: metadata.segmentedControl.key,
9
- codegen: async (node) => {
10
- const segments = await findAllInstances<SegmentedControlItemProperties>({
11
- node,
12
- key: segmentedControlItemHandler.key,
13
- });
14
-
15
- const selectedSegment = segments.find((segment) =>
16
- segment.componentProperties.State.value.split("-").includes("Selected"),
17
- );
18
-
19
- const segmentedControlChildren = await Promise.all(
20
- segments.map(segmentedControlItemHandler.codegen),
21
- );
22
-
23
- const commonProps = {
24
- ...(selectedSegment && {
25
- defaultValue: selectedSegment.componentProperties["Label#11366:15"].value,
26
- }),
27
- };
28
-
29
- return createElement(
30
- "SegmentedControl",
31
- commonProps,
32
- segmentedControlChildren,
33
- "aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
34
- );
35
- },
36
- };
37
-
38
- const segmentedControlItemHandler: ComponentHandler<SegmentedControlItemProperties> = {
39
- key: "9a7ba0d4c041ddbce84ee48881788434fd6bccc8",
40
- codegen: async ({ componentProperties: props }) => {
41
- const states = props.State.value.split("-");
42
- const commonProps = {
43
- value: props["Label#11366:15"].value,
44
- ...(states.includes("Disabled") && {
45
- disabled: true,
46
- }),
47
- };
48
-
49
- return createElement("SegmentedControlItem", commonProps, props["Label#11366:15"].value);
50
- },
51
- };
@@ -1,76 +0,0 @@
1
- import * as metadata from "../../data/__generated__/component-sets";
2
- import { createElement } from "../../jsx";
3
- import { findAllInstances } from "../../utils/figma-node";
4
- import type { ComponentHandler } from "../type-helper";
5
- import type { SelectBoxGroupProperties, SelectBoxProperties } from "../type";
6
-
7
- export const selectBoxGroupHandler: ComponentHandler<SelectBoxGroupProperties> = {
8
- key: metadata.templateSelectBoxGroup.key,
9
- codegen: async (node) => {
10
- const props = node.componentProperties;
11
-
12
- const tag = (() => {
13
- switch (props.Control.value) {
14
- case "Checkbox":
15
- return "CheckSelectBoxGroup";
16
- case "Radio":
17
- return "RadioSelectBoxGroup";
18
- }
19
- })();
20
-
21
- const selectBoxes = findAllInstances<SelectBoxProperties>({
22
- node,
23
- key: selectBoxHandler.key,
24
- });
25
-
26
- const selectedSelectBox = selectBoxes.find((selectBox) =>
27
- selectBox.componentProperties.State.value.split("-").includes("Selected"),
28
- );
29
-
30
- const stack = createElement(
31
- "Stack",
32
- { gap: "spacingY.componentDefault" },
33
- await Promise.all(selectBoxes.map(selectBoxHandler.codegen)),
34
- );
35
-
36
- const commonProps = {
37
- ...(tag === "RadioSelectBoxGroup" && {
38
- defaultValue: selectedSelectBox?.componentProperties["Label#3635:0"].value,
39
- }),
40
- };
41
-
42
- return createElement(tag, commonProps, stack);
43
- },
44
- };
45
-
46
- export const selectBoxHandler: ComponentHandler<SelectBoxProperties> = {
47
- key: metadata.selectBox.key,
48
- codegen: async ({ componentProperties: props }) => {
49
- const tag = (() => {
50
- switch (props.Control.value) {
51
- case "Checkbox":
52
- return "CheckSelectBox";
53
- case "Radio":
54
- return "RadioSelectBox";
55
- }
56
- })();
57
-
58
- const states = props.State.value.split("-");
59
-
60
- const commonProps = {
61
- label: props["Label#3635:0"].value,
62
- ...(props["Show Description#3033:0"].value && {
63
- description: props["Description #3033:5"].value,
64
- }),
65
- ...(tag === "RadioSelectBox" && {
66
- value: props["Label#3635:0"].value,
67
- }),
68
- ...(tag === "CheckSelectBox" &&
69
- states.includes("Selected") && {
70
- defaultChecked: true,
71
- }),
72
- };
73
-
74
- return createElement(tag, commonProps);
75
- },
76
- };
@@ -1,51 +0,0 @@
1
- import { camelCase } from "change-case";
2
- import * as metadata from "../../data/__generated__/component-sets";
3
- import { createElement } from "../../jsx";
4
- import { getLayoutVariableName } from "../../props/variable";
5
- import type { SkeletonProperties } from "../type";
6
- import type { ComponentHandler } from "../type-helper";
7
-
8
- export const skeletonHandler: ComponentHandler<SkeletonProperties> = {
9
- key: metadata.skeleton.key,
10
- codegen: async ({
11
- componentProperties: props,
12
- absoluteBoundingBox,
13
- layoutSizingHorizontal,
14
- layoutSizingVertical,
15
- boundVariables,
16
- }) => {
17
- const commonProps = {
18
- radius: camelCase(props.Radius.value),
19
- width: (() => {
20
- switch (layoutSizingHorizontal) {
21
- case "FIXED": {
22
- const variableId = boundVariables?.size?.x?.id;
23
- if (variableId) return getLayoutVariableName(variableId);
24
-
25
- return `${absoluteBoundingBox?.width}px`;
26
- }
27
- case "FILL":
28
- return "full";
29
- default:
30
- return "full";
31
- }
32
- })(),
33
- height: (() => {
34
- switch (layoutSizingVertical) {
35
- case "FIXED": {
36
- const variableId = boundVariables?.size?.y?.id;
37
- if (variableId) return getLayoutVariableName(variableId);
38
-
39
- return `${absoluteBoundingBox?.height}px`;
40
- }
41
- case "FILL":
42
- return "full";
43
- default:
44
- return "full";
45
- }
46
- })(),
47
- };
48
-
49
- return createElement("Skeleton", commonProps);
50
- },
51
- };
@@ -1,21 +0,0 @@
1
- import { camelCase } from "change-case";
2
- import * as metadata from "../../data/__generated__/component-sets";
3
- import { createElement } from "../../jsx";
4
- import type { SnackbarProperties } from "../type";
5
- import type { ComponentHandler } from "../type-helper";
6
-
7
- export const snackbarHandler: ComponentHandler<SnackbarProperties> = {
8
- key: metadata.snackbar.key,
9
- codegen: async ({ componentProperties: props }) => {
10
- const commonProps = {
11
- message: props["Message#1528:4"].value,
12
- variant: camelCase(props.Variant.value),
13
- ...(props["Show Action Button#1528:0"].value && {
14
- actionLabel: props["Action Button Label#1528:8"].value,
15
- }),
16
- };
17
-
18
- // TODO: adapter.create({ render })
19
- return createElement("Snackbar", commonProps);
20
- },
21
- };
@@ -1,29 +0,0 @@
1
- import * as metadata from "../../data/__generated__/component-sets";
2
- import { createElement } from "../../jsx";
3
- import { handleSize } from "../properties";
4
- import type { SwitchProperties } from "../type";
5
- import type { ComponentHandler } from "../type-helper";
6
-
7
- export const switchHandler: ComponentHandler<SwitchProperties> = {
8
- key: metadata.switch.key,
9
- codegen: async ({ componentProperties: props }) => {
10
- const states = props.State.value.split("-");
11
-
12
- const size = handleSize(props.Size.value);
13
-
14
- const commonProps = {
15
- size,
16
- ...(size === "small" && {
17
- label: props["Label#15191:2"].value,
18
- }),
19
- ...(states.includes("Selected") && {
20
- defaultChecked: true,
21
- }),
22
- ...(states.includes("Disabled") && {
23
- disabled: true,
24
- }),
25
- };
26
-
27
- return createElement("Switch", commonProps);
28
- },
29
- };
@@ -1,107 +0,0 @@
1
- import { camelCase } from "change-case";
2
- import * as metadata from "../../data/__generated__/component-sets";
3
- import { createElement } from "../../jsx";
4
- import type { NormalizedInstanceNode } from "../../normalizer";
5
- import { handleSize } from "../properties";
6
- import type { TabsFillItemProperties, TabsHugItemProperties, TabsProperties } from "../type";
7
- import type { ComponentHandler } from "../type-helper";
8
-
9
- export const tabsHandler: ComponentHandler<TabsProperties> = {
10
- key: metadata.tablist.key,
11
- codegen: async ({ componentProperties: props, children }) => {
12
- const tabsItems = children
13
- .map((child) => {
14
- if (child.type !== "INSTANCE") return null;
15
-
16
- const componentKey = child.componentSetKey ? child.componentSetKey : child.componentKey;
17
-
18
- if (componentKey === tabsHugItemHandler.key)
19
- return {
20
- triggerLayout: "hug" as const,
21
- node: child as NormalizedInstanceNode & { componentProperties: TabsHugItemProperties },
22
- };
23
-
24
- if (componentKey === tabsFillItemHandler.key)
25
- return {
26
- triggerLayout: "fill" as const,
27
- node: child as NormalizedInstanceNode & { componentProperties: TabsFillItemProperties },
28
- };
29
-
30
- return null;
31
- })
32
- .filter((tabsItem) => tabsItem !== null);
33
-
34
- const selectedTabsItem = tabsItems.find(({ node: { componentProperties } }) =>
35
- componentProperties.State.value.split("-").includes("Selected"),
36
- )?.node;
37
-
38
- const tabTriggerList = createElement(
39
- "TabsList",
40
- undefined,
41
- await Promise.all(
42
- tabsItems.map(({ triggerLayout, node }) => {
43
- switch (triggerLayout) {
44
- case "hug":
45
- return tabsHugItemHandler.codegen(node);
46
- case "fill":
47
- return tabsFillItemHandler.codegen(node);
48
- }
49
- }),
50
- ),
51
- );
52
-
53
- const tabContents = tabsItems.map(({ node }) => {
54
- const value = node.componentProperties["Label#4478:2"].value;
55
-
56
- return createElement("TabsContent", { value }, "{/* TODO: 컨텐츠 추가 */}");
57
- });
58
-
59
- const commonProps = {
60
- triggerLayout: camelCase(props.Layout.value),
61
- size: handleSize(props.Size.value),
62
- ...(selectedTabsItem && {
63
- defaultValue: selectedTabsItem.componentProperties["Label#4478:2"].value,
64
- }),
65
- };
66
-
67
- return createElement("TabsRoot", commonProps, [tabTriggerList, ...tabContents]);
68
- },
69
- };
70
-
71
- const tabsHugItemHandler: ComponentHandler<TabsHugItemProperties> = {
72
- key: "c242492543b327ceb84fa9933841512fc62a898c",
73
- codegen: async ({ componentProperties: props }) => {
74
- const states = props.State.value.split("-");
75
-
76
- const commonProps = {
77
- value: props["Label#4478:2"].value,
78
- ...(props.Notification.value === "True" && {
79
- alert: true,
80
- }),
81
- ...(states.includes("Disabled") && {
82
- disabled: true,
83
- }),
84
- };
85
-
86
- return createElement("TabsTrigger", commonProps, props["Label#4478:2"].value);
87
- },
88
- };
89
-
90
- const tabsFillItemHandler: ComponentHandler<TabsFillItemProperties> = {
91
- key: "7275293344efb40ee9a3f5248ba2659b94a0b305",
92
- codegen: async ({ componentProperties: props }) => {
93
- const states = props.State.value.split("-");
94
-
95
- const commonProps = {
96
- value: props["Label#4478:2"].value,
97
- ...(props.Notification.value === "True" && {
98
- alert: true,
99
- }),
100
- ...(states.includes("Disabled") && {
101
- disabled: true,
102
- }),
103
- };
104
-
105
- return createElement("TabsTrigger", commonProps, props["Label#4478:2"].value);
106
- },
107
- };
@@ -1,108 +0,0 @@
1
- import * as metadata from "../../data/__generated__/component-sets";
2
- import { createIconTagNameFromKey } from "../../icon";
3
- import { createElement } from "../../jsx";
4
- import { handleSize } from "../properties";
5
- import type { TextFieldProperties } from "../type";
6
- import type { ComponentHandler } from "../type-helper";
7
-
8
- export const textFieldHandler: ComponentHandler<TextFieldProperties> = {
9
- key: metadata.textField.key,
10
- codegen: async ({ componentProperties: props }) => {
11
- const {
12
- Size: { value: size },
13
- State: { value: state },
14
- Filled: { value: filled },
15
- "Show Header#870:0": { value: showHeader },
16
- "Label#14964:0": { value: label },
17
- "Show Indicator#1259:0": { value: showIndicator },
18
- "Indicator#15327:249": { value: indicator },
19
- "Show Prefix#958:125": { value: showPrefix },
20
- "Show Prefix Icon#1267:50": { value: showPrefixIcon },
21
- "Prefix Icon#1267:25": { value: prefixIcon },
22
- "Show Prefix Text#1267:0": { value: showPrefixText },
23
- "Prefix Text#15327:101": { value: prefix },
24
- "Placeholder#958:0": { value: placeholder },
25
- "Filled Text#1304:0": { value: defaultValue },
26
- "Show Suffix#958:100": { value: showSuffix },
27
- "Show Suffix Icon#1267:75": { value: showSuffixIcon },
28
- "Suffix Icon #1267:100": { value: suffixIcon },
29
- "Show Suffix Text#1267:125": { value: showSuffixText },
30
- "Suffix Text#15327:138": { value: suffix },
31
- "Show Footer#958:25": { value: showFooter },
32
- "Show Description#958:50": { value: showDescription },
33
- "Description#12626:5": { value: description },
34
- "Show Character Count#958:75": { value: showCharacterCount },
35
- "Character Count#15327:64": { value: _characterCount },
36
- "Max Character Count#15327:27": { value: maxCharacterCount },
37
- } = props;
38
-
39
- const states = state.split("-");
40
-
41
- const commonProps = {
42
- size: handleSize(size),
43
- // header
44
- ...(showHeader && {
45
- label,
46
- }),
47
- ...(showHeader &&
48
- showIndicator && {
49
- indicator,
50
- }),
51
- // input affixes
52
- ...(showPrefix &&
53
- showPrefixIcon && {
54
- prefixIcon: createElement(createIconTagNameFromKey(prefixIcon)),
55
- }),
56
- ...(showPrefix &&
57
- showPrefixText && {
58
- prefix,
59
- }),
60
- ...(showSuffix &&
61
- showSuffixIcon && {
62
- suffixIcon: createElement(createIconTagNameFromKey(suffixIcon)),
63
- }),
64
- ...(showSuffix &&
65
- showSuffixText && {
66
- suffix,
67
- }),
68
- // input
69
- ...(filled === "True" && {
70
- defaultValue,
71
- }),
72
- ...(states.includes("Invalid") && {
73
- invalid: true,
74
- }),
75
- ...(states.includes("Disabled") && {
76
- disabled: true,
77
- }),
78
- ...(states.includes("Read Only") && {
79
- readOnly: true,
80
- }),
81
- // footer
82
- ...(showFooter &&
83
- showDescription &&
84
- states.includes("Invalid") && {
85
- // invalid인 경우 description을 error로 사용
86
- errorMessage: description,
87
- }),
88
- ...(showFooter &&
89
- showDescription &&
90
- !states.includes("Invalid") && {
91
- // invalid가 아닌 경우 description을 description으로 사용
92
- description,
93
- }),
94
- ...(showFooter &&
95
- showCharacterCount && {
96
- maxGraphemeCount: Number(maxCharacterCount),
97
- }),
98
- };
99
-
100
- const inputProps = {
101
- placeholder,
102
- };
103
-
104
- const TextFieldChildren = createElement("TextFieldInput", inputProps);
105
-
106
- return createElement("TextField", commonProps, TextFieldChildren);
107
- },
108
- };
@@ -1,44 +0,0 @@
1
- import { camelCase } from "change-case";
2
- import * as metadata from "../../data/__generated__/component-sets";
3
- import { createIconTagNameFromKey } from "../../icon";
4
- import { createElement } from "../../jsx";
5
- import { handleSize } from "../properties";
6
- import type { ToggleButtonProperties } from "../type";
7
- import type { ComponentHandler } from "../type-helper";
8
-
9
- export const toggleButtonHandler: ComponentHandler<ToggleButtonProperties> = {
10
- key: metadata.toggleButton.key,
11
- codegen: async ({ componentProperties: props }) => {
12
- const states = props.State.value.split("-");
13
-
14
- const commonProps = {
15
- variant: camelCase(props.Variant.value),
16
- size: handleSize(props.Size.value),
17
- ...(states.includes("Selected") && {
18
- defaultPressed: true,
19
- }),
20
- ...(states.includes("Disabled") && {
21
- disabled: true,
22
- }),
23
- ...(states.includes("Loading") && {
24
- loading: true,
25
- }),
26
- };
27
-
28
- return createElement("ToggleButton", commonProps, [
29
- props["Show Prefix Icon#6122:392"].value
30
- ? createElement("PrefixIcon", {
31
- svg: createElement(createIconTagNameFromKey(props["Prefix Icon#6122:98"].componentKey)),
32
- })
33
- : undefined,
34
- props["Label#6122:49"].value,
35
- props["Show Suffix Icon#6122:147"].value
36
- ? createElement("SuffixIcon", {
37
- svg: createElement(
38
- createIconTagNameFromKey(props["Suffix Icon#6122:343"].componentKey),
39
- ),
40
- })
41
- : undefined,
42
- ]);
43
- },
44
- };