@seed-design/figma 0.0.5 → 0.0.15

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 (195) hide show
  1. package/lib/index.cjs +5548 -4901
  2. package/lib/index.d.ts +489 -189
  3. package/lib/index.js +5535 -4888
  4. package/package.json +3 -2
  5. package/src/codegen/core/codegen.ts +65 -0
  6. package/src/codegen/core/component.ts +15 -27
  7. package/src/codegen/core/component.types.ts +29 -0
  8. package/src/codegen/core/element.ts +13 -0
  9. package/src/codegen/core/index.ts +13 -8
  10. package/src/codegen/core/infer-layout.test.ts +285 -0
  11. package/src/codegen/core/infer-layout.ts +416 -0
  12. package/src/codegen/core/jsx.ts +12 -0
  13. package/src/codegen/core/props.ts +81 -0
  14. package/src/codegen/core/value.ts +289 -0
  15. package/src/codegen/index.ts +39 -6
  16. package/src/codegen/targets/figma/context.ts +139 -0
  17. package/src/codegen/targets/figma/frame.ts +37 -0
  18. package/src/codegen/targets/figma/index.ts +6 -0
  19. package/src/codegen/targets/figma/instance.ts +16 -0
  20. package/src/codegen/targets/figma/props.ts +244 -0
  21. package/src/codegen/targets/figma/shape.ts +62 -0
  22. package/src/codegen/targets/figma/text.ts +33 -0
  23. package/src/codegen/targets/index.ts +2 -0
  24. package/src/codegen/{domain/seed-component → targets/react/component}/deps.interface.ts +2 -2
  25. package/src/codegen/{domain/seed-component → targets/react/component}/index.ts +36 -34
  26. package/src/codegen/{domain/seed-component → targets/react/component}/properties.type.ts +2 -2
  27. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/action-button.ts +4 -5
  28. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/action-chip.ts +3 -4
  29. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/action-sheet.ts +4 -5
  30. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/app-bar.ts +5 -6
  31. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/avatar-stack.ts +4 -5
  32. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/avatar.ts +4 -5
  33. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/badge.ts +4 -5
  34. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/callout.ts +4 -5
  35. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/checkbox.ts +4 -5
  36. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/chip-tabs.ts +4 -5
  37. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/control-chip.ts +4 -5
  38. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/error-state.ts +4 -5
  39. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/extended-action-sheet.ts +4 -5
  40. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/extended-fab.ts +4 -5
  41. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/fab.ts +2 -2
  42. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/help-bubble.ts +2 -2
  43. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/identity-placeholder.ts +2 -2
  44. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/inline-banner.ts +5 -6
  45. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/manner-temp-badge.ts +3 -4
  46. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/multiline-text-field.ts +4 -5
  47. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/progress-circle.ts +3 -4
  48. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/reaction-button.ts +4 -5
  49. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/segmented-control.ts +4 -5
  50. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/select-box.ts +4 -5
  51. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/skeleton.ts +3 -4
  52. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/snackbar.ts +3 -4
  53. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/switch.ts +4 -5
  54. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/tabs.ts +5 -6
  55. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/text-button.ts +6 -7
  56. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/text-field.ts +4 -5
  57. package/src/codegen/{domain/seed-component → targets/react/component}/transformers/toggle-button.ts +4 -5
  58. package/src/codegen/targets/react/context.ts +170 -0
  59. package/src/codegen/targets/react/frame.ts +75 -0
  60. package/src/codegen/targets/react/index.ts +7 -0
  61. package/src/codegen/{domain/instance.service.ts → targets/react/instance.ts} +20 -33
  62. package/src/codegen/targets/react/props.ts +361 -0
  63. package/src/codegen/targets/react/shape.ts +36 -0
  64. package/src/codegen/targets/react/text.ts +33 -0
  65. package/src/{codegen → entities}/data/icons.ts +1 -1
  66. package/src/{codegen → entities}/data/styles.ts +1 -1
  67. package/src/{codegen → entities}/data/variable-collections.ts +1 -1
  68. package/src/{codegen → entities}/data/variables.ts +1 -1
  69. package/src/entities/index.ts +41 -0
  70. package/src/{codegen/domain → entities}/style.repository.ts +6 -2
  71. package/src/{codegen/domain → entities}/style.service.ts +1 -1
  72. package/src/{codegen/domain → entities}/variable.repository.ts +17 -4
  73. package/src/{codegen/domain → entities}/variable.service.ts +47 -9
  74. package/src/index.ts +1 -0
  75. package/src/normalizer/from-plugin.ts +3 -0
  76. package/src/normalizer/types.ts +28 -24
  77. package/src/utils/common.ts +4 -0
  78. package/src/utils/css.ts +10 -4
  79. package/src/utils/figma-node.ts +42 -2
  80. package/src/codegen/context.ts +0 -148
  81. package/src/codegen/core/transformer.ts +0 -40
  82. package/src/codegen/domain/codegen.service.ts +0 -69
  83. package/src/codegen/domain/figma-component.service.ts +0 -21
  84. package/src/codegen/domain/frame.service.ts +0 -108
  85. package/src/codegen/domain/index.ts +0 -22
  86. package/src/codegen/domain/props/container-layout-props.service.ts +0 -248
  87. package/src/codegen/domain/props/fill-props.service.ts +0 -75
  88. package/src/codegen/domain/props/radius-props.service.ts +0 -105
  89. package/src/codegen/domain/props/self-layout-props.service.ts +0 -127
  90. package/src/codegen/domain/props/stroke-props.service.ts +0 -45
  91. package/src/codegen/domain/props/type-style-props.service.ts +0 -31
  92. package/src/codegen/domain/rectangle.service.ts +0 -31
  93. package/src/codegen/domain/text.service.ts +0 -62
  94. /package/src/codegen/{domain/seed-component → targets/react/component}/size.ts +0 -0
  95. /package/src/{codegen → entities}/data/__generated__/component-sets/action-button.d.ts +0 -0
  96. /package/src/{codegen → entities}/data/__generated__/component-sets/action-button.mjs +0 -0
  97. /package/src/{codegen → entities}/data/__generated__/component-sets/action-chip.d.ts +0 -0
  98. /package/src/{codegen → entities}/data/__generated__/component-sets/action-chip.mjs +0 -0
  99. /package/src/{codegen → entities}/data/__generated__/component-sets/action-sheet.d.ts +0 -0
  100. /package/src/{codegen → entities}/data/__generated__/component-sets/action-sheet.mjs +0 -0
  101. /package/src/{codegen → entities}/data/__generated__/component-sets/avatar-stack.d.ts +0 -0
  102. /package/src/{codegen → entities}/data/__generated__/component-sets/avatar-stack.mjs +0 -0
  103. /package/src/{codegen → entities}/data/__generated__/component-sets/avatar.d.ts +0 -0
  104. /package/src/{codegen → entities}/data/__generated__/component-sets/avatar.mjs +0 -0
  105. /package/src/{codegen → entities}/data/__generated__/component-sets/badge.d.ts +0 -0
  106. /package/src/{codegen → entities}/data/__generated__/component-sets/badge.mjs +0 -0
  107. /package/src/{codegen → entities}/data/__generated__/component-sets/bottom-navigation-global.d.ts +0 -0
  108. /package/src/{codegen → entities}/data/__generated__/component-sets/bottom-navigation-global.mjs +0 -0
  109. /package/src/{codegen → entities}/data/__generated__/component-sets/bottom-navigation-kr.d.ts +0 -0
  110. /package/src/{codegen → entities}/data/__generated__/component-sets/bottom-navigation-kr.mjs +0 -0
  111. /package/src/{codegen → entities}/data/__generated__/component-sets/bottom-sheet.d.ts +0 -0
  112. /package/src/{codegen → entities}/data/__generated__/component-sets/bottom-sheet.mjs +0 -0
  113. /package/src/{codegen → entities}/data/__generated__/component-sets/callout.d.ts +0 -0
  114. /package/src/{codegen → entities}/data/__generated__/component-sets/callout.mjs +0 -0
  115. /package/src/{codegen → entities}/data/__generated__/component-sets/checkbox.d.ts +0 -0
  116. /package/src/{codegen → entities}/data/__generated__/component-sets/checkbox.mjs +0 -0
  117. /package/src/{codegen → entities}/data/__generated__/component-sets/chip-tablist.d.ts +0 -0
  118. /package/src/{codegen → entities}/data/__generated__/component-sets/chip-tablist.mjs +0 -0
  119. /package/src/{codegen → entities}/data/__generated__/component-sets/control-chip.d.ts +0 -0
  120. /package/src/{codegen → entities}/data/__generated__/component-sets/control-chip.mjs +0 -0
  121. /package/src/{codegen → entities}/data/__generated__/component-sets/divider.d.ts +0 -0
  122. /package/src/{codegen → entities}/data/__generated__/component-sets/divider.mjs +0 -0
  123. /package/src/{codegen → entities}/data/__generated__/component-sets/error-state.d.ts +0 -0
  124. /package/src/{codegen → entities}/data/__generated__/component-sets/error-state.mjs +0 -0
  125. /package/src/{codegen → entities}/data/__generated__/component-sets/extended-action-sheet.d.ts +0 -0
  126. /package/src/{codegen → entities}/data/__generated__/component-sets/extended-action-sheet.mjs +0 -0
  127. /package/src/{codegen → entities}/data/__generated__/component-sets/extended-floating-action-button.d.ts +0 -0
  128. /package/src/{codegen → entities}/data/__generated__/component-sets/extended-floating-action-button.mjs +0 -0
  129. /package/src/{codegen → entities}/data/__generated__/component-sets/floating-action-button.d.ts +0 -0
  130. /package/src/{codegen → entities}/data/__generated__/component-sets/floating-action-button.mjs +0 -0
  131. /package/src/{codegen → entities}/data/__generated__/component-sets/help-bubble.d.ts +0 -0
  132. /package/src/{codegen → entities}/data/__generated__/component-sets/help-bubble.mjs +0 -0
  133. /package/src/{codegen → entities}/data/__generated__/component-sets/identity-placeholder.d.ts +0 -0
  134. /package/src/{codegen → entities}/data/__generated__/component-sets/identity-placeholder.mjs +0 -0
  135. /package/src/{codegen → entities}/data/__generated__/component-sets/index.d.ts +0 -0
  136. /package/src/{codegen → entities}/data/__generated__/component-sets/index.mjs +0 -0
  137. /package/src/{codegen → entities}/data/__generated__/component-sets/inline-banner.d.ts +0 -0
  138. /package/src/{codegen → entities}/data/__generated__/component-sets/inline-banner.mjs +0 -0
  139. /package/src/{codegen → entities}/data/__generated__/component-sets/main-tab-navigation-global.d.ts +0 -0
  140. /package/src/{codegen → entities}/data/__generated__/component-sets/main-tab-navigation-global.mjs +0 -0
  141. /package/src/{codegen → entities}/data/__generated__/component-sets/main-tab-navigation-kr.d.ts +0 -0
  142. /package/src/{codegen → entities}/data/__generated__/component-sets/main-tab-navigation-kr.mjs +0 -0
  143. /package/src/{codegen → entities}/data/__generated__/component-sets/manner-temp-badge.d.ts +0 -0
  144. /package/src/{codegen → entities}/data/__generated__/component-sets/manner-temp-badge.mjs +0 -0
  145. /package/src/{codegen → entities}/data/__generated__/component-sets/manner-temp-bar.d.ts +0 -0
  146. /package/src/{codegen → entities}/data/__generated__/component-sets/manner-temp-bar.mjs +0 -0
  147. /package/src/{codegen → entities}/data/__generated__/component-sets/manner-temp.d.ts +0 -0
  148. /package/src/{codegen → entities}/data/__generated__/component-sets/manner-temp.mjs +0 -0
  149. /package/src/{codegen → entities}/data/__generated__/component-sets/multiline-text-field.d.ts +0 -0
  150. /package/src/{codegen → entities}/data/__generated__/component-sets/multiline-text-field.mjs +0 -0
  151. /package/src/{codegen → entities}/data/__generated__/component-sets/progress-circle.d.ts +0 -0
  152. /package/src/{codegen → entities}/data/__generated__/component-sets/progress-circle.mjs +0 -0
  153. /package/src/{codegen → entities}/data/__generated__/component-sets/radio.d.ts +0 -0
  154. /package/src/{codegen → entities}/data/__generated__/component-sets/radio.mjs +0 -0
  155. /package/src/{codegen → entities}/data/__generated__/component-sets/range-slider.d.ts +0 -0
  156. /package/src/{codegen → entities}/data/__generated__/component-sets/range-slider.mjs +0 -0
  157. /package/src/{codegen → entities}/data/__generated__/component-sets/reaction-button.d.ts +0 -0
  158. /package/src/{codegen → entities}/data/__generated__/component-sets/reaction-button.mjs +0 -0
  159. /package/src/{codegen → entities}/data/__generated__/component-sets/segmented-control.d.ts +0 -0
  160. /package/src/{codegen → entities}/data/__generated__/component-sets/segmented-control.mjs +0 -0
  161. /package/src/{codegen → entities}/data/__generated__/component-sets/select-box.d.ts +0 -0
  162. /package/src/{codegen → entities}/data/__generated__/component-sets/select-box.mjs +0 -0
  163. /package/src/{codegen → entities}/data/__generated__/component-sets/skeleton.d.ts +0 -0
  164. /package/src/{codegen → entities}/data/__generated__/component-sets/skeleton.mjs +0 -0
  165. /package/src/{codegen → entities}/data/__generated__/component-sets/slider.d.ts +0 -0
  166. /package/src/{codegen → entities}/data/__generated__/component-sets/slider.mjs +0 -0
  167. /package/src/{codegen → entities}/data/__generated__/component-sets/snackbar.d.ts +0 -0
  168. /package/src/{codegen → entities}/data/__generated__/component-sets/snackbar.mjs +0 -0
  169. /package/src/{codegen → entities}/data/__generated__/component-sets/standard-navigation.d.ts +0 -0
  170. /package/src/{codegen → entities}/data/__generated__/component-sets/standard-navigation.mjs +0 -0
  171. /package/src/{codegen → entities}/data/__generated__/component-sets/switch.d.ts +0 -0
  172. /package/src/{codegen → entities}/data/__generated__/component-sets/switch.mjs +0 -0
  173. /package/src/{codegen → entities}/data/__generated__/component-sets/tablist.d.ts +0 -0
  174. /package/src/{codegen → entities}/data/__generated__/component-sets/tablist.mjs +0 -0
  175. /package/src/{codegen → entities}/data/__generated__/component-sets/template-bottom-fixed-bar.d.ts +0 -0
  176. /package/src/{codegen → entities}/data/__generated__/component-sets/template-bottom-fixed-bar.mjs +0 -0
  177. /package/src/{codegen → entities}/data/__generated__/component-sets/template-button-group.d.ts +0 -0
  178. /package/src/{codegen → entities}/data/__generated__/component-sets/template-button-group.mjs +0 -0
  179. /package/src/{codegen → entities}/data/__generated__/component-sets/template-chip-group.d.ts +0 -0
  180. /package/src/{codegen → entities}/data/__generated__/component-sets/template-chip-group.mjs +0 -0
  181. /package/src/{codegen → entities}/data/__generated__/component-sets/template-select-box-group.d.ts +0 -0
  182. /package/src/{codegen → entities}/data/__generated__/component-sets/template-select-box-group.mjs +0 -0
  183. /package/src/{codegen → entities}/data/__generated__/component-sets/template-top-navigation.d.ts +0 -0
  184. /package/src/{codegen → entities}/data/__generated__/component-sets/template-top-navigation.mjs +0 -0
  185. /package/src/{codegen → entities}/data/__generated__/component-sets/text-button.d.ts +0 -0
  186. /package/src/{codegen → entities}/data/__generated__/component-sets/text-button.mjs +0 -0
  187. /package/src/{codegen → entities}/data/__generated__/component-sets/text-field.d.ts +0 -0
  188. /package/src/{codegen → entities}/data/__generated__/component-sets/text-field.mjs +0 -0
  189. /package/src/{codegen → entities}/data/__generated__/component-sets/toggle-button.d.ts +0 -0
  190. /package/src/{codegen → entities}/data/__generated__/component-sets/toggle-button.mjs +0 -0
  191. /package/src/{codegen/domain → entities}/icon.interface.ts +0 -0
  192. /package/src/{codegen/domain → entities}/icon.repository.ts +0 -0
  193. /package/src/{codegen/domain → entities}/icon.service.ts +0 -0
  194. /package/src/{codegen/domain → entities}/style.interface.ts +0 -0
  195. /package/src/{codegen/domain → entities}/variable.interface.ts +0 -0
