@seed-design/figma 0.1.7 → 0.1.9

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 (166) hide show
  1. package/lib/codegen/index.cjs +773 -660
  2. package/lib/codegen/index.d.ts +725 -625
  3. package/lib/codegen/index.d.ts.map +1 -1
  4. package/lib/codegen/index.js +773 -660
  5. package/lib/codegen/targets/react/index.cjs +1242 -1226
  6. package/lib/codegen/targets/react/index.d.ts +22 -11
  7. package/lib/codegen/targets/react/index.d.ts.map +1 -1
  8. package/lib/codegen/targets/react/index.js +1242 -1226
  9. package/lib/index.cjs +899 -671
  10. package/lib/index.d.ts +3 -1
  11. package/lib/index.d.ts.map +1 -1
  12. package/lib/index.js +899 -671
  13. package/package.json +3 -3
  14. package/src/codegen/component-properties.ts +289 -144
  15. package/src/codegen/core/component-handler.ts +9 -3
  16. package/src/codegen/core/jsx.ts +7 -2
  17. package/src/codegen/core/value-resolver.ts +35 -21
  18. package/src/codegen/targets/figma/pipeline.ts +4 -2
  19. package/src/codegen/targets/figma/value-resolver.ts +38 -2
  20. package/src/codegen/targets/react/component/handlers/action-button.ts +69 -5
  21. package/src/codegen/targets/react/component/handlers/alert-dialog.ts +81 -0
  22. package/src/codegen/targets/react/component/handlers/app-bar.ts +93 -128
  23. package/src/codegen/targets/react/component/handlers/avatar.ts +17 -8
  24. package/src/codegen/targets/react/component/handlers/badge.ts +0 -1
  25. package/src/codegen/targets/react/component/handlers/bottom-sheet.ts +71 -0
  26. package/src/codegen/targets/react/component/handlers/callout.ts +13 -17
  27. package/src/codegen/targets/react/component/handlers/chip.ts +88 -0
  28. package/src/codegen/targets/react/component/handlers/contextual-floating-button.ts +52 -0
  29. package/src/codegen/targets/react/component/handlers/divider.ts +19 -0
  30. package/src/codegen/targets/react/component/handlers/error-state.ts +26 -23
  31. package/src/codegen/targets/react/component/handlers/floating-action-button.ts +48 -0
  32. package/src/codegen/targets/react/component/handlers/help-bubble.ts +4 -5
  33. package/src/codegen/targets/react/component/handlers/identity-placeholder.ts +7 -4
  34. package/src/codegen/targets/react/component/handlers/inline-banner.ts +7 -14
  35. package/src/codegen/targets/react/component/handlers/manner-temp.ts +18 -0
  36. package/src/codegen/targets/react/component/handlers/menu-sheet.ts +106 -0
  37. package/src/codegen/targets/react/component/handlers/multiline-text-field.ts +1 -1
  38. package/src/codegen/targets/react/component/handlers/progress-circle.ts +3 -1
  39. package/src/codegen/targets/react/component/handlers/segmented-control.ts +4 -2
  40. package/src/codegen/targets/react/component/handlers/select-box.ts +11 -8
  41. package/src/codegen/targets/react/component/handlers/snackbar.ts +2 -2
  42. package/src/codegen/targets/react/component/handlers/switch.ts +2 -7
  43. package/src/codegen/targets/react/component/handlers/tabs.ts +8 -125
  44. package/src/codegen/targets/react/component/index.ts +22 -19
  45. package/src/codegen/targets/react/instance.ts +1 -1
  46. package/src/codegen/targets/react/pipeline.ts +4 -2
  47. package/src/codegen/targets/react/props.ts +16 -9
  48. package/src/codegen/targets/react/value-resolver.ts +38 -3
  49. package/src/entities/data/__generated__/component-sets/action-button.d.ts +5 -5
  50. package/src/entities/data/__generated__/component-sets/action-button.mjs +5 -5
  51. package/src/entities/data/__generated__/component-sets/alert-dialog.d.ts +26 -0
  52. package/src/entities/data/__generated__/component-sets/alert-dialog.mjs +26 -0
  53. package/src/entities/data/__generated__/component-sets/avatar-stack.d.ts +5 -18
  54. package/src/entities/data/__generated__/component-sets/avatar-stack.mjs +5 -18
  55. package/src/entities/data/__generated__/component-sets/avatar.d.ts +11 -5
  56. package/src/entities/data/__generated__/component-sets/avatar.mjs +11 -5
  57. package/src/entities/data/__generated__/component-sets/badge.d.ts +0 -7
  58. package/src/entities/data/__generated__/component-sets/badge.mjs +0 -7
  59. package/src/entities/data/__generated__/component-sets/bottom-navigation-global.d.ts +3 -0
  60. package/src/entities/data/__generated__/component-sets/bottom-navigation-global.mjs +3 -0
  61. package/src/entities/data/__generated__/component-sets/bottom-navigation-kr.d.ts +3 -0
  62. package/src/entities/data/__generated__/component-sets/bottom-navigation-kr.mjs +3 -0
  63. package/src/entities/data/__generated__/component-sets/bottom-sheet.d.ts +53 -4
  64. package/src/entities/data/__generated__/component-sets/bottom-sheet.mjs +53 -4
  65. package/src/entities/data/__generated__/component-sets/callout.d.ts +13 -22
  66. package/src/entities/data/__generated__/component-sets/callout.mjs +13 -22
  67. package/src/entities/data/__generated__/component-sets/checkbox.d.ts +3 -3
  68. package/src/entities/data/__generated__/component-sets/checkbox.mjs +3 -3
  69. package/src/entities/data/__generated__/component-sets/checkmark.d.ts +34 -0
  70. package/src/entities/data/__generated__/component-sets/checkmark.mjs +34 -0
  71. package/src/entities/data/__generated__/component-sets/chip.d.ts +90 -0
  72. package/src/entities/data/__generated__/component-sets/chip.mjs +90 -0
  73. package/src/entities/data/__generated__/component-sets/chlid.d.ts +14 -0
  74. package/src/entities/data/__generated__/component-sets/chlid.mjs +14 -0
  75. package/src/entities/data/__generated__/component-sets/{extended-floating-action-button.d.ts → contextual-floating-button.d.ts} +12 -10
  76. package/src/entities/data/__generated__/component-sets/{extended-floating-action-button.mjs → contextual-floating-button.mjs} +12 -10
  77. package/src/entities/data/__generated__/component-sets/floating-action-button.d.ts +4 -8
  78. package/src/entities/data/__generated__/component-sets/floating-action-button.mjs +4 -8
  79. package/src/entities/data/__generated__/component-sets/help-bubble.d.ts +3 -10
  80. package/src/entities/data/__generated__/component-sets/help-bubble.mjs +3 -10
  81. package/src/entities/data/__generated__/component-sets/index.d.ts +13 -13
  82. package/src/entities/data/__generated__/component-sets/index.mjs +13 -13
  83. package/src/entities/data/__generated__/component-sets/inline-banner.d.ts +3 -3
  84. package/src/entities/data/__generated__/component-sets/inline-banner.mjs +3 -3
  85. package/src/entities/data/__generated__/component-sets/main-tab-navigation-global.d.ts +2 -2
  86. package/src/entities/data/__generated__/component-sets/main-tab-navigation-global.mjs +2 -2
  87. package/src/entities/data/__generated__/component-sets/manner-temp-badge.d.ts +2 -2
  88. package/src/entities/data/__generated__/component-sets/manner-temp-badge.mjs +2 -2
  89. package/src/entities/data/__generated__/component-sets/manner-temp.d.ts +2 -2
  90. package/src/entities/data/__generated__/component-sets/manner-temp.mjs +2 -2
  91. package/src/entities/data/__generated__/component-sets/{extended-action-sheet.d.ts → menu-sheet.d.ts} +17 -13
  92. package/src/entities/data/__generated__/component-sets/{extended-action-sheet.mjs → menu-sheet.mjs} +17 -13
  93. package/src/entities/data/__generated__/component-sets/multiline-text-field.d.ts +18 -18
  94. package/src/entities/data/__generated__/component-sets/multiline-text-field.mjs +18 -18
  95. package/src/entities/data/__generated__/component-sets/progress-circle.d.ts +2 -1
  96. package/src/entities/data/__generated__/component-sets/progress-circle.mjs +2 -1
  97. package/src/entities/data/__generated__/component-sets/radio-mark.d.ts +34 -0
  98. package/src/entities/data/__generated__/component-sets/radio-mark.mjs +34 -0
  99. package/src/entities/data/__generated__/component-sets/radio.d.ts +2 -2
  100. package/src/entities/data/__generated__/component-sets/radio.mjs +2 -2
  101. package/src/entities/data/__generated__/component-sets/reaction-button.d.ts +6 -6
  102. package/src/entities/data/__generated__/component-sets/reaction-button.mjs +6 -6
  103. package/src/entities/data/__generated__/component-sets/resizable-child.d.ts +18 -0
  104. package/src/entities/data/__generated__/component-sets/resizable-child.mjs +18 -0
  105. package/src/entities/data/__generated__/component-sets/resizable-icon.d.ts +18 -0
  106. package/src/entities/data/__generated__/component-sets/resizable-icon.mjs +18 -0
  107. package/src/entities/data/__generated__/component-sets/select-box.d.ts +4 -4
  108. package/src/entities/data/__generated__/component-sets/select-box.mjs +4 -4
  109. package/src/entities/data/__generated__/component-sets/skeleton.d.ts +7 -0
  110. package/src/entities/data/__generated__/component-sets/skeleton.mjs +7 -0
  111. package/src/entities/data/__generated__/component-sets/snackbar.d.ts +4 -4
  112. package/src/entities/data/__generated__/component-sets/snackbar.mjs +4 -4
  113. package/src/entities/data/__generated__/component-sets/switch.d.ts +15 -6
  114. package/src/entities/data/__generated__/component-sets/switch.mjs +15 -6
  115. package/src/entities/data/__generated__/component-sets/tabs.d.ts +13 -0
  116. package/src/entities/data/__generated__/component-sets/tabs.mjs +13 -0
  117. package/src/entities/data/__generated__/component-sets/template-button-group.d.ts +9 -33
  118. package/src/entities/data/__generated__/component-sets/template-button-group.mjs +9 -33
  119. package/src/entities/data/__generated__/component-sets/template-chip-group.d.ts +15 -12
  120. package/src/entities/data/__generated__/component-sets/template-chip-group.mjs +15 -12
  121. package/src/entities/data/__generated__/component-sets/template-completion.d.ts +28 -0
  122. package/src/entities/data/__generated__/component-sets/template-completion.mjs +28 -0
  123. package/src/entities/data/__generated__/component-sets/{error-state.d.ts → template-error-state.d.ts} +5 -5
  124. package/src/entities/data/__generated__/component-sets/{error-state.mjs → template-error-state.mjs} +5 -5
  125. package/src/entities/data/__generated__/component-sets/template-top-navigation.d.ts +9 -7
  126. package/src/entities/data/__generated__/component-sets/template-top-navigation.mjs +9 -7
  127. package/src/entities/data/__generated__/component-sets/text-field.d.ts +35 -36
  128. package/src/entities/data/__generated__/component-sets/text-field.mjs +35 -36
  129. package/src/entities/data/__generated__/component-sets/toggle-button.d.ts +7 -7
  130. package/src/entities/data/__generated__/component-sets/toggle-button.mjs +7 -7
  131. package/src/entities/data/__generated__/component-sets/top-navigation.d.ts +42 -0
  132. package/src/entities/data/__generated__/component-sets/top-navigation.mjs +42 -0
  133. package/src/entities/data/styles.ts +94 -0
  134. package/src/entities/index.ts +5 -2
  135. package/src/normalizer/from-plugin.ts +104 -44
  136. package/src/normalizer/types.ts +3 -1
  137. package/src/utils/figma-gradient.ts +72 -0
  138. package/src/utils/figma-node.ts +4 -3
  139. package/src/codegen/targets/react/component/handlers/action-chip.ts +0 -72
  140. package/src/codegen/targets/react/component/handlers/action-sheet.ts +0 -82
  141. package/src/codegen/targets/react/component/handlers/chip-tabs.ts +0 -57
  142. package/src/codegen/targets/react/component/handlers/control-chip.ts +0 -81
  143. package/src/codegen/targets/react/component/handlers/extended-action-sheet.ts +0 -98
  144. package/src/codegen/targets/react/component/handlers/extended-fab.ts +0 -25
  145. package/src/codegen/targets/react/component/handlers/fab.ts +0 -22
  146. package/src/codegen/targets/react/component/handlers/text-button.ts +0 -49
  147. package/src/entities/data/__generated__/component-sets/action-chip.d.ts +0 -57
  148. package/src/entities/data/__generated__/component-sets/action-chip.mjs +0 -57
  149. package/src/entities/data/__generated__/component-sets/action-sheet.d.ts +0 -40
  150. package/src/entities/data/__generated__/component-sets/action-sheet.mjs +0 -40
  151. package/src/entities/data/__generated__/component-sets/chip-tablist.d.ts +0 -24
  152. package/src/entities/data/__generated__/component-sets/chip-tablist.mjs +0 -24
  153. package/src/entities/data/__generated__/component-sets/control-chip.d.ts +0 -60
  154. package/src/entities/data/__generated__/component-sets/control-chip.mjs +0 -60
  155. package/src/entities/data/__generated__/component-sets/identity-placeholder.d.ts +0 -13
  156. package/src/entities/data/__generated__/component-sets/identity-placeholder.mjs +0 -13
  157. package/src/entities/data/__generated__/component-sets/manner-temp-bar.d.ts +0 -23
  158. package/src/entities/data/__generated__/component-sets/manner-temp-bar.mjs +0 -23
  159. package/src/entities/data/__generated__/component-sets/standard-navigation.d.ts +0 -23
  160. package/src/entities/data/__generated__/component-sets/standard-navigation.mjs +0 -23
  161. package/src/entities/data/__generated__/component-sets/tablist.d.ts +0 -29
  162. package/src/entities/data/__generated__/component-sets/tablist.mjs +0 -29
  163. package/src/entities/data/__generated__/component-sets/template-bottom-fixed-bar.d.ts +0 -42
  164. package/src/entities/data/__generated__/component-sets/template-bottom-fixed-bar.mjs +0 -42
  165. package/src/entities/data/__generated__/component-sets/text-button.d.ts +0 -45
  166. package/src/entities/data/__generated__/component-sets/text-button.mjs +0 -45
