@seed-design/figma 0.0.4 → 0.0.6
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.
- package/lib/index.cjs +10589 -12261
- package/lib/index.d.ts +1732 -41
- package/lib/index.js +10565 -12262
- package/package.json +2 -2
- package/src/codegen/context.ts +148 -0
- package/src/{component/type-helper.ts → codegen/core/component.ts} +1 -12
- package/src/codegen/core/index.ts +14 -0
- package/src/{jsx.ts → codegen/core/jsx.ts} +13 -3
- package/src/codegen/core/transformer.ts +40 -0
- package/src/{data → codegen/data}/icons.ts +2 -6
- package/src/{data → codegen/data}/styles.ts +87 -29
- package/src/codegen/data/variable-collections.ts +310 -0
- package/src/{data → codegen/data}/variables.ts +2821 -5887
- package/src/codegen/domain/codegen.service.ts +69 -0
- package/src/codegen/domain/figma-component.service.ts +21 -0
- package/src/codegen/domain/frame.service.ts +108 -0
- package/src/codegen/domain/icon.interface.ts +5 -0
- package/src/codegen/domain/icon.repository.ts +11 -0
- package/src/codegen/domain/icon.service.ts +35 -0
- package/src/codegen/domain/index.ts +22 -0
- package/src/codegen/domain/instance.service.ts +91 -0
- package/src/codegen/domain/props/container-layout-props.service.ts +248 -0
- package/src/codegen/domain/props/fill-props.service.ts +75 -0
- package/src/codegen/domain/props/radius-props.service.ts +105 -0
- package/src/codegen/domain/props/self-layout-props.service.ts +127 -0
- package/src/codegen/domain/props/stroke-props.service.ts +45 -0
- package/src/codegen/domain/props/type-style-props.service.ts +31 -0
- package/src/codegen/domain/rectangle.service.ts +31 -0
- package/src/codegen/domain/seed-component/deps.interface.ts +6 -0
- package/src/codegen/domain/seed-component/index.ts +75 -0
- package/src/{component/type.ts → codegen/domain/seed-component/properties.type.ts} +2 -2
- package/src/{component/properties.ts → codegen/domain/seed-component/size.ts} +4 -2
- package/src/codegen/domain/seed-component/transformers/action-button.ts +69 -0
- package/src/codegen/domain/seed-component/transformers/action-chip.ts +82 -0
- package/src/codegen/domain/seed-component/transformers/action-sheet.ts +78 -0
- package/src/{component/handlers → codegen/domain/seed-component/transformers}/app-bar.ts +114 -111
- package/src/codegen/domain/seed-component/transformers/avatar-stack.ts +30 -0
- package/src/codegen/domain/seed-component/transformers/avatar.ts +39 -0
- package/src/codegen/domain/seed-component/transformers/badge.ts +22 -0
- package/src/codegen/domain/seed-component/transformers/callout.ts +90 -0
- package/src/codegen/domain/seed-component/transformers/checkbox.ts +34 -0
- package/src/codegen/domain/seed-component/transformers/chip-tabs.ts +55 -0
- package/src/codegen/domain/seed-component/transformers/control-chip.ts +86 -0
- package/src/codegen/domain/seed-component/transformers/error-state.ts +39 -0
- package/src/codegen/domain/seed-component/transformers/extended-action-sheet.ts +99 -0
- package/src/codegen/domain/seed-component/transformers/extended-fab.ts +25 -0
- package/src/codegen/domain/seed-component/transformers/fab.ts +18 -0
- package/src/codegen/domain/seed-component/transformers/help-bubble.ts +68 -0
- package/src/codegen/domain/seed-component/transformers/identity-placeholder.ts +18 -0
- package/src/{component/handlers → codegen/domain/seed-component/transformers}/inline-banner.ts +11 -13
- package/src/codegen/domain/seed-component/transformers/manner-temp-badge.ts +19 -0
- package/src/codegen/domain/seed-component/transformers/multiline-text-field.ts +82 -0
- package/src/codegen/domain/seed-component/transformers/progress-circle.ts +51 -0
- package/src/codegen/domain/seed-component/transformers/reaction-button.ts +37 -0
- package/src/codegen/domain/seed-component/transformers/segmented-control.ts +59 -0
- package/src/codegen/domain/seed-component/transformers/select-box.ts +82 -0
- package/src/codegen/domain/seed-component/transformers/skeleton.ts +52 -0
- package/src/codegen/domain/seed-component/transformers/snackbar.ts +23 -0
- package/src/codegen/domain/seed-component/transformers/switch.ts +31 -0
- package/src/codegen/domain/seed-component/transformers/tabs.ts +129 -0
- package/src/{component/handlers → codegen/domain/seed-component/transformers}/text-button.ts +16 -18
- package/src/codegen/domain/seed-component/transformers/text-field.ts +109 -0
- package/src/codegen/domain/seed-component/transformers/toggle-button.ts +47 -0
- package/src/codegen/domain/style.interface.ts +5 -0
- package/src/codegen/domain/style.repository.ts +23 -0
- package/src/codegen/domain/style.service.ts +38 -0
- package/src/codegen/domain/text.service.ts +62 -0
- package/src/codegen/domain/variable.interface.ts +18 -0
- package/src/codegen/domain/variable.repository.ts +44 -0
- package/src/codegen/domain/variable.service.ts +95 -0
- package/src/codegen/index.ts +13 -0
- package/src/index.ts +2 -2
- package/src/normalizer/from-plugin.ts +29 -28
- package/src/normalizer/from-rest.ts +5 -1
- package/src/normalizer/types.ts +80 -32
- package/src/utils/common.ts +19 -0
- package/src/utils/css.ts +13 -0
- package/src/utils/figma-variable.ts +13 -0
- package/src/component/handlers/action-button.ts +0 -66
- package/src/component/handlers/action-chip.ts +0 -71
- package/src/component/handlers/action-sheet.ts +0 -74
- package/src/component/handlers/avatar-stack.ts +0 -35
- package/src/component/handlers/avatar.ts +0 -37
- package/src/component/handlers/badge.ts +0 -20
- package/src/component/handlers/callout.ts +0 -87
- package/src/component/handlers/checkbox.ts +0 -32
- package/src/component/handlers/chip-tabs.ts +0 -51
- package/src/component/handlers/control-chip.ts +0 -75
- package/src/component/handlers/error-state.ts +0 -37
- package/src/component/handlers/extended-action-sheet.ts +0 -86
- package/src/component/handlers/extended-fab.ts +0 -24
- package/src/component/handlers/fab.ts +0 -17
- package/src/component/handlers/help-bubble.ts +0 -66
- package/src/component/handlers/identity-placeholder.ts +0 -16
- package/src/component/handlers/manner-temp-badge.ts +0 -17
- package/src/component/handlers/multiline-text-field.ts +0 -80
- package/src/component/handlers/progress-circle.ts +0 -49
- package/src/component/handlers/reaction-button.ts +0 -36
- package/src/component/handlers/segmented-control.ts +0 -51
- package/src/component/handlers/select-box.ts +0 -76
- package/src/component/handlers/skeleton.ts +0 -51
- package/src/component/handlers/snackbar.ts +0 -21
- package/src/component/handlers/switch.ts +0 -29
- package/src/component/handlers/tabs.ts +0 -107
- package/src/component/handlers/text-field.ts +0 -108
- package/src/component/handlers/toggle-button.ts +0 -44
- package/src/component/index.ts +0 -76
- package/src/generate-code.ts +0 -251
- package/src/icon.ts +0 -46
- package/src/layout.ts +0 -31
- package/src/props/color.ts +0 -78
- package/src/props/layout.ts +0 -292
- package/src/props/sizing.ts +0 -58
- package/src/props/text.ts +0 -21
- package/src/props/variable.ts +0 -66
- /package/src/{data → codegen/data}/__generated__/component-sets/action-button.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/action-button.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/action-chip.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/action-sheet.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/avatar-stack.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/avatar.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/avatar.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/badge.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/badge.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-global.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/bottom-navigation-kr.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/bottom-sheet.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/callout.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/callout.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/checkbox.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/chip-tablist.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/control-chip.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/divider.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/divider.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/error-state.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/error-state.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/extended-action-sheet.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/extended-floating-action-button.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/floating-action-button.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/help-bubble.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/identity-placeholder.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/index.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/index.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/inline-banner.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-global.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/main-tab-navigation-kr.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-badge.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp-bar.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/manner-temp.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/multiline-text-field.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/progress-circle.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/radio.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/radio.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/range-slider.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/reaction-button.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/segmented-control.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/select-box.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/select-box.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/skeleton.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/slider.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/slider.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/snackbar.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/standard-navigation.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/switch.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/switch.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/tablist.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/tablist.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-bottom-fixed-bar.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-button-group.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-chip-group.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-select-box-group.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/template-top-navigation.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/text-button.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/text-button.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/text-field.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/text-field.mjs +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.d.ts +0 -0
- /package/src/{data → codegen/data}/__generated__/component-sets/toggle-button.mjs +0 -0
package/src/component/index.ts
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { actionButtonHandler } from "./handlers/action-button";
|
|
2
|
-
import { actionChipHandler } from "./handlers/action-chip";
|
|
3
|
-
import { actionSheetHandler } from "./handlers/action-sheet";
|
|
4
|
-
import { appBarHandler } from "./handlers/app-bar";
|
|
5
|
-
import { avatarHandler } from "./handlers/avatar";
|
|
6
|
-
import { avatarStackHandler } from "./handlers/avatar-stack";
|
|
7
|
-
import { badgeHandler } from "./handlers/badge";
|
|
8
|
-
import { calloutHandler } from "./handlers/callout";
|
|
9
|
-
import { checkboxHandler } from "./handlers/checkbox";
|
|
10
|
-
import { chipTabsHandler } from "./handlers/chip-tabs";
|
|
11
|
-
import { controlChipHandler } from "./handlers/control-chip";
|
|
12
|
-
import { errorStateHandler } from "./handlers/error-state";
|
|
13
|
-
import { extendedActionSheetHandler } from "./handlers/extended-action-sheet";
|
|
14
|
-
import { extendedFabHandler } from "./handlers/extended-fab";
|
|
15
|
-
import { fabHandler } from "./handlers/fab";
|
|
16
|
-
import { helpBubbleHandler } from "./handlers/help-bubble";
|
|
17
|
-
import { identityPlaceholderHandler } from "./handlers/identity-placeholder";
|
|
18
|
-
import { inlineBannerHandler } from "./handlers/inline-banner";
|
|
19
|
-
import { mannerTempBadgeHandler } from "./handlers/manner-temp-badge";
|
|
20
|
-
import { multilineTextFieldHandler } from "./handlers/multiline-text-field";
|
|
21
|
-
import { progressCircleHandler } from "./handlers/progress-circle";
|
|
22
|
-
import { reactionButtonHandler } from "./handlers/reaction-button";
|
|
23
|
-
import { segmentedControlHandler } from "./handlers/segmented-control";
|
|
24
|
-
import { selectBoxGroupHandler, selectBoxHandler } from "./handlers/select-box";
|
|
25
|
-
import { skeletonHandler } from "./handlers/skeleton";
|
|
26
|
-
import { snackbarHandler } from "./handlers/snackbar";
|
|
27
|
-
import { switchHandler } from "./handlers/switch";
|
|
28
|
-
import { tabsHandler } from "./handlers/tabs";
|
|
29
|
-
import { textButtonHandler } from "./handlers/text-button";
|
|
30
|
-
import { textFieldHandler } from "./handlers/text-field";
|
|
31
|
-
import { toggleButtonHandler } from "./handlers/toggle-button";
|
|
32
|
-
import type { ComponentHandler } from "./type-helper";
|
|
33
|
-
|
|
34
|
-
const componentHandlers = [
|
|
35
|
-
actionButtonHandler,
|
|
36
|
-
actionChipHandler,
|
|
37
|
-
actionSheetHandler,
|
|
38
|
-
appBarHandler,
|
|
39
|
-
avatarHandler,
|
|
40
|
-
avatarStackHandler,
|
|
41
|
-
badgeHandler,
|
|
42
|
-
calloutHandler,
|
|
43
|
-
checkboxHandler,
|
|
44
|
-
chipTabsHandler,
|
|
45
|
-
controlChipHandler,
|
|
46
|
-
errorStateHandler,
|
|
47
|
-
extendedActionSheetHandler,
|
|
48
|
-
extendedFabHandler,
|
|
49
|
-
fabHandler,
|
|
50
|
-
helpBubbleHandler,
|
|
51
|
-
identityPlaceholderHandler,
|
|
52
|
-
inlineBannerHandler,
|
|
53
|
-
mannerTempBadgeHandler,
|
|
54
|
-
multilineTextFieldHandler,
|
|
55
|
-
progressCircleHandler,
|
|
56
|
-
reactionButtonHandler,
|
|
57
|
-
segmentedControlHandler,
|
|
58
|
-
selectBoxGroupHandler,
|
|
59
|
-
selectBoxHandler,
|
|
60
|
-
skeletonHandler,
|
|
61
|
-
snackbarHandler,
|
|
62
|
-
switchHandler,
|
|
63
|
-
tabsHandler,
|
|
64
|
-
textButtonHandler,
|
|
65
|
-
textFieldHandler,
|
|
66
|
-
toggleButtonHandler,
|
|
67
|
-
] as ComponentHandler[];
|
|
68
|
-
|
|
69
|
-
export const componentHandlerMap = new Map(
|
|
70
|
-
componentHandlers.map((component) => [component.key, component]),
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
export const ignoredComponentKeys = new Set<string>([
|
|
74
|
-
"1acdc7247c83a73a0504d6fad86d08783938cb1a",
|
|
75
|
-
"b38b719b61cdf1a24458d7a7888bee74b7649084",
|
|
76
|
-
]);
|
package/src/generate-code.ts
DELETED
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { camelCase } from "change-case";
|
|
2
|
-
import { componentHandlerMap, ignoredComponentKeys } from "./component";
|
|
3
|
-
import { iconRecord } from "./data/icons";
|
|
4
|
-
import { FIGMA_TEXT_STYLES } from "./data/styles";
|
|
5
|
-
import { createIconTagNameFromKey, createMonochromeIconColorProps, isIconComponent } from "./icon";
|
|
6
|
-
import type { ElementNode } from "./jsx";
|
|
7
|
-
import { createElement, stringifyElement } from "./jsx";
|
|
8
|
-
import { inferLayoutComponent } from "./layout";
|
|
9
|
-
import type {
|
|
10
|
-
NormalizedComponentNode,
|
|
11
|
-
NormalizedFrameNode,
|
|
12
|
-
NormalizedInstanceNode,
|
|
13
|
-
NormalizedRectangleNode,
|
|
14
|
-
NormalizedSceneNode,
|
|
15
|
-
NormalizedTextNode,
|
|
16
|
-
} from "./normalizer";
|
|
17
|
-
import { createBackgroundProps, createBorderProps } from "./props/color";
|
|
18
|
-
import { createLayoutProps } from "./props/layout";
|
|
19
|
-
import { createSizingProps } from "./props/sizing";
|
|
20
|
-
import { createTextProps } from "./props/text";
|
|
21
|
-
import { getColorVariableName, getLayoutVariableName, inferDimension } from "./props/variable";
|
|
22
|
-
import { compactObject } from "./utils/common";
|
|
23
|
-
|
|
24
|
-
type PromiseLikeMaybe<T> = Promise<T | undefined> | T | undefined;
|
|
25
|
-
|
|
26
|
-
export type FigmaNodeHandler = (node: NormalizedSceneNode) => PromiseLikeMaybe<ElementNode>;
|
|
27
|
-
|
|
28
|
-
type FigmaNodeHandlerFactory<T extends NormalizedSceneNode> = (
|
|
29
|
-
traverse: FigmaNodeHandler,
|
|
30
|
-
) => (node: T) => PromiseLikeMaybe<ElementNode>;
|
|
31
|
-
|
|
32
|
-
export type FrameNodeHandlerFactory = FigmaNodeHandlerFactory<
|
|
33
|
-
NormalizedFrameNode | NormalizedComponentNode | NormalizedInstanceNode
|
|
34
|
-
>;
|
|
35
|
-
|
|
36
|
-
export type TextNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedTextNode>;
|
|
37
|
-
|
|
38
|
-
export type RectangleNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedRectangleNode>;
|
|
39
|
-
|
|
40
|
-
export type ComponentNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedComponentNode>;
|
|
41
|
-
|
|
42
|
-
export type InstanceNodeHandlerFactory = FigmaNodeHandlerFactory<NormalizedInstanceNode>;
|
|
43
|
-
|
|
44
|
-
const defaultFrameHandler: FrameNodeHandlerFactory = (traverse) => async (node) => {
|
|
45
|
-
const children = node.children;
|
|
46
|
-
|
|
47
|
-
const props = {
|
|
48
|
-
...createLayoutProps(node),
|
|
49
|
-
...createSizingProps(node),
|
|
50
|
-
...createBackgroundProps(node),
|
|
51
|
-
...createBorderProps(node),
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const layoutComponent = inferLayoutComponent(props);
|
|
55
|
-
|
|
56
|
-
if (layoutComponent === "Stack") {
|
|
57
|
-
const { flexDirection, ...rest } = props;
|
|
58
|
-
|
|
59
|
-
return createElement("Stack", rest, await Promise.all(children.map(traverse)));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (layoutComponent === "Inline") {
|
|
63
|
-
const { flexDirection, flexWrap, alignItems, justifyContent, ...rest } = props;
|
|
64
|
-
|
|
65
|
-
return createElement("Inline", rest, await Promise.all(children.map(traverse)));
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (layoutComponent === "Columns") {
|
|
69
|
-
const { flexDirection, flexWrap, justifyContent, ...rest } = props;
|
|
70
|
-
|
|
71
|
-
const childrenResult = await Promise.all(children.map(traverse));
|
|
72
|
-
|
|
73
|
-
return createElement(
|
|
74
|
-
"Columns",
|
|
75
|
-
rest,
|
|
76
|
-
childrenResult.map((child) => createElement("Column", {}, child)),
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return createElement("Flex", props, await Promise.all(children.map(traverse)));
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const defaultTextNodeHandler: TextNodeHandlerFactory = () => (node) => {
|
|
84
|
-
const maxLines =
|
|
85
|
-
node.style.textTruncation === "ENDING" ? (node.style.maxLines ?? undefined) : undefined;
|
|
86
|
-
|
|
87
|
-
if (node.fills.length > 1) {
|
|
88
|
-
throw new Error("Expected a single fill");
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const onlyFill = node.fills.length === 1 ? node.fills[0] : null;
|
|
92
|
-
const fillBoundVariableId =
|
|
93
|
-
onlyFill && onlyFill.type === "SOLID" ? (onlyFill.boundVariables?.color?.id ?? null) : null;
|
|
94
|
-
const color = fillBoundVariableId ? getColorVariableName(fillBoundVariableId) : undefined;
|
|
95
|
-
|
|
96
|
-
const style = FIGMA_TEXT_STYLES.find((s) => s.key === node.textStyleKey);
|
|
97
|
-
|
|
98
|
-
if (style) {
|
|
99
|
-
const styleNameSlugs = style.name.split("/");
|
|
100
|
-
const styleName = styleNameSlugs[styleNameSlugs.length - 1]!;
|
|
101
|
-
return createElement(
|
|
102
|
-
"Text",
|
|
103
|
-
compactObject({
|
|
104
|
-
textStyle: camelCase(styleName, { mergeAmbiguousCharacters: true }),
|
|
105
|
-
maxLines,
|
|
106
|
-
color,
|
|
107
|
-
}),
|
|
108
|
-
node.characters.replace(/\n/g, "<br />"),
|
|
109
|
-
color ? "" : "color 프로퍼티는 반영되지 않았습니다.",
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const { fontSize, fontWeight, lineHeight } = createTextProps(node.boundVariables);
|
|
114
|
-
|
|
115
|
-
return createElement(
|
|
116
|
-
"Text",
|
|
117
|
-
compactObject({
|
|
118
|
-
fontSize,
|
|
119
|
-
fontWeight,
|
|
120
|
-
lineHeight,
|
|
121
|
-
color,
|
|
122
|
-
}),
|
|
123
|
-
node.characters.replace(/\n/g, "<br />"),
|
|
124
|
-
);
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
const defaultRectangleNodeHandler: RectangleNodeHandlerFactory = () => (node) => {
|
|
128
|
-
return createElement(
|
|
129
|
-
"Box",
|
|
130
|
-
{ ...createSizingProps(node), background: "palette.gray200" },
|
|
131
|
-
undefined,
|
|
132
|
-
"Rectangle Node Placeholder",
|
|
133
|
-
);
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const defaultComponentNodeHandler: ComponentNodeHandlerFactory = (traverse) => async (node) => {
|
|
137
|
-
return defaultFrameHandler(traverse)(node);
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
const defaultInstanceNodeHandler: InstanceNodeHandlerFactory = (traverse) => async (node) => {
|
|
141
|
-
const { componentKey, componentSetKey } = node;
|
|
142
|
-
|
|
143
|
-
if (isIconComponent(componentKey)) {
|
|
144
|
-
const iconElement = createElement(createIconTagNameFromKey(componentKey));
|
|
145
|
-
|
|
146
|
-
switch (iconRecord[componentKey]?.type) {
|
|
147
|
-
case "monochrome":
|
|
148
|
-
return createElement("Icon", {
|
|
149
|
-
size:
|
|
150
|
-
getLayoutVariableName(node.boundVariables?.size?.x?.id) ??
|
|
151
|
-
inferDimension(node.absoluteBoundingBox?.width ?? 0),
|
|
152
|
-
...createMonochromeIconColorProps(node),
|
|
153
|
-
svg: iconElement,
|
|
154
|
-
});
|
|
155
|
-
case "multicolor":
|
|
156
|
-
return iconElement;
|
|
157
|
-
default:
|
|
158
|
-
return createElement("Icon", {
|
|
159
|
-
size:
|
|
160
|
-
getLayoutVariableName(node.boundVariables?.size?.x?.id) ??
|
|
161
|
-
inferDimension(node.absoluteBoundingBox?.width ?? 0),
|
|
162
|
-
svg: iconElement,
|
|
163
|
-
...createMonochromeIconColorProps(node),
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (ignoredComponentKeys.has(componentSetKey ?? componentKey)) {
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const componentData = componentSetKey
|
|
173
|
-
? componentHandlerMap.get(componentSetKey)
|
|
174
|
-
: componentHandlerMap.get(componentKey);
|
|
175
|
-
|
|
176
|
-
if (componentData) {
|
|
177
|
-
return componentData.codegen(node);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// if (node.id === selection.id) {
|
|
181
|
-
return await defaultFrameHandler(traverse)(node);
|
|
182
|
-
// }
|
|
183
|
-
|
|
184
|
-
// const mainComponent = node.mainComponent;
|
|
185
|
-
|
|
186
|
-
// return createElement(
|
|
187
|
-
// mainComponent.parent?.type === "COMPONENT_SET"
|
|
188
|
-
// ? mainComponent.parent.name
|
|
189
|
-
// : mainComponent.name,
|
|
190
|
-
// Object.fromEntries(
|
|
191
|
-
// Object.entries(node.componentProperties)
|
|
192
|
-
// .filter(([_, props]) => props.type === "VARIANT" || props.type === "TEXT")
|
|
193
|
-
// .map(([key, props]) => [camelCase(key), camelCase(props.value as string)]),
|
|
194
|
-
// ),
|
|
195
|
-
// undefined,
|
|
196
|
-
// "Custom Component",
|
|
197
|
-
// );
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
export async function generateCode(
|
|
201
|
-
selection: NormalizedSceneNode,
|
|
202
|
-
options?: {
|
|
203
|
-
handlers?: {
|
|
204
|
-
frame?: FrameNodeHandlerFactory;
|
|
205
|
-
text?: TextNodeHandlerFactory;
|
|
206
|
-
rectangle?: RectangleNodeHandlerFactory;
|
|
207
|
-
component?: ComponentNodeHandlerFactory;
|
|
208
|
-
instance?: InstanceNodeHandlerFactory;
|
|
209
|
-
};
|
|
210
|
-
},
|
|
211
|
-
) {
|
|
212
|
-
const handlers = {
|
|
213
|
-
frame: defaultFrameHandler,
|
|
214
|
-
text: defaultTextNodeHandler,
|
|
215
|
-
rectangle: defaultRectangleNodeHandler,
|
|
216
|
-
component: defaultComponentNodeHandler,
|
|
217
|
-
instance: defaultInstanceNodeHandler,
|
|
218
|
-
...options?.handlers,
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
const handleFrameNode = handlers.frame(traverse);
|
|
222
|
-
const handleTextNode = handlers.text(traverse);
|
|
223
|
-
const handleRectangleNode = handlers.rectangle(traverse);
|
|
224
|
-
const handleComponentNode = handlers.component(traverse);
|
|
225
|
-
const handleInstanceNode = handlers.instance(traverse);
|
|
226
|
-
|
|
227
|
-
async function traverse(node: NormalizedSceneNode): Promise<ElementNode | undefined> {
|
|
228
|
-
if ("visible" in node && !node.visible) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (node.type === "FRAME") return await handleFrameNode(node);
|
|
233
|
-
if (node.type === "TEXT") return handleTextNode(node);
|
|
234
|
-
if (node.type === "RECTANGLE") return await handleRectangleNode(node);
|
|
235
|
-
if (node.type === "COMPONENT") return await handleComponentNode(node);
|
|
236
|
-
if (node.type === "INSTANCE") return await handleInstanceNode(node);
|
|
237
|
-
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
const rootEl = await traverse(selection);
|
|
243
|
-
if (!rootEl) {
|
|
244
|
-
return "";
|
|
245
|
-
}
|
|
246
|
-
return stringifyElement(rootEl);
|
|
247
|
-
} catch (e) {
|
|
248
|
-
console.error(e);
|
|
249
|
-
return "";
|
|
250
|
-
}
|
|
251
|
-
}
|
package/src/icon.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { pascalCase } from "change-case";
|
|
2
|
-
|
|
3
|
-
import { createColorProps } from "./props/color";
|
|
4
|
-
import { iconRecord } from "./data/icons";
|
|
5
|
-
import type { NormalizedInstanceNode } from "./normalizer";
|
|
6
|
-
|
|
7
|
-
export function isIconComponent(componentKey: string) {
|
|
8
|
-
return !!iconRecord[componentKey];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function createIconTagNameFromKey(key?: string) {
|
|
12
|
-
if (!key) {
|
|
13
|
-
return "UnknownIcon";
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const iconData = iconRecord[key];
|
|
17
|
-
if (!iconData) {
|
|
18
|
-
throw new Error(`Icon not found: ${key}`);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const { name, weight } = iconData;
|
|
22
|
-
|
|
23
|
-
return pascalCase(`${name}${weight ? weight : ""}`);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function createMonochromeIconColorProps(node: NormalizedInstanceNode) {
|
|
27
|
-
if (node.children.length === 0) {
|
|
28
|
-
throw new Error("Icon node has no children");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const icons = node.children.filter(
|
|
32
|
-
(child) => child.type === "VECTOR" || child.type === "BOOLEAN_OPERATION",
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
const colorProps = icons.map(createColorProps);
|
|
36
|
-
|
|
37
|
-
const fills = new Set(
|
|
38
|
-
colorProps.map((props) => props.color).filter((color) => color !== undefined),
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
if (fills.size > 1) {
|
|
42
|
-
throw new Error(`Children of the icon node ${node.name} has multiple colors`);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return { color: fills.values().next().value };
|
|
46
|
-
}
|
package/src/layout.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface LayoutComponentProps {
|
|
2
|
-
flexDirection: string | number | boolean;
|
|
3
|
-
alignItems: string | number | boolean;
|
|
4
|
-
justifyContent: string | number | boolean;
|
|
5
|
-
flexWrap: string | number | boolean;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function inferLayoutComponent(props: LayoutComponentProps) {
|
|
9
|
-
if (
|
|
10
|
-
props.flexDirection === "row" &&
|
|
11
|
-
props.alignItems === "flexStart" &&
|
|
12
|
-
props.justifyContent === "flexStart" &&
|
|
13
|
-
props.flexWrap === "wrap"
|
|
14
|
-
) {
|
|
15
|
-
return "Inline";
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (
|
|
19
|
-
props.flexDirection === "row" &&
|
|
20
|
-
props.justifyContent === "flexStart" &&
|
|
21
|
-
props.flexWrap === "nowrap"
|
|
22
|
-
) {
|
|
23
|
-
return "Columns";
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (props.flexDirection === "column") {
|
|
27
|
-
return "Stack";
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return "Flex";
|
|
31
|
-
}
|
package/src/props/color.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import type { NormalizedFrameNode, NormalizedTextNode } from "../normalizer";
|
|
2
|
-
import { getColorVariableName } from "./variable";
|
|
3
|
-
|
|
4
|
-
export function createBackgroundProps(
|
|
5
|
-
node: Pick<NormalizedFrameNode, "fills" | "boundVariables">,
|
|
6
|
-
): Partial<Record<"background", string | undefined>> {
|
|
7
|
-
const fills = node.fills;
|
|
8
|
-
if (fills.length === 0) {
|
|
9
|
-
return {};
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const fill = fills[0];
|
|
13
|
-
if (!fill || ("visible" in fill && !fill.visible) || fill.type !== "SOLID") {
|
|
14
|
-
return {};
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (node.boundVariables?.fills?.length === 1) {
|
|
18
|
-
return {
|
|
19
|
-
background: getColorVariableName(node.boundVariables.fills[0]!.id),
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const color = fill.color;
|
|
24
|
-
return {
|
|
25
|
-
background: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${fill.opacity})`,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function createColorProps(
|
|
30
|
-
node: Pick<NormalizedTextNode, "fills" | "boundVariables">,
|
|
31
|
-
): Partial<Record<"color", string | undefined>> {
|
|
32
|
-
const fills = node.fills;
|
|
33
|
-
if (fills.length === 0) {
|
|
34
|
-
return {};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const fill = fills[0];
|
|
38
|
-
if (!fill || ("visible" in fill && !fill.visible) || fill.type !== "SOLID") {
|
|
39
|
-
return {};
|
|
40
|
-
}
|
|
41
|
-
if (node.boundVariables?.fills?.length === 1) {
|
|
42
|
-
return {
|
|
43
|
-
color: getColorVariableName(node.boundVariables.fills[0]!.id),
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const color = fill.color;
|
|
48
|
-
return {
|
|
49
|
-
color: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${fill.opacity})`,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function createBorderProps(
|
|
54
|
-
node: Pick<NormalizedFrameNode, "strokeWeight" | "strokes" | "boundVariables">,
|
|
55
|
-
): Partial<Record<"borderWidth" | "borderColor", string | number | undefined>> {
|
|
56
|
-
const strokes = node.strokes;
|
|
57
|
-
if (strokes === undefined || strokes.length === 0) {
|
|
58
|
-
return {};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const stroke = strokes[0];
|
|
62
|
-
if (!stroke || ("visible" in stroke && !stroke.visible) || stroke.type !== "SOLID") {
|
|
63
|
-
return {};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (node.boundVariables?.strokes?.length === 1) {
|
|
67
|
-
return {
|
|
68
|
-
borderWidth: node.strokeWeight as number,
|
|
69
|
-
borderColor: getColorVariableName(node.boundVariables.strokes[0]!.id),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const color = stroke.color;
|
|
74
|
-
return {
|
|
75
|
-
borderWidth: node.strokeWeight as number,
|
|
76
|
-
borderColor: `rgba(${color.r * 255}, ${color.g * 255}, ${color.b * 255}, ${stroke.opacity})`,
|
|
77
|
-
};
|
|
78
|
-
}
|