@@ -1,10 +1,9 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
2
3
  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
4
  import type { SeedComponentTransformerDeps } from "../deps.interface";
5
+ import type { ExtendedFabProperties } from "../properties.type";
6
+ import { handleSizeProp } from "../size";
8
7
 
9
8
  export const createExtendedFabTransformer = (ctx: SeedComponentTransformerDeps) =>
10
9
  defineComponentTransformer<ExtendedFabProperties>(
@@ -1,6 +1,6 @@
1
1
  import { defineComponentTransformer } from "@/codegen/core";
2
- import * as metadata from "../../../data/__generated__/component-sets";
3
- import { createElement } from "../../../core/jsx";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import { createElement } from "@/codegen/core";
4
4
  import type { FabProperties } from "../properties.type";
5
5
  import type { SeedComponentTransformerDeps } from "../deps.interface";
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { defineComponentTransformer } from "@/codegen/core";
2
- import * as metadata from "../../../data/__generated__/component-sets";
3
- import { createElement } from "../../../core/jsx";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import { createElement } from "@/codegen/core";
4
4
  import type { HelpBubbleProperties } from "../properties.type";
5
5
  import type { SeedComponentTransformerDeps } from "../deps.interface";
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { defineComponentTransformer } from "@/codegen/core";
2
2
  import { camelCase } from "change-case";
3
- import * as metadata from "../../../data/__generated__/component-sets";
4
- import { createElement } from "../../../core/jsx";
3
+ import * as metadata from "@/entities/data/__generated__/component-sets";
4
+ import { createElement } from "@/codegen/core";
5
5
  import type { IdentityPlaceholderProperties } from "../properties.type";
6
6
  import type { SeedComponentTransformerDeps } from "../deps.interface";
7
7
 
@@ -1,11 +1,10 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import type { NormalizedInstanceNode, NormalizedTextNode } from "@/normalizer";
4
+ import { findOne } from "@/utils/figma-node";
2
5
  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
6
  import type { SeedComponentTransformerDeps } from "../deps.interface";
7
+ import type { InlineBannerProperties } from "../properties.type";
9
8
 
10
9
  export const createInlineBannerTransformer = (ctx: SeedComponentTransformerDeps) =>
11
10
  defineComponentTransformer<InlineBannerProperties>(metadata.inlineBanner.key, (node) => {
@@ -1,8 +1,7 @@
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";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
5
3
  import type { SeedComponentTransformerDeps } from "../deps.interface";
4
+ import type { MannerTempBadgeProperties } from "../properties.type";
6
5
 
7
6
  export const createMannerTempBadgeTransformer = (_ctx: SeedComponentTransformerDeps) =>
8
7
  defineComponentTransformer<MannerTempBadgeProperties>(
@@ -1,9 +1,8 @@
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";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
6
3
  import type { SeedComponentTransformerDeps } from "../deps.interface";
4
+ import type { MultilineTextFieldProperties } from "../properties.type";
5
+ import { handleSizeProp } from "../size";
7
6
 
8
7
  export const createMultilineTextFieldTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<MultilineTextFieldProperties>(
@@ -1,10 +1,9 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
2
3
  import { camelCase } from "change-case";
3
4
  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
5
  import type { SeedComponentTransformerDeps } from "../deps.interface";
6
+ import type { ProgressCircleProperties } from "../properties.type";
8
7
 
9
8
  export const createProgressCircleTransformer = (_ctx: SeedComponentTransformerDeps) =>
10
9
  defineComponentTransformer<ProgressCircleProperties>(
@@ -1,9 +1,8 @@
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";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
6
3
  import type { SeedComponentTransformerDeps } from "../deps.interface";
4
+ import type { ReactionButtonProperties } from "../properties.type";
5
+ import { handleSizeProp } from "../size";
7
6
 
8
7
  export const createReactionButtonTransformer = (ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<ReactionButtonProperties>(
@@ -1,12 +1,11 @@
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";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import { findAllInstances } from "@/utils/figma-node";
4
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
5
5
  import type {
6
6
  SegmentedControlItemProperties,
7
7
  SegmentedControlProperties,
8
8
  } from "../properties.type";
9
- import type { SeedComponentTransformerDeps } from "../deps.interface";
10
9
 
11
10
  const SEGMENTED_CONTROL_ITEM_KEY = "9a7ba0d4c041ddbce84ee48881788434fd6bccc8";
12
11
  const createSegmentedControlItemTransformer = (_ctx: SeedComponentTransformerDeps) =>
@@ -1,9 +1,8 @@
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";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import { findAllInstances } from "@/utils/figma-node";
6
4
  import type { SeedComponentTransformerDeps } from "../deps.interface";
5
+ import type { SelectBoxGroupProperties, SelectBoxProperties } from "../properties.type";
7
6
 
8
7
  export const createSelectBoxTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<SelectBoxProperties>(
@@ -1,9 +1,8 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
2
3
  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
4
  import type { SeedComponentTransformerDeps } from "../deps.interface";
5
+ import type { SkeletonProperties } from "../properties.type";
7
6
 
8
7
  export const createSkeletonTransformer = (ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<SkeletonProperties>(
@@ -1,9 +1,8 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
2
3
  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
4
  import type { SeedComponentTransformerDeps } from "../deps.interface";
5
+ import type { SnackbarProperties } from "../properties.type";
7
6
 
8
7
  export const createSnackbarTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<SnackbarProperties>(
@@ -1,9 +1,8 @@
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";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
6
3
  import type { SeedComponentTransformerDeps } from "../deps.interface";
4
+ import type { SwitchProperties } from "../properties.type";
5
+ import { handleSizeProp } from "../size";
7
6
 
8
7
  export const createSwitchTransformer = (_ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<SwitchProperties>(
@@ -1,15 +1,14 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import type { NormalizedInstanceNode } from "@/normalizer";
2
4
  import { camelCase } from "change-case";
3
- import * as metadata from "../../../data/__generated__/component-sets";
4
- import { createElement } from "../../../core/jsx";
5
- import type { NormalizedInstanceNode } from "../../../../normalizer";
6
- import { handleSizeProp } from "../size";
5
+ import type { SeedComponentTransformerDeps } from "../deps.interface";
7
6
  import type {
8
7
  TabsFillItemProperties,
9
8
  TabsHugItemProperties,
10
9
  TabsProperties,
11
10
  } from "../properties.type";
12
- import type { SeedComponentTransformerDeps } from "../deps.interface";
11
+ import { handleSizeProp } from "../size";
13
12
 
14
13
  const TABS_HUG_ITEM_KEY = "c242492543b327ceb84fa9933841512fc62a898c";
15
14
  const createTabsHugItemTransformer = (_ctx: SeedComponentTransformerDeps) =>
@@ -1,13 +1,12 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
3
+ import type { NormalizedInstanceNode } from "@/normalizer";
4
+ import { findOne } from "@/utils/figma-node";
2
5
  import { camelCase } from "change-case";
3
6
  import { match } from "ts-pattern";
4
- import * as metadata from "../../../data/__generated__/component-sets";
5
- import { createElement } from "../../../core/jsx";
6
- import { findOne } from "../../../../utils/figma-node";
7
- import type { NormalizedInstanceNode } from "../../../../normalizer";
8
- import { handleSizeProp } from "../size";
9
- import type { TextButtonProperties } from "../properties.type";
10
7
  import type { SeedComponentTransformerDeps } from "../deps.interface";
8
+ import type { TextButtonProperties } from "../properties.type";
9
+ import { handleSizeProp } from "../size";
11
10
 
12
11
  export const createTextButtonTransformer = (ctx: SeedComponentTransformerDeps) =>
13
12
  defineComponentTransformer<TextButtonProperties>(metadata.textButton.key, (node) => {
@@ -1,9 +1,8 @@
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 { TextFieldProperties } from "../properties.type";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
6
3
  import type { SeedComponentTransformerDeps } from "../deps.interface";
4
+ import type { TextFieldProperties } from "../properties.type";
5
+ import { handleSizeProp } from "../size";
7
6
 
8
7
  export const createTextFieldTransformer = (ctx: SeedComponentTransformerDeps) =>
9
8
  defineComponentTransformer<TextFieldProperties>(
@@ -1,10 +1,9 @@
1
- import { defineComponentTransformer } from "@/codegen/core";
1
+ import { createElement, defineComponentTransformer } from "@/codegen/core";
2
+ import * as metadata from "@/entities/data/__generated__/component-sets";
2
3
  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 { ToggleButtonProperties } from "../properties.type";
7
4
  import type { SeedComponentTransformerDeps } from "../deps.interface";
5
+ import type { ToggleButtonProperties } from "../properties.type";
6
+ import { handleSizeProp } from "../size";
8
7
 
9
8
  export const createToggleButtonTransformer = (ctx: SeedComponentTransformerDeps) =>
10
9
  defineComponentTransformer<ToggleButtonProperties>(
@@ -0,0 +1,170 @@
1
+ import { createCodegenTransformer, createValueTransformer } from "@/codegen/core";
2
+ import {
3
+ createIconService,
4
+ createStyleService,
5
+ createVariableService,
6
+ iconRepository,
7
+ styleRepository,
8
+ variableRepository,
9
+ } from "@/entities";
10
+ import { camelCasePreserveUnderscoreBetweenNumbers } from "@/utils/common";
11
+ import { toCssPixel, toCssRgba } from "@/utils/css";
12
+ import { camelCase } from "change-case";
13
+ import { createSeedComponentTransformers } from "./component";
14
+ import { createFrameTransformer } from "./frame";
15
+ import { createInstanceTransformer } from "./instance";
16
+ import {
17
+ createContainerLayoutPropsTransformer,
18
+ createFrameFillPropsTransformer,
19
+ createIconSelfLayoutPropsTransformer,
20
+ createRadiusPropsTransformer,
21
+ createSelfLayoutPropsTransformer,
22
+ createShapeFillPropsTransformer,
23
+ createStrokePropsTransformer,
24
+ createTextFillPropsTransformer,
25
+ createTypeStylePropsTransformer,
26
+ } from "./props";
27
+ import {
28
+ createBooleanOperationTransformer,
29
+ createRectangleTransformer,
30
+ createVectorTransformer,
31
+ } from "./shape";
32
+ import { createTextTransformer } from "./text";
33
+
34
+ const IGNORED_COMPONENT_KEYS = new Set<string>([
35
+ "1acdc7247c83a73a0504d6fad86d08783938cb1a",
36
+ "b38b719b61cdf1a24458d7a7888bee74b7649084",
37
+ ]);
38
+
39
+ export interface CreateContextOptions {
40
+ ignoredComponentKeys?: Set<string>;
41
+ shouldInferVariableName: boolean;
42
+ shouldInferAutoLayout: boolean;
43
+ }
44
+
45
+ const styleService = createStyleService({
46
+ styleRepository,
47
+ styleNameTransformer: ({ slug }) =>
48
+ camelCase(slug[slug.length - 1]!, { mergeAmbiguousCharacters: true }),
49
+ });
50
+ const variableService = createVariableService({
51
+ variableRepository,
52
+ variableNameTransformer: ({ slug }) =>
53
+ slug
54
+ .filter(
55
+ (s) =>
56
+ !(s === "dimension" || s === "font-size" || s === "font-weight" || s === "line-height"),
57
+ )
58
+ .map((s) => s.replaceAll(",", "_"))
59
+ .map(camelCasePreserveUnderscoreBetweenNumbers)
60
+ .join("."),
61
+ inferCompareFunction: (name1: string, name2: string) => {
62
+ const scoreFn = (name: string) => {
63
+ let score = 0;
64
+ if (name.includes("bg")) {
65
+ score += 100;
66
+ }
67
+ if (name.includes("fg")) {
68
+ score += 100;
69
+ }
70
+ if (name.includes("stroke")) {
71
+ score += 100;
72
+ }
73
+ if (name.includes("spacing-x")) {
74
+ score -= 100;
75
+ }
76
+ if (name.includes("spacing-y")) {
77
+ score -= 100;
78
+ }
79
+ if (name.endsWith("pressed")) {
80
+ score -= 100;
81
+ }
82
+ return score;
83
+ };
84
+
85
+ return scoreFn(name2) - scoreFn(name1);
86
+ },
87
+ });
88
+ const iconService = createIconService({
89
+ iconRepository,
90
+ });
91
+
92
+ // TODO: implement figma component service
93
+ const componentTransformers = createSeedComponentTransformers({
94
+ iconService,
95
+ variableService,
96
+ });
97
+
98
+ export function createContext(options: CreateContextOptions) {
99
+ const {
100
+ ignoredComponentKeys = IGNORED_COMPONENT_KEYS,
101
+ shouldInferVariableName,
102
+ shouldInferAutoLayout,
103
+ } = options;
104
+
105
+ const valueTransformer = createValueTransformer({
106
+ variableService,
107
+ formatters: {
108
+ color: (value: RGBA) => toCssRgba(value),
109
+ dimension: (value: number) => toCssPixel(value),
110
+ fontDimension: (value: number) => toCssPixel(value),
111
+ fontWeight: (value: number) => value,
112
+ },
113
+ shouldInferVariableName,
114
+ });
115
+
116
+ const containerLayoutPropsTransformer = createContainerLayoutPropsTransformer(valueTransformer);
117
+ const selfLayoutPropsTransformer = createSelfLayoutPropsTransformer(valueTransformer);
118
+ const iconSelfLayoutPropsTransformer = createIconSelfLayoutPropsTransformer(valueTransformer);
119
+ const frameFillPropsTransformer = createFrameFillPropsTransformer(valueTransformer);
120
+ const shapeFillPropsTransformer = createShapeFillPropsTransformer(valueTransformer);
121
+ const textFillPropsTransformer = createTextFillPropsTransformer(valueTransformer);
122
+ const radiusPropsTransformer = createRadiusPropsTransformer(valueTransformer);
123
+ const strokePropsTransformer = createStrokePropsTransformer(valueTransformer);
124
+ const typeStylePropsTransformer = createTypeStylePropsTransformer({
125
+ valueTransformer,
126
+ styleService,
127
+ });
128
+ const propsTransformers = {
129
+ containerLayout: containerLayoutPropsTransformer,
130
+ selfLayout: selfLayoutPropsTransformer,
131
+ iconSelfLayout: iconSelfLayoutPropsTransformer,
132
+ frameFill: frameFillPropsTransformer,
133
+ shapeFill: shapeFillPropsTransformer,
134
+ textFill: textFillPropsTransformer,
135
+ radius: radiusPropsTransformer,
136
+ stroke: strokePropsTransformer,
137
+ typeStyle: typeStylePropsTransformer,
138
+ };
139
+
140
+ const frameTransformer = createFrameTransformer({
141
+ propsTransformers,
142
+ });
143
+ const instanceTransformer = createInstanceTransformer({
144
+ iconService,
145
+ ignoredComponentKeys,
146
+ propsTransformers,
147
+ componentTransformers,
148
+ frameTransformer,
149
+ });
150
+ const textTransformer = createTextTransformer({
151
+ propsTransformers,
152
+ });
153
+ const rectangleTransformer = createRectangleTransformer({
154
+ propsTransformers,
155
+ });
156
+ const vectorTransformer = createVectorTransformer();
157
+ const booleanOperationTransformer = createBooleanOperationTransformer();
158
+
159
+ const codegenTransformer = createCodegenTransformer({
160
+ frameTransformer,
161
+ textTransformer,
162
+ rectangleTransformer,
163
+ instanceTransformer,
164
+ vectorTransformer,
165
+ booleanOperationTransformer,
166
+ shouldInferAutoLayout,
167
+ });
168
+
169
+ return codegenTransformer;
170
+ }
@@ -0,0 +1,75 @@
1
+ import type {
2
+ NormalizedComponentNode,
3
+ NormalizedFrameNode,
4
+ NormalizedInstanceNode,
5
+ } from "@/normalizer";
6
+ import {
7
+ cloneElement,
8
+ createElement,
9
+ defineElementTransformer,
10
+ type ElementTransformer,
11
+ } from "../../core";
12
+ import type { ContainerLayoutProps, PropsTransformers } from "./props";
13
+
14
+ export interface FrameTransformerDeps {
15
+ propsTransformers: PropsTransformers;
16
+ }
17
+
18
+ export function createFrameTransformer({
19
+ propsTransformers,
20
+ }: FrameTransformerDeps): ElementTransformer<
21
+ NormalizedFrameNode | NormalizedInstanceNode | NormalizedComponentNode
22
+ > {
23
+ function inferLayoutComponent(props: ContainerLayoutProps, isFlex: boolean) {
24
+ if (!isFlex) {
25
+ return "Box";
26
+ }
27
+
28
+ if (props.direction === "column") {
29
+ return "VStack";
30
+ }
31
+
32
+ return "HStack";
33
+ }
34
+
35
+ return defineElementTransformer(
36
+ (node: NormalizedFrameNode | NormalizedInstanceNode | NormalizedComponentNode, traverse) => {
37
+ const children = node.children;
38
+ const transformedChildren = children.map(traverse);
39
+ const isFlex = node.layoutMode === "HORIZONTAL" || node.layoutMode === "VERTICAL";
40
+
41
+ const props = {
42
+ ...propsTransformers.radius(node, traverse),
43
+ ...(isFlex ? propsTransformers.containerLayout(node, traverse) : {}),
44
+ ...propsTransformers.selfLayout(node, traverse),
45
+ ...propsTransformers.frameFill(node, traverse),
46
+ ...propsTransformers.stroke(node, traverse),
47
+ };
48
+
49
+ const isStretch = props.align === undefined || props.align === "stretch";
50
+ const processedChildren = isStretch
51
+ ? transformedChildren.map((child) =>
52
+ child ? cloneElement(child, { alignSelf: undefined }) : child,
53
+ )
54
+ : transformedChildren;
55
+
56
+ const layoutComponent = inferLayoutComponent(props, isFlex);
57
+
58
+ if (layoutComponent === "VStack") {
59
+ const { direction, ...rest } = props;
60
+
61
+ return createElement("VStack", rest, processedChildren);
62
+ }
63
+
64
+ if (layoutComponent === "HStack") {
65
+ const { direction, ...rest } = props;
66
+
67
+ return createElement("HStack", rest, processedChildren);
68
+ }
69
+
70
+ if (layoutComponent === "Box") {
71
+ return createElement("Box", props, processedChildren);
72
+ }
73
+ },
74
+ );
75
+ }
@@ -0,0 +1,7 @@
1
+ export * from "./props";
2
+ export * from "./shape";
3
+ export * from "./frame";
4
+ export * from "./instance";
5
+ export * from "./text";
6
+ export * from "./component";
7
+ export * from "./context";
@@ -1,40 +1,29 @@
1
+ import type { IconService } from "@/entities";
1
2
  import type { NormalizedFrameTrait, NormalizedInstanceNode } from "@/normalizer";
2
3
  import {
3
4
  createElement,
4
5
  defineElementTransformer,
5
6
  definePropsTransformer,
7
+ type ComponentTransformer,
6
8
  type ElementTransformer,
7
- } from "../core";
8
- import type { FigmaComponentService } from "./figma-component.service";
9
- import type { FrameService } from "./frame.service";
10
- import type { IconService } from "./icon.service";
11
- import type { FillPropsService, ShapeFillProps } from "./props/fill-props.service";
12
- import type {
13
- SeedSelfLayoutProps,
14
- SelfLayoutPropsService,
15
- } from "./props/self-layout-props.service";
9
+ } from "../../core";
10
+ import type { PropsTransformers } from "./props";
16
11
 
17
- export interface InstanceService {
18
- transform: ElementTransformer<NormalizedInstanceNode>;
19
- }
20
-
21
- export interface SeedInstanceServiceDeps {
22
- figmaComponentService: FigmaComponentService;
23
- fillPropsService: FillPropsService<ShapeFillProps>;
24
- selfLayoutPropsService: SelfLayoutPropsService<SeedSelfLayoutProps>;
12
+ export interface InstanceTransformerDeps {
25
13
  iconService?: IconService;
26
- frameService?: FrameService;
27
14
  ignoredComponentKeys?: Set<string>;
15
+ propsTransformers: PropsTransformers;
16
+ componentTransformers: Record<string, ComponentTransformer>;
17
+ frameTransformer: ElementTransformer<NormalizedInstanceNode>;
28
18
  }
29
19
 
30
- export function createSeedInstanceService({
31
- figmaComponentService,
32
- fillPropsService,
33
- selfLayoutPropsService,
20
+ export function createInstanceTransformer({
34
21
  iconService,
35
- frameService,
36
22
  ignoredComponentKeys,
37
- }: SeedInstanceServiceDeps): InstanceService {
23
+ propsTransformers,
24
+ componentTransformers,
25
+ frameTransformer,
26
+ }: InstanceTransformerDeps): ElementTransformer<NormalizedInstanceNode> {
38
27
  const transformIconColorProps = definePropsTransformer((node: NormalizedFrameTrait, traverse) => {
39
28
  if (node.children.length === 0) {
40
29
  throw new Error("Node has no children");
@@ -44,7 +33,7 @@ export function createSeedInstanceService({
44
33
  (child) => child.type === "VECTOR" || child.type === "BOOLEAN_OPERATION",
45
34
  );
46
35
 
47
- const colorProps = vectors.map((vector) => fillPropsService.transform(vector, traverse));
36
+ const colorProps = vectors.map((vector) => propsTransformers.shapeFill(vector, traverse));
48
37
 
49
38
  const fills = new Set(
50
39
  colorProps.map((props) => props.color).filter((color) => color !== undefined),
@@ -68,24 +57,22 @@ export function createSeedInstanceService({
68
57
  if (iconService?.isIconComponent(componentKey)) {
69
58
  const tagName = iconService.createIconTagName(componentKey);
70
59
  const props = {
71
- ...selfLayoutPropsService.transform(node, traverse),
60
+ ...propsTransformers.iconSelfLayout(node, traverse),
72
61
  ...transformIconColorProps(node, traverse),
73
62
  };
74
- return createElement(tagName, props);
63
+ return createElement("Icon", { svg: createElement(tagName), ...props });
75
64
  }
76
65
 
77
66
  const componentTransformer = componentSetKey
78
- ? figmaComponentService.getTransformer(componentSetKey)
79
- : figmaComponentService.getTransformer(componentKey);
67
+ ? componentTransformers[componentSetKey]
68
+ : componentTransformers[componentKey];
80
69
 
81
70
  if (componentTransformer) {
82
71
  return componentTransformer.transform(node);
83
72
  }
84
73
 
85
- return frameService?.transform(node, traverse);
74
+ return frameTransformer(node, traverse);
86
75
  });
87
76
 
88
- return {
89
- transform,
90
- };
77
+ return transform;
91
78
  }