@@ -0,0 +1,106 @@
1
+ import type {
2
+ MenuSheetGroupProperties,
3
+ MenuSheetItemProperties,
4
+ MenuSheetProperties,
5
+ } from "@/codegen/component-properties";
6
+ import { defineComponentHandler } from "@/codegen/core";
7
+ import * as metadata from "@/entities/data/__generated__/component-sets";
8
+ import { findAllInstances } from "@/utils/figma-node";
9
+ import { camelCase } from "change-case";
10
+ import { createLocalSnippetHelper, createSeedReactElement } from "../../element-factories";
11
+ import type { ComponentHandlerDeps } from "../deps.interface";
12
+ import { match } from "ts-pattern";
13
+
14
+ const { createLocalSnippetElement } = createLocalSnippetHelper("menu-sheet");
15
+ const { createLocalSnippetElement: createLocalSnippetElementTrigger } =
16
+ createLocalSnippetHelper("action-button");
17
+
18
+ const MENU_SHEET_ITEM_KEY = "057083e95466da59051119eec0b41d4ad5a07f8f";
19
+ const createMenuSheetItemHandler = (ctx: ComponentHandlerDeps) =>
20
+ defineComponentHandler<MenuSheetItemProperties>(
21
+ MENU_SHEET_ITEM_KEY,
22
+ ({ componentProperties: props }) => {
23
+ const states = props.State.value.split("-");
24
+
25
+ const commonProps = {
26
+ tone: camelCase(props.Tone.value),
27
+ ...(states.includes("Disabled") && {
28
+ disabled: true,
29
+ }),
30
+ };
31
+
32
+ return createLocalSnippetElement("MenuSheetItem", commonProps, [
33
+ props["Show Prefix Icon#17043:5"].value
34
+ ? createSeedReactElement("PrefixIcon", {
35
+ svg: ctx.iconHandler.transform(props["Prefix Icon#55948:0"]),
36
+ })
37
+ : undefined,
38
+ props["Label#55905:8"].value,
39
+ ]);
40
+ },
41
+ );
42
+
43
+ const MENU_SHEET_GROUP_KEY = "2a504a1c6b7810d5e652862dcba2cb7048f9eb16";
44
+ const createMenuSheetGroupHandler = (ctx: ComponentHandlerDeps) => {
45
+ const menuSheetItemHandler = createMenuSheetItemHandler(ctx);
46
+
47
+ return defineComponentHandler<MenuSheetGroupProperties>(
48
+ MENU_SHEET_GROUP_KEY,
49
+ (node, traverse) => {
50
+ const items = findAllInstances<MenuSheetItemProperties>({
51
+ node,
52
+ key: menuSheetItemHandler.key,
53
+ });
54
+
55
+ const contentChildren = items.map((item) => menuSheetItemHandler.transform(item, traverse));
56
+
57
+ return createLocalSnippetElement("MenuSheetGroup", undefined, contentChildren);
58
+ },
59
+ );
60
+ };
61
+
62
+ export const createMenuSheetHandler = (ctx: ComponentHandlerDeps) => {
63
+ const menuSheetGroupHandler = createMenuSheetGroupHandler(ctx);
64
+
65
+ return defineComponentHandler<MenuSheetProperties>(metadata.menuSheet.key, (node, traverse) => {
66
+ const { componentProperties: props } = node;
67
+
68
+ const groups = findAllInstances<MenuSheetGroupProperties>({
69
+ node,
70
+ key: menuSheetGroupHandler.key,
71
+ });
72
+
73
+ const contentChildren = groups.map((group) => menuSheetGroupHandler.transform(group, traverse));
74
+
75
+ const title = props["Show Header#17043:12"].value
76
+ ? props["Title Text#14599:0"].value
77
+ : undefined;
78
+
79
+ // TODO: React 구현체에 description 추가 이후
80
+ // const description = props["Description Text#21827:0"].value;
81
+
82
+ const { labelAlignment } = match(props.Layout.value)
83
+ .with("Text with Icon", () => ({ labelAlignment: undefined }))
84
+ .with("Text Only", () => ({ labelAlignment: "center" }))
85
+ .exhaustive();
86
+
87
+ const content = createLocalSnippetElement(
88
+ "MenuSheetContent",
89
+ { title, labelAlignment },
90
+ contentChildren,
91
+ {
92
+ comment: title
93
+ ? undefined
94
+ : "title을 제공하지 않는 경우 aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
95
+ },
96
+ );
97
+
98
+ const trigger = createLocalSnippetElement(
99
+ "MenuSheetTrigger",
100
+ { asChild: true },
101
+ createLocalSnippetElementTrigger("ActionButton", {}, "MenuSheet 열기"),
102
+ );
103
+
104
+ return createLocalSnippetElement("MenuSheet", undefined, [trigger, content]);
105
+ });
106
+ };
@@ -5,7 +5,7 @@ import { createLocalSnippetHelper } from "../../element-factories";
5
5
  import type { ComponentHandlerDeps } from "../deps.interface";
6
6
  import { handleSizeProp } from "../size";
7
7
 
8
- const { createLocalSnippetElement } = createLocalSnippetHelper("multiline-text-field");
8
+ const { createLocalSnippetElement } = createLocalSnippetHelper("text-field");
9
9
 
10
10
  export const createMultilineTextFieldHandler = (_ctx: ComponentHandlerDeps) =>
11
11
  defineComponentHandler<MultilineTextFieldProperties>(
@@ -45,7 +45,9 @@ export const createProgressCircleHandler = (_ctx: ComponentHandlerDeps) =>
45
45
  minValue,
46
46
  maxValue,
47
47
  size: props.Size.value,
48
- tone: camelCase(props.Tone.value),
48
+ ...(props.Tone.value !== "Custom(inherit)" && {
49
+ tone: camelCase(props.Tone.value),
50
+ }),
49
51
  };
50
52
 
51
53
  return createLocalSnippetElement("ProgressCircle", commonProps);
@@ -36,7 +36,7 @@ export const createSegmentedControlHandler = (ctx: ComponentHandlerDeps) => {
36
36
 
37
37
  return defineComponentHandler<SegmentedControlProperties>(
38
38
  metadata.segmentedControl.key,
39
- (node) => {
39
+ (node, traverse) => {
40
40
  const segments = findAllInstances<SegmentedControlItemProperties>({
41
41
  node,
42
42
  key: segmentedControlItemHandler.key,
@@ -46,7 +46,9 @@ export const createSegmentedControlHandler = (ctx: ComponentHandlerDeps) => {
46
46
  segment.componentProperties.State.value.split("-").includes("Selected"),
47
47
  );
48
48
 
49
- const segmentedControlChildren = segments.map(segmentedControlItemHandler.transform);
49
+ const segmentedControlChildren = segments.map((segment) =>
50
+ segmentedControlItemHandler.transform(segment, traverse),
51
+ );
50
52
 
51
53
  const commonProps = {
52
54
  ...(selectedSegment && {
@@ -14,7 +14,7 @@ export const createSelectBoxHandler = (_ctx: ComponentHandlerDeps) =>
14
14
  ({ componentProperties: props }) => {
15
15
  const tag = match(props.Control.value)
16
16
  .with("Checkbox", () => "CheckSelectBox")
17
- .with("Radio", () => "RadioSelectBox")
17
+ .with("Radio", () => "RadioSelectBoxItem")
18
18
  .exhaustive();
19
19
 
20
20
  const states = props.State.value.split("-");
@@ -24,7 +24,7 @@ export const createSelectBoxHandler = (_ctx: ComponentHandlerDeps) =>
24
24
  ...(props["Show Description#3033:0"].value && {
25
25
  description: props["Description #3033:5"].value,
26
26
  }),
27
- ...(tag === "RadioSelectBox" && {
27
+ ...(tag === "RadioSelectBoxItem" && {
28
28
  value: props["Label#3635:0"].value,
29
29
  }),
30
30
  ...(tag === "CheckSelectBox" &&
@@ -42,12 +42,12 @@ export const createSelectBoxGroupHandler = (ctx: ComponentHandlerDeps) => {
42
42
 
43
43
  return defineComponentHandler<SelectBoxGroupProperties>(
44
44
  metadata.templateSelectBoxGroup.key,
45
- (node) => {
45
+ (node, traverse) => {
46
46
  const props = node.componentProperties;
47
47
 
48
48
  const tag = match(props.Control.value)
49
49
  .with("Checkbox", () => "CheckSelectBoxGroup")
50
- .with("Radio", () => "RadioSelectBoxGroup")
50
+ .with("Radio", () => "RadioSelectBoxRoot")
51
51
  .exhaustive();
52
52
 
53
53
  const selectBoxes = findAllInstances<SelectBoxProperties>({
@@ -59,14 +59,17 @@ export const createSelectBoxGroupHandler = (ctx: ComponentHandlerDeps) => {
59
59
  selectBox.componentProperties.State.value.split("-").includes("Selected"),
60
60
  );
61
61
 
62
+ // traverse the container like it's a frame
63
+ const vStackProps = traverse({ ...node, type: "FRAME" })?.props;
64
+
62
65
  const stack = createSeedReactElement(
63
- "Stack",
64
- { gap: "spacingY.componentDefault" },
65
- selectBoxes.map(selectBoxHandler.transform),
66
+ "VStack",
67
+ vStackProps,
68
+ selectBoxes.map((box) => selectBoxHandler.transform(box, traverse)),
66
69
  );
67
70
 
68
71
  const commonProps = {
69
- ...(tag === "RadioSelectBoxGroup" && {
72
+ ...(tag === "RadioSelectBoxRoot" && {
70
73
  defaultValue: selectedSelectBox?.componentProperties["Label#3635:0"].value,
71
74
  }),
72
75
  };
@@ -14,8 +14,8 @@ export const createSnackbarHandler = (_ctx: ComponentHandlerDeps) =>
14
14
  const commonProps = {
15
15
  message: props["Message#1528:4"].value,
16
16
  variant: camelCase(props.Variant.value),
17
- ...(props["Show Action Button#1528:0"].value && {
18
- actionLabel: props["Action Button Label#1528:8"].value,
17
+ ...(props["Show Action#1528:0"].value && {
18
+ actionLabel: props["Action Label#1528:8"].value,
19
19
  }),
20
20
  };
21
21
 
@@ -3,7 +3,6 @@ import { defineComponentHandler } from "@/codegen/core";
3
3
  import * as metadata from "@/entities/data/__generated__/component-sets";
4
4
  import { createLocalSnippetHelper } from "../../element-factories";
5
5
  import type { ComponentHandlerDeps } from "../deps.interface";
6
- import { handleSizeProp } from "../size";
7
6
 
8
7
  const { createLocalSnippetElement } = createLocalSnippetHelper("switch");
9
8
 
@@ -13,13 +12,9 @@ export const createSwitchHandler = (_ctx: ComponentHandlerDeps) =>
13
12
  ({ componentProperties: props }) => {
14
13
  const states = props.State.value.split("-");
15
14
 
16
- const size = handleSizeProp(props.Size.value);
17
-
18
15
  const commonProps = {
19
- size,
20
- ...(size === "small" && {
21
- label: props["Label#15191:2"].value,
22
- }),
16
+ size: props.Size.value,
17
+ label: props["Label#36578:0"].value,
23
18
  ...(states.includes("Selected") && {
24
19
  defaultChecked: true,
25
20
  }),
@@ -1,131 +1,14 @@
1
- import type {
2
- TabsFillItemProperties,
3
- TabsHugItemProperties,
4
- TabsProperties,
5
- } from "@/codegen/component-properties";
6
- import { defineComponentHandler } from "@/codegen/core";
7
- import * as metadata from "@/entities/data/__generated__/component-sets";
8
- import type { NormalizedInstanceNode } from "@/normalizer";
9
- import { camelCase } from "change-case";
10
1
  import { createLocalSnippetHelper } from "../../element-factories";
11
- import type { ComponentHandlerDeps } from "../deps.interface";
12
- import { handleSizeProp } from "../size";
13
2
 
14
- const { createLocalSnippetElement } = createLocalSnippetHelper("tabs");
3
+ const { createLocalSnippetElement: createTabsLocalSnippetElement } =
4
+ createLocalSnippetHelper("tabs");
15
5
 
16
- const TABS_HUG_ITEM_KEY = "c242492543b327ceb84fa9933841512fc62a898c";
17
- const createTabsHugItemHandler = (_ctx: ComponentHandlerDeps) =>
18
- defineComponentHandler<TabsHugItemProperties>(
19
- TABS_HUG_ITEM_KEY,
20
- ({ componentProperties: props }) => {
21
- const states = props.State.value.split("-");
6
+ const TABS_UNDERLINE_HUG_ITEM_KEY = "946cc52671ac3f46e20a8ff12fcc1c7f618da675";
7
+ const TABS_UNDERLINE_FILL_ITEM_KEY = "78039b6b86852b685a6e93e9b6743b9e577cd7db";
22
8
 
23
- const commonProps = {
24
- value: props["Label#4478:2"].value,
25
- ...(props.Notification.value === "True" && {
26
- alert: true,
27
- }),
28
- ...(states.includes("Disabled") && {
29
- disabled: true,
30
- }),
31
- };
9
+ const { createLocalSnippetElement: createChipTabsLocalSnippetElement } =
10
+ createLocalSnippetHelper("chip-tabs");
32
11
 
33
- return createLocalSnippetElement("TabsTrigger", commonProps, props["Label#4478:2"].value);
34
- },
35
- );
12
+ const TABS_CHIP_ITEM_KEY = "95bf31a329f9e8bba0d9aa2299d1552f1d388148";
36
13
 
37
- const TABS_FILL_ITEM_KEY = "7275293344efb40ee9a3f5248ba2659b94a0b305";
38
- const createTabsFillItemHandler = (_ctx: ComponentHandlerDeps) =>
39
- defineComponentHandler<TabsFillItemProperties>(
40
- TABS_FILL_ITEM_KEY,
41
- ({ componentProperties: props }) => {
42
- const states = props.State.value.split("-");
43
-
44
- const commonProps = {
45
- value: props["Label#4478:2"].value,
46
- ...(props.Notification.value === "True" && {
47
- alert: true,
48
- }),
49
- ...(states.includes("Disabled") && {
50
- disabled: true,
51
- }),
52
- };
53
-
54
- return createLocalSnippetElement("TabsTrigger", commonProps, props["Label#4478:2"].value);
55
- },
56
- );
57
-
58
- export const createTabsHandler = (ctx: ComponentHandlerDeps) => {
59
- const tabsHugItemHandler = createTabsHugItemHandler(ctx);
60
- const tabsFillItemHandler = createTabsFillItemHandler(ctx);
61
-
62
- return defineComponentHandler<TabsProperties>(metadata.tablist.key, (node) => {
63
- const { componentProperties: props, children } = node;
64
-
65
- const mappedItems = children.map(
66
- (
67
- child,
68
- ): {
69
- triggerLayout: "hug" | "fill";
70
- node: NormalizedInstanceNode & {
71
- componentProperties: TabsHugItemProperties | TabsFillItemProperties;
72
- };
73
- } | null => {
74
- if (child.type !== "INSTANCE") return null;
75
-
76
- const componentKey = child.componentSetKey ? child.componentSetKey : child.componentKey;
77
-
78
- if (componentKey === tabsHugItemHandler.key)
79
- return {
80
- triggerLayout: "hug" as const,
81
- node: child as NormalizedInstanceNode & { componentProperties: TabsHugItemProperties },
82
- };
83
-
84
- if (componentKey === tabsFillItemHandler.key)
85
- return {
86
- triggerLayout: "fill" as const,
87
- node: child as NormalizedInstanceNode & { componentProperties: TabsFillItemProperties },
88
- };
89
-
90
- return null;
91
- },
92
- );
93
-
94
- const tabsItems = mappedItems.filter(
95
- (item): item is NonNullable<(typeof mappedItems)[number]> => item !== null,
96
- );
97
-
98
- const selectedTabsItem = tabsItems.find(({ node: { componentProperties } }) =>
99
- componentProperties.State.value.split("-").includes("Selected"),
100
- )?.node;
101
-
102
- const tabTriggerList = createLocalSnippetElement(
103
- "TabsList",
104
- undefined,
105
- tabsItems.map(({ triggerLayout, node }) => {
106
- switch (triggerLayout) {
107
- case "hug":
108
- return tabsHugItemHandler.transform(node);
109
- case "fill":
110
- return tabsFillItemHandler.transform(node);
111
- }
112
- }),
113
- );
114
-
115
- const tabContents = tabsItems.map(({ node }) => {
116
- const value = node.componentProperties["Label#4478:2"].value;
117
-
118
- return createLocalSnippetElement("TabsContent", { value }, "{/* TODO: 컨텐츠 추가 */}");
119
- });
120
-
121
- const commonProps = {
122
- triggerLayout: camelCase(props.Layout.value),
123
- size: handleSizeProp(props.Size.value),
124
- ...(selectedTabsItem && {
125
- defaultValue: selectedTabsItem.componentProperties["Label#4478:2"].value,
126
- }),
127
- };
128
-
129
- return createLocalSnippetElement("TabsRoot", commonProps, [tabTriggerList, ...tabContents]);
130
- });
131
- };
14
+ // TODO: Implement the tabs handler
@@ -1,25 +1,30 @@
1
1
  import type { ComponentHandler } from "@/codegen/core";
2
2
  import type { NormalizedInstanceNode } from "@/normalizer";
3
3
  import type { ComponentHandlerDeps } from "./deps.interface";
4
- import { createActionButtonHandler } from "./handlers/action-button";
5
- import { createActionChipHandler } from "./handlers/action-chip";
6
- import { createActionSheetHandler } from "./handlers/action-sheet";
4
+
5
+ import {
6
+ createActionButtonHandler,
7
+ createActionButtonGhostHandler,
8
+ } from "./handlers/action-button";
9
+ import { createAlertDialogHandler } from "./handlers/alert-dialog";
7
10
  import { createAppBarHandler } from "./handlers/app-bar";
8
11
  import { createAvatarHandler } from "./handlers/avatar";
9
12
  import { createAvatarStackHandler } from "./handlers/avatar-stack";
10
13
  import { createBadgeHandler } from "./handlers/badge";
14
+ import { createBottomSheetHandler } from "./handlers/bottom-sheet";
11
15
  import { createCalloutHandler } from "./handlers/callout";
12
16
  import { createCheckboxHandler } from "./handlers/checkbox";
13
- import { createChipTabsHandler } from "./handlers/chip-tabs";
14
- import { createControlChipHandler } from "./handlers/control-chip";
17
+ import { createChipHandler } from "./handlers/chip";
18
+ import { createContextualFloatingButtonHandler } from "./handlers/contextual-floating-button";
19
+ import { createDividerHandler } from "./handlers/divider";
15
20
  import { createErrorStateHandler } from "./handlers/error-state";
16
- import { createExtendedActionSheetHandler } from "./handlers/extended-action-sheet";
17
- import { createExtendedFabHandler } from "./handlers/extended-fab";
18
- import { createFabHandler } from "./handlers/fab";
21
+ import { createFloatingActionButtonHandler } from "./handlers/floating-action-button";
19
22
  import { createHelpBubbleHandler } from "./handlers/help-bubble";
20
23
  import { createIdentityPlaceholderHandler } from "./handlers/identity-placeholder";
21
24
  import { createInlineBannerHandler } from "./handlers/inline-banner";
22
25
  import { createMannerTempBadgeHandler } from "./handlers/manner-temp-badge";
26
+ import { createMannerTempHandler } from "./handlers/manner-temp";
27
+ import { createMenuSheetHandler } from "./handlers/menu-sheet";
23
28
  import { createMultilineTextFieldHandler } from "./handlers/multiline-text-field";
24
29
  import { createProgressCircleHandler } from "./handlers/progress-circle";
25
30
  import { createReactionButtonHandler } from "./handlers/reaction-button";
@@ -28,8 +33,6 @@ import { createSelectBoxGroupHandler, createSelectBoxHandler } from "./handlers/
28
33
  import { createSkeletonHandler } from "./handlers/skeleton";
29
34
  import { createSnackbarHandler } from "./handlers/snackbar";
30
35
  import { createSwitchHandler } from "./handlers/switch";
31
- import { createTabsHandler } from "./handlers/tabs";
32
- import { createTextButtonHandler } from "./handlers/text-button";
33
36
  import { createTextFieldHandler } from "./handlers/text-field";
34
37
  import { createToggleButtonHandler } from "./handlers/toggle-button";
35
38
 
@@ -46,25 +49,27 @@ export function bindComponentHandler<T extends NormalizedInstanceNode["component
46
49
  }
47
50
 
48
51
  export const unboundSeedComponentHandlers: Array<UnboundComponentHandler<any>> = [
52
+ createActionButtonGhostHandler,
49
53
  createActionButtonHandler,
50
- createActionChipHandler,
51
- createActionSheetHandler,
54
+ createAlertDialogHandler,
52
55
  createAppBarHandler,
53
56
  createAvatarHandler,
54
57
  createAvatarStackHandler,
55
58
  createBadgeHandler,
59
+ createBottomSheetHandler,
56
60
  createCalloutHandler,
57
61
  createCheckboxHandler,
58
- createChipTabsHandler,
59
- createControlChipHandler,
62
+ createChipHandler,
63
+ createContextualFloatingButtonHandler,
64
+ createDividerHandler,
60
65
  createErrorStateHandler,
61
- createExtendedActionSheetHandler,
62
- createExtendedFabHandler,
63
- createFabHandler,
66
+ createFloatingActionButtonHandler,
64
67
  createHelpBubbleHandler,
65
68
  createIdentityPlaceholderHandler,
66
69
  createInlineBannerHandler,
67
70
  createMannerTempBadgeHandler,
71
+ createMannerTempHandler,
72
+ createMenuSheetHandler,
68
73
  createMultilineTextFieldHandler,
69
74
  createProgressCircleHandler,
70
75
  createReactionButtonHandler,
@@ -74,8 +79,6 @@ export const unboundSeedComponentHandlers: Array<UnboundComponentHandler<any>> =
74
79
  createSkeletonHandler,
75
80
  createSnackbarHandler,
76
81
  createSwitchHandler,
77
- createTabsHandler,
78
- createTextButtonHandler,
79
82
  createTextFieldHandler,
80
83
  createToggleButtonHandler,
81
84
  ];
@@ -37,7 +37,7 @@ export function createInstanceTransformer({
37
37
  : componentHandlers[componentKey];
38
38
 
39
39
  if (componentHandler) {
40
- return componentHandler.transform(node);
40
+ return componentHandler.transform(node, traverse);
41
41
  }
42
42
 
43
43
  return frameTransformer(node, traverse);
@@ -28,7 +28,8 @@ import {
28
28
  import { createTextTransformer } from "./text";
29
29
  import {
30
30
  defaultRawValueFormatters,
31
- defaultStyleNameFormatter,
31
+ defaultTextStyleNameFormatter,
32
+ defaultFillStyleResolver,
32
33
  defaultVariableNameFormatter,
33
34
  } from "./value-resolver";
34
35
 
@@ -51,7 +52,8 @@ export function createPipeline(options: CreatePipelineConfig = {}) {
51
52
  variableService,
52
53
  variableNameFormatter: defaultVariableNameFormatter,
53
54
  styleService,
54
- styleNameFormatter: defaultStyleNameFormatter,
55
+ textStyleNameFormatter: defaultTextStyleNameFormatter,
56
+ fillStyleResolver: defaultFillStyleResolver,
55
57
  rawValueFormatters: defaultRawValueFormatters,
56
58
  shouldInferVariableName,
57
59
  });
@@ -143,7 +143,7 @@ export function createContainerLayoutPropsConverter(
143
143
  }
144
144
 
145
145
  export interface SelfLayoutProps {
146
- grow?: 0 | 1 | true;
146
+ flexGrow?: 0 | 1 | true;
147
147
  alignSelf?: "stretch";
148
148
  width?: string | number;
149
149
  height?: string | number;
@@ -162,7 +162,7 @@ export function createSelfLayoutPropsConverter(
162
162
  props: {} as SelfLayoutProps,
163
163
  },
164
164
  handlers: {
165
- grow: ({ layoutGrow }) => (layoutGrow === 1 ? true : layoutGrow),
165
+ flexGrow: ({ layoutGrow }) => (layoutGrow === 1 ? true : layoutGrow),
166
166
  alignSelf: ({ layoutAlign }) =>
167
167
  match(layoutAlign)
168
168
  .with("STRETCH", () => "stretch" as const)
@@ -198,7 +198,7 @@ export function createSelfLayoutPropsConverter(
198
198
  : undefined,
199
199
  },
200
200
  defaults: {
201
- grow: 0,
201
+ flexGrow: 0,
202
202
  },
203
203
  });
204
204
  }
@@ -291,16 +291,23 @@ export function createTypeStylePropsConverter({
291
291
  });
292
292
  }
293
293
 
294
- export interface FrameFillProps {
295
- bg?: string;
296
- }
294
+ export type FrameFillProps =
295
+ | { bg?: string | undefined; bgGradient?: never; bgGradientDirection?: never }
296
+ | { bg?: never; bgGradient: string; bgGradientDirection?: string };
297
297
 
298
298
  export function createFrameFillPropsConverter(valueResolver: ReactValueResolver) {
299
299
  return definePropsConverter<FillTrait, FrameFillProps>((node) => {
300
300
  const bg = valueResolver.getFormattedValue.frameFill(node);
301
301
 
302
+ if (bg === undefined || typeof bg === "string") {
303
+ return {
304
+ bg,
305
+ };
306
+ }
307
+
302
308
  return {
303
- bg,
309
+ bgGradient: bg.value,
310
+ ...(bg.direction && { bgGradientDirection: bg.direction }),
304
311
  };
305
312
  });
306
313
  }
@@ -364,7 +371,7 @@ export function createVectorChildrenFillPropsConverter(valueResolver: ReactValue
364
371
  }
365
372
 
366
373
  export interface StrokeProps {
367
- borderWidth?: number;
374
+ borderWidth?: string;
368
375
  borderColor?: string;
369
376
  }
370
377
 
@@ -373,7 +380,7 @@ export function createStrokePropsConverter(
373
380
  ): PropsConverter<StrokeTrait, StrokeProps> {
374
381
  return definePropsConverter((node) => {
375
382
  const borderColor = valueResolver.getFormattedValue.stroke(node);
376
- const borderWidth = borderColor ? node.strokeWeight : undefined;
383
+ const borderWidth = borderColor && node.strokeWeight ? `${node.strokeWeight}` : undefined;
377
384
 
378
385
  return {
379
386
  borderColor,
@@ -3,7 +3,13 @@ import { camelCasePreserveUnderscoreBetweenNumbers } from "@/utils/common";
3
3
  import { toCssPixel, toCssRgba } from "@/utils/css";
4
4
  import { camelCase } from "change-case";
5
5
 
6
- export type ReactValueResolver = ValueResolver<string, string, string, number>;
6
+ export type ReactValueResolver = ValueResolver<
7
+ string,
8
+ { value: string; direction?: string },
9
+ string,
10
+ string,
11
+ number
12
+ >;
7
13
 
8
14
  export const defaultVariableNameFormatter = ({ slug }: { slug: string[] }) =>
9
15
  slug
@@ -21,8 +27,37 @@ export const defaultVariableNameFormatter = ({ slug }: { slug: string[] }) =>
21
27
  .map(camelCasePreserveUnderscoreBetweenNumbers)
22
28
  .join(".");
23
29
 
24
- export const defaultStyleNameFormatter = ({ slug }: { slug: string[] }) =>
25
- camelCase(slug[slug.length - 1]!, { mergeAmbiguousCharacters: true });
30
+ export const defaultTextStyleNameFormatter = ({ slug }: { slug: string[] }) => {
31
+ return camelCase(slug[slug.length - 1]!, { mergeAmbiguousCharacters: true });
32
+ };
33
+
34
+ export const defaultFillStyleResolver = ({ slug }: { slug: string[] }) => {
35
+ const [, ...rest] = slug;
36
+
37
+ if (rest[0] === "fade") {
38
+ // ["fade", "layer-default", "↓(to-bottom)"]
39
+
40
+ const last = rest[rest.length - 1];
41
+
42
+ const direction = (() => {
43
+ if (last.startsWith("↓")) return "to bottom";
44
+ if (last.startsWith("↑")) return "to top";
45
+ if (last.startsWith("→")) return "to right";
46
+ if (last.startsWith("←")) return "to left";
47
+
48
+ return "unknown";
49
+ })();
50
+
51
+ return {
52
+ value: camelCase(rest.slice(0, -1).join("-"), { mergeAmbiguousCharacters: true }),
53
+ direction,
54
+ };
55
+ }
56
+
57
+ return {
58
+ value: camelCase(rest.join("-"), { mergeAmbiguousCharacters: true }),
59
+ };
60
+ };
26
61
 
27
62
  export const defaultRawValueFormatters = {
28
63
  color: (value: RGBA) => toCssRgba(value),
@@ -2,21 +2,21 @@ export declare const metadata: {
2
2
  "name": "🟢 Action Button",
3
3
  "key": "450ede9d0bf42fc6ef14345c77e6e407d6d5ee89",
4
4
  "componentPropertyDefinitions": {
5
+ "Label#5987:61": {
6
+ "type": "TEXT"
7
+ },
5
8
  "Suffix Icon#5987:244": {
6
9
  "type": "INSTANCE_SWAP",
7
10
  "preferredValues": []
8
11
  },
9
- "Icon#7574:0": {
12
+ "Prefix Icon#5987:305": {
10
13
  "type": "INSTANCE_SWAP",
11
14
  "preferredValues": []
12
15
  },
13
- "Prefix Icon#5987:305": {
16
+ "Icon#7574:0": {
14
17
  "type": "INSTANCE_SWAP",
15
18
  "preferredValues": []
16
19
  },
17
- "Label#5987:61": {
18
- "type": "TEXT"
19
- },
20
20
  "Size": {
21
21
  "type": "VARIANT",
22
22
  "variantOptions": [