@seed-design/figma 0.0.21 → 0.0.23
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/codegen/index.cjs +8012 -0
- package/lib/codegen/index.d.ts +1828 -0
- package/lib/codegen/index.js +7983 -0
- package/lib/codegen/targets/react/index.cjs +12198 -0
- package/lib/codegen/targets/react/index.d.ts +267 -0
- package/lib/codegen/targets/react/index.js +12180 -0
- package/lib/index.cjs +79 -2741
- package/lib/index.d.ts +17 -1937
- package/lib/index.js +61 -2715
- package/package.json +12 -2
- package/src/codegen/{targets/react/component/properties.type.ts → component-properties.ts} +43 -43
- package/src/codegen/core/codegen.ts +17 -6
- package/src/codegen/core/{component.ts → component-handler.ts} +3 -3
- package/src/codegen/core/component-type-helper.ts +35 -0
- package/src/codegen/core/index.ts +14 -14
- package/src/codegen/core/{props.ts → props-converter.ts} +10 -13
- package/src/codegen/core/{value.ts → value-resolver.ts} +87 -50
- package/src/codegen/default-services.ts +44 -0
- package/src/codegen/index.ts +1 -44
- package/src/codegen/targets/figma/frame.ts +8 -8
- package/src/codegen/targets/figma/index.ts +1 -1
- package/src/codegen/targets/figma/pipeline.ts +94 -0
- package/src/codegen/targets/figma/props.ts +59 -70
- package/src/codegen/targets/figma/shape.ts +18 -18
- package/src/codegen/targets/figma/text.ts +6 -6
- package/src/codegen/targets/figma/value-resolver.ts +19 -0
- package/src/codegen/targets/react/component/deps.interface.ts +5 -4
- package/src/codegen/targets/react/component/{transformers → handlers}/action-button.ts +8 -14
- package/src/codegen/targets/react/component/{transformers → handlers}/action-chip.ts +10 -20
- package/src/codegen/targets/react/component/{transformers → handlers}/action-sheet.ts +13 -10
- package/src/codegen/targets/react/component/{transformers → handlers}/app-bar.ts +28 -36
- package/src/codegen/targets/react/component/handlers/avatar-stack.ts +29 -0
- package/src/codegen/targets/react/component/{transformers → handlers}/avatar.ts +12 -9
- package/src/codegen/targets/react/component/handlers/badge.ts +18 -0
- package/src/codegen/targets/react/component/{transformers → handlers}/callout.ts +6 -8
- package/src/codegen/targets/react/component/{transformers → handlers}/checkbox.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/chip-tabs.ts +10 -10
- package/src/codegen/targets/react/component/{transformers → handlers}/control-chip.ts +10 -20
- package/src/codegen/targets/react/component/{transformers → handlers}/error-state.ts +9 -9
- package/src/codegen/targets/react/component/{transformers → handlers}/extended-action-sheet.ts +16 -18
- package/src/codegen/targets/react/component/{transformers → handlers}/extended-fab.ts +6 -6
- package/src/codegen/targets/react/component/handlers/fab.ts +18 -0
- package/src/codegen/targets/react/component/{transformers → handlers}/help-bubble.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/identity-placeholder.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/inline-banner.ts +7 -10
- package/src/codegen/targets/react/component/{transformers → handlers}/manner-temp-badge.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/multiline-text-field.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/progress-circle.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/reaction-button.ts +6 -6
- package/src/codegen/targets/react/component/{transformers → handlers}/segmented-control.ts +10 -10
- package/src/codegen/targets/react/component/{transformers → handlers}/select-box.ts +10 -10
- package/src/codegen/targets/react/component/handlers/skeleton.ts +25 -0
- package/src/codegen/targets/react/component/{transformers → handlers}/snackbar.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/switch.ts +5 -5
- package/src/codegen/targets/react/component/{transformers → handlers}/tabs.ts +15 -15
- package/src/codegen/targets/react/component/{transformers → handlers}/text-button.ts +7 -13
- package/src/codegen/targets/react/component/{transformers → handlers}/text-field.ts +9 -9
- package/src/codegen/targets/react/component/{transformers → handlers}/toggle-button.ts +7 -11
- package/src/codegen/targets/react/component/index.ts +79 -75
- package/src/codegen/targets/react/frame.ts +8 -8
- package/src/codegen/targets/react/icon.ts +50 -0
- package/src/codegen/targets/react/index.ts +1 -1
- package/src/codegen/targets/react/instance.ts +19 -50
- package/src/codegen/targets/react/pipeline.ts +124 -0
- package/src/codegen/targets/react/props.ts +95 -73
- package/src/codegen/targets/react/shape.ts +5 -5
- package/src/codegen/targets/react/text.ts +6 -6
- package/src/codegen/targets/react/value-resolver.ts +32 -0
- package/src/entities/icon.repository.ts +2 -2
- package/src/entities/icon.service.ts +9 -20
- package/src/entities/style.service.ts +5 -17
- package/src/entities/variable.service.ts +36 -68
- package/src/utils/figma-variable.ts +39 -3
- package/src/codegen/core/component.types.ts +0 -29
- package/src/codegen/targets/figma/context.ts +0 -139
- package/src/codegen/targets/react/component/transformers/avatar-stack.ts +0 -29
- package/src/codegen/targets/react/component/transformers/badge.ts +0 -21
- package/src/codegen/targets/react/component/transformers/fab.ts +0 -18
- package/src/codegen/targets/react/component/transformers/skeleton.ts +0 -51
- package/src/codegen/targets/react/context.ts +0 -176
- /package/src/codegen/core/{element.ts → element-transformer.ts} +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import type { VariableScope } from "@figma/rest-api-spec";
|
|
2
|
+
|
|
3
|
+
// boundVariable.id is formatted as "VariableID:{key}/{localId}", we have to extract the key
|
|
4
|
+
export function sanitizeVariableId(id: string) {
|
|
5
|
+
return id.replace("VariableID:", "").split("/")[0]!;
|
|
6
|
+
}
|
|
7
|
+
|
|
1
8
|
export function isVariableAlias(value: unknown): value is VariableAlias {
|
|
2
9
|
return (
|
|
3
10
|
typeof value === "object" &&
|
|
@@ -7,7 +14,36 @@ export function isVariableAlias(value: unknown): value is VariableAlias {
|
|
|
7
14
|
);
|
|
8
15
|
}
|
|
9
16
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
17
|
+
export function isIdenticalVariableValue(
|
|
18
|
+
value1: string | number | boolean | RGBA,
|
|
19
|
+
value2: string | number | boolean | RGBA,
|
|
20
|
+
) {
|
|
21
|
+
if (typeof value1 !== typeof value2) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (typeof value1 === "string" || typeof value1 === "number" || typeof value1 === "boolean") {
|
|
26
|
+
return value1 === value2;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
value1.r === (value2 as RGBA).r &&
|
|
31
|
+
value1.g === (value2 as RGBA).g &&
|
|
32
|
+
value1.b === (value2 as RGBA).b &&
|
|
33
|
+
value1.a === (value2 as RGBA).a
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function isInsideScope(variable: { scopes: VariableScope[] }, scope: VariableScope) {
|
|
38
|
+
if (variable.scopes.includes("ALL_SCOPES")) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (variable.scopes.includes("ALL_FILLS")) {
|
|
43
|
+
if (scope === "FRAME_FILL" || scope === "SHAPE_FILL" || scope === "TEXT_FILL") {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return variable.scopes.includes(scope);
|
|
13
49
|
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export interface ComponentPropertyDefinition {
|
|
2
|
-
type: ComponentPropertyType;
|
|
3
|
-
preferredValues?: InstanceSwapPreferredValue[];
|
|
4
|
-
variantOptions?: string[];
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export type InferPropertyType<T extends ComponentPropertyDefinition> = T["type"] extends "TEXT"
|
|
8
|
-
? string
|
|
9
|
-
: T["type"] extends "BOOLEAN"
|
|
10
|
-
? boolean
|
|
11
|
-
: T["type"] extends "INSTANCE_SWAP"
|
|
12
|
-
? string
|
|
13
|
-
: T["type"] extends "VARIANT"
|
|
14
|
-
? T["variantOptions"] extends string[]
|
|
15
|
-
? T["variantOptions"][number]
|
|
16
|
-
: never
|
|
17
|
-
: never;
|
|
18
|
-
|
|
19
|
-
export type InferFromDefinition<T extends Record<string, ComponentPropertyDefinition>> = {
|
|
20
|
-
[K in keyof T]: {
|
|
21
|
-
type: T[K]["type"];
|
|
22
|
-
value: InferPropertyType<T[K]>;
|
|
23
|
-
componentKey?: string;
|
|
24
|
-
preferredValues?: InstanceSwapPreferredValue[];
|
|
25
|
-
readonly boundVariables?: {
|
|
26
|
-
[field in VariableBindableComponentPropertyField]?: VariableAlias;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
};
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { createCodegenTransformer, createValueTransformer } from "@/codegen/core";
|
|
2
|
-
import {
|
|
3
|
-
createStyleService,
|
|
4
|
-
createVariableService,
|
|
5
|
-
styleRepository,
|
|
6
|
-
variableRepository,
|
|
7
|
-
} from "@/entities";
|
|
8
|
-
import { toCssRgba } from "@/utils/css";
|
|
9
|
-
import { createFrameTransformer } from "./frame";
|
|
10
|
-
import { createInstanceTransformer } from "./instance";
|
|
11
|
-
import {
|
|
12
|
-
createContainerLayoutPropsTransformer,
|
|
13
|
-
createFrameFillPropsTransformer,
|
|
14
|
-
createRadiusPropsTransformer,
|
|
15
|
-
createSelfLayoutPropsTransformer,
|
|
16
|
-
createShapeFillPropsTransformer,
|
|
17
|
-
createStrokePropsTransformer,
|
|
18
|
-
createTextFillPropsTransformer,
|
|
19
|
-
createTypeStylePropsTransformer,
|
|
20
|
-
} from "./props";
|
|
21
|
-
import {
|
|
22
|
-
createBooleanOperationTransformer,
|
|
23
|
-
createRectangleTransformer,
|
|
24
|
-
createVectorTransformer,
|
|
25
|
-
} from "./shape";
|
|
26
|
-
import { createTextTransformer } from "./text";
|
|
27
|
-
|
|
28
|
-
export interface CreateContextOptions {
|
|
29
|
-
ignoredComponentKeys?: Set<string>;
|
|
30
|
-
shouldInferVariableName: boolean;
|
|
31
|
-
shouldInferAutoLayout: boolean;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const styleService = createStyleService({
|
|
35
|
-
styleRepository,
|
|
36
|
-
styleNameTransformer: ({ slug }) => slug[slug.length - 1]!,
|
|
37
|
-
});
|
|
38
|
-
const variableService = createVariableService({
|
|
39
|
-
variableRepository,
|
|
40
|
-
variableNameTransformer: ({ slug }) =>
|
|
41
|
-
slug
|
|
42
|
-
.filter((s) => s !== "dimension")
|
|
43
|
-
.map((s) => s.replaceAll(",", "_"))
|
|
44
|
-
.join("/"),
|
|
45
|
-
inferCompareFunction: (name1: string, name2: string) => {
|
|
46
|
-
const scoreFn = (name: string) => {
|
|
47
|
-
let score = 0;
|
|
48
|
-
if (name.includes("bg")) {
|
|
49
|
-
score += 100;
|
|
50
|
-
}
|
|
51
|
-
if (name.includes("fg")) {
|
|
52
|
-
score += 100;
|
|
53
|
-
}
|
|
54
|
-
if (name.includes("stroke")) {
|
|
55
|
-
score += 100;
|
|
56
|
-
}
|
|
57
|
-
if (name.includes("spacing-x")) {
|
|
58
|
-
score -= 100;
|
|
59
|
-
}
|
|
60
|
-
if (name.includes("spacing-y")) {
|
|
61
|
-
score -= 100;
|
|
62
|
-
}
|
|
63
|
-
if (name.endsWith("pressed")) {
|
|
64
|
-
score -= 100;
|
|
65
|
-
}
|
|
66
|
-
return score;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
return scoreFn(name2) - scoreFn(name1);
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
export function createContext(options: CreateContextOptions) {
|
|
74
|
-
const { shouldInferVariableName, shouldInferAutoLayout } = options;
|
|
75
|
-
|
|
76
|
-
const valueTransformer = createValueTransformer({
|
|
77
|
-
variableService,
|
|
78
|
-
formatters: {
|
|
79
|
-
color: (value: RGBA) => toCssRgba(value),
|
|
80
|
-
dimension: (value: number) => value,
|
|
81
|
-
fontDimension: (value: number) => value,
|
|
82
|
-
fontWeight: (value: number) => value,
|
|
83
|
-
},
|
|
84
|
-
shouldInferVariableName,
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const containerLayoutPropsTransformer = createContainerLayoutPropsTransformer(valueTransformer);
|
|
88
|
-
const selfLayoutPropsTransformer = createSelfLayoutPropsTransformer(valueTransformer);
|
|
89
|
-
const frameFillPropsTransformer = createFrameFillPropsTransformer(valueTransformer);
|
|
90
|
-
const shapeFillPropsTransformer = createShapeFillPropsTransformer(valueTransformer);
|
|
91
|
-
const textFillPropsTransformer = createTextFillPropsTransformer(valueTransformer);
|
|
92
|
-
const radiusPropsTransformer = createRadiusPropsTransformer(valueTransformer);
|
|
93
|
-
const strokePropsTransformer = createStrokePropsTransformer(valueTransformer);
|
|
94
|
-
const typeStylePropsTransformer = createTypeStylePropsTransformer({
|
|
95
|
-
valueTransformer,
|
|
96
|
-
styleService,
|
|
97
|
-
});
|
|
98
|
-
const propsTransformers = {
|
|
99
|
-
containerLayout: containerLayoutPropsTransformer,
|
|
100
|
-
selfLayout: selfLayoutPropsTransformer,
|
|
101
|
-
frameFill: frameFillPropsTransformer,
|
|
102
|
-
shapeFill: shapeFillPropsTransformer,
|
|
103
|
-
textFill: textFillPropsTransformer,
|
|
104
|
-
radius: radiusPropsTransformer,
|
|
105
|
-
stroke: strokePropsTransformer,
|
|
106
|
-
typeStyle: typeStylePropsTransformer,
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
const frameTransformer = createFrameTransformer({
|
|
110
|
-
propsTransformers,
|
|
111
|
-
});
|
|
112
|
-
const instanceTransformer = createInstanceTransformer({
|
|
113
|
-
frameTransformer,
|
|
114
|
-
});
|
|
115
|
-
const textTransformer = createTextTransformer({
|
|
116
|
-
propsTransformers,
|
|
117
|
-
});
|
|
118
|
-
const rectangleTransformer = createRectangleTransformer({
|
|
119
|
-
propsTransformers,
|
|
120
|
-
});
|
|
121
|
-
const vectorTransformer = createVectorTransformer({
|
|
122
|
-
propsTransformers,
|
|
123
|
-
});
|
|
124
|
-
const booleanOperationTransformer = createBooleanOperationTransformer({
|
|
125
|
-
propsTransformers,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const codegenTransformer = createCodegenTransformer({
|
|
129
|
-
frameTransformer,
|
|
130
|
-
textTransformer,
|
|
131
|
-
rectangleTransformer,
|
|
132
|
-
instanceTransformer,
|
|
133
|
-
vectorTransformer,
|
|
134
|
-
booleanOperationTransformer,
|
|
135
|
-
shouldInferAutoLayout,
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
return codegenTransformer;
|
|
139
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
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
|
-
import type { AvatarProperties, AvatarStackProperties } from "../properties.type";
|
|
6
|
-
import { createAvatarTransformer } from "./avatar";
|
|
7
|
-
|
|
8
|
-
export const createAvatarStackTransformer = (ctx: SeedComponentTransformerDeps) => {
|
|
9
|
-
const avatarTransformer = createAvatarTransformer(ctx);
|
|
10
|
-
|
|
11
|
-
return defineComponentTransformer<AvatarStackProperties>(metadata.avatarStack.key, (node) => {
|
|
12
|
-
const avatarNodes = findAllInstances<AvatarProperties>({
|
|
13
|
-
node,
|
|
14
|
-
key: avatarTransformer.key,
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
const { componentProperties: props } = node;
|
|
18
|
-
|
|
19
|
-
const commonProps = {
|
|
20
|
-
size: props.Size.value,
|
|
21
|
-
// TODO: 구현될 예정
|
|
22
|
-
// topItem: camelCase(props["Top Item"].value),
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const avatarStackChildren = avatarNodes.map(avatarTransformer.transform);
|
|
26
|
-
|
|
27
|
-
return createElement("AvatarStack", commonProps, avatarStackChildren);
|
|
28
|
-
});
|
|
29
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { createElement, defineComponentTransformer } from "@/codegen/core";
|
|
2
|
-
import * as metadata from "@/entities/data/__generated__/component-sets";
|
|
3
|
-
import { camelCase } from "change-case";
|
|
4
|
-
import type { SeedComponentTransformerDeps } from "../deps.interface";
|
|
5
|
-
import type { BadgeProperties } from "../properties.type";
|
|
6
|
-
import { handleSizeProp } from "../size";
|
|
7
|
-
|
|
8
|
-
export const createBadgeTransformer = (_ctx: SeedComponentTransformerDeps) =>
|
|
9
|
-
defineComponentTransformer<BadgeProperties>(
|
|
10
|
-
metadata.badge.key,
|
|
11
|
-
({ componentProperties: props }) => {
|
|
12
|
-
const commonProps = {
|
|
13
|
-
size: handleSizeProp(props.Size.value),
|
|
14
|
-
tone: camelCase(props.Tone.value),
|
|
15
|
-
variant: camelCase(props.Variant.value),
|
|
16
|
-
shape: camelCase(props.Shape.value),
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
return createElement("Badge", commonProps, props["Label#1584:0"].value);
|
|
20
|
-
},
|
|
21
|
-
);
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineComponentTransformer } from "@/codegen/core";
|
|
2
|
-
import * as metadata from "@/entities/data/__generated__/component-sets";
|
|
3
|
-
import { createElement } from "@/codegen/core";
|
|
4
|
-
import type { FabProperties } from "../properties.type";
|
|
5
|
-
import type { SeedComponentTransformerDeps } from "../deps.interface";
|
|
6
|
-
|
|
7
|
-
export const createFabTransformer = (ctx: SeedComponentTransformerDeps) =>
|
|
8
|
-
defineComponentTransformer<FabProperties>(
|
|
9
|
-
metadata.floatingActionButton.key,
|
|
10
|
-
({ componentProperties: props }) => {
|
|
11
|
-
return createElement(
|
|
12
|
-
"Fab",
|
|
13
|
-
undefined,
|
|
14
|
-
createElement(ctx.iconService.createIconTagName(props["Icon#28796:0"].componentKey)),
|
|
15
|
-
"aria-label이나 aria-labelledby 중 하나를 제공해야 합니다.",
|
|
16
|
-
);
|
|
17
|
-
},
|
|
18
|
-
);
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { createElement, defineComponentTransformer } from "@/codegen/core";
|
|
2
|
-
import * as metadata from "@/entities/data/__generated__/component-sets";
|
|
3
|
-
import { camelCase } from "change-case";
|
|
4
|
-
import type { SeedComponentTransformerDeps } from "../deps.interface";
|
|
5
|
-
import type { SkeletonProperties } from "../properties.type";
|
|
6
|
-
|
|
7
|
-
export const createSkeletonTransformer = (ctx: SeedComponentTransformerDeps) =>
|
|
8
|
-
defineComponentTransformer<SkeletonProperties>(
|
|
9
|
-
metadata.skeleton.key,
|
|
10
|
-
({
|
|
11
|
-
componentProperties: props,
|
|
12
|
-
absoluteBoundingBox,
|
|
13
|
-
layoutSizingHorizontal,
|
|
14
|
-
layoutSizingVertical,
|
|
15
|
-
boundVariables,
|
|
16
|
-
}) => {
|
|
17
|
-
const commonProps = {
|
|
18
|
-
radius: camelCase(props.Radius.value),
|
|
19
|
-
width: (() => {
|
|
20
|
-
switch (layoutSizingHorizontal) {
|
|
21
|
-
case "FIXED": {
|
|
22
|
-
const variableId = boundVariables?.size?.x?.id;
|
|
23
|
-
if (variableId) return ctx.variableService.getVariableName(variableId);
|
|
24
|
-
|
|
25
|
-
return `${absoluteBoundingBox?.width}px`;
|
|
26
|
-
}
|
|
27
|
-
case "FILL":
|
|
28
|
-
return "full";
|
|
29
|
-
default:
|
|
30
|
-
return "full";
|
|
31
|
-
}
|
|
32
|
-
})(),
|
|
33
|
-
height: (() => {
|
|
34
|
-
switch (layoutSizingVertical) {
|
|
35
|
-
case "FIXED": {
|
|
36
|
-
const variableId = boundVariables?.size?.y?.id;
|
|
37
|
-
if (variableId) return ctx.variableService.getVariableName(variableId);
|
|
38
|
-
|
|
39
|
-
return `${absoluteBoundingBox?.height}px`;
|
|
40
|
-
}
|
|
41
|
-
case "FILL":
|
|
42
|
-
return "full";
|
|
43
|
-
default:
|
|
44
|
-
return "full";
|
|
45
|
-
}
|
|
46
|
-
})(),
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return createElement("Skeleton", commonProps);
|
|
50
|
-
},
|
|
51
|
-
);
|
|
@@ -1,176 +0,0 @@
|
|
|
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
|
-
!(
|
|
57
|
-
s === "dimension" ||
|
|
58
|
-
s === "radius" ||
|
|
59
|
-
s === "font-size" ||
|
|
60
|
-
s === "font-weight" ||
|
|
61
|
-
s === "line-height"
|
|
62
|
-
),
|
|
63
|
-
)
|
|
64
|
-
.map((s) => s.replaceAll(",", "_"))
|
|
65
|
-
.map(camelCasePreserveUnderscoreBetweenNumbers)
|
|
66
|
-
.join("."),
|
|
67
|
-
inferCompareFunction: (name1: string, name2: string) => {
|
|
68
|
-
const scoreFn = (name: string) => {
|
|
69
|
-
let score = 0;
|
|
70
|
-
if (name.includes("bg")) {
|
|
71
|
-
score += 100;
|
|
72
|
-
}
|
|
73
|
-
if (name.includes("fg")) {
|
|
74
|
-
score += 100;
|
|
75
|
-
}
|
|
76
|
-
if (name.includes("stroke")) {
|
|
77
|
-
score += 100;
|
|
78
|
-
}
|
|
79
|
-
if (name.includes("spacing-x")) {
|
|
80
|
-
score -= 100;
|
|
81
|
-
}
|
|
82
|
-
if (name.includes("spacing-y")) {
|
|
83
|
-
score -= 100;
|
|
84
|
-
}
|
|
85
|
-
if (name.endsWith("pressed")) {
|
|
86
|
-
score -= 100;
|
|
87
|
-
}
|
|
88
|
-
return score;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
return scoreFn(name2) - scoreFn(name1);
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
const iconService = createIconService({
|
|
95
|
-
iconRepository,
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// TODO: implement figma component service
|
|
99
|
-
const componentTransformers = createSeedComponentTransformers({
|
|
100
|
-
iconService,
|
|
101
|
-
variableService,
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
export function createContext(options: CreateContextOptions) {
|
|
105
|
-
const {
|
|
106
|
-
ignoredComponentKeys = IGNORED_COMPONENT_KEYS,
|
|
107
|
-
shouldInferVariableName,
|
|
108
|
-
shouldInferAutoLayout,
|
|
109
|
-
} = options;
|
|
110
|
-
|
|
111
|
-
const valueTransformer = createValueTransformer({
|
|
112
|
-
variableService,
|
|
113
|
-
formatters: {
|
|
114
|
-
color: (value: RGBA) => toCssRgba(value),
|
|
115
|
-
dimension: (value: number) => toCssPixel(value),
|
|
116
|
-
fontDimension: (value: number) => toCssPixel(value),
|
|
117
|
-
fontWeight: (value: number) => value,
|
|
118
|
-
},
|
|
119
|
-
shouldInferVariableName,
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const containerLayoutPropsTransformer = createContainerLayoutPropsTransformer(valueTransformer);
|
|
123
|
-
const selfLayoutPropsTransformer = createSelfLayoutPropsTransformer(valueTransformer);
|
|
124
|
-
const iconSelfLayoutPropsTransformer = createIconSelfLayoutPropsTransformer(valueTransformer);
|
|
125
|
-
const frameFillPropsTransformer = createFrameFillPropsTransformer(valueTransformer);
|
|
126
|
-
const shapeFillPropsTransformer = createShapeFillPropsTransformer(valueTransformer);
|
|
127
|
-
const textFillPropsTransformer = createTextFillPropsTransformer(valueTransformer);
|
|
128
|
-
const radiusPropsTransformer = createRadiusPropsTransformer(valueTransformer);
|
|
129
|
-
const strokePropsTransformer = createStrokePropsTransformer(valueTransformer);
|
|
130
|
-
const typeStylePropsTransformer = createTypeStylePropsTransformer({
|
|
131
|
-
valueTransformer,
|
|
132
|
-
styleService,
|
|
133
|
-
});
|
|
134
|
-
const propsTransformers = {
|
|
135
|
-
containerLayout: containerLayoutPropsTransformer,
|
|
136
|
-
selfLayout: selfLayoutPropsTransformer,
|
|
137
|
-
iconSelfLayout: iconSelfLayoutPropsTransformer,
|
|
138
|
-
frameFill: frameFillPropsTransformer,
|
|
139
|
-
shapeFill: shapeFillPropsTransformer,
|
|
140
|
-
textFill: textFillPropsTransformer,
|
|
141
|
-
radius: radiusPropsTransformer,
|
|
142
|
-
stroke: strokePropsTransformer,
|
|
143
|
-
typeStyle: typeStylePropsTransformer,
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
const frameTransformer = createFrameTransformer({
|
|
147
|
-
propsTransformers,
|
|
148
|
-
});
|
|
149
|
-
const instanceTransformer = createInstanceTransformer({
|
|
150
|
-
iconService,
|
|
151
|
-
ignoredComponentKeys,
|
|
152
|
-
propsTransformers,
|
|
153
|
-
componentTransformers,
|
|
154
|
-
frameTransformer,
|
|
155
|
-
});
|
|
156
|
-
const textTransformer = createTextTransformer({
|
|
157
|
-
propsTransformers,
|
|
158
|
-
});
|
|
159
|
-
const rectangleTransformer = createRectangleTransformer({
|
|
160
|
-
propsTransformers,
|
|
161
|
-
});
|
|
162
|
-
const vectorTransformer = createVectorTransformer();
|
|
163
|
-
const booleanOperationTransformer = createBooleanOperationTransformer();
|
|
164
|
-
|
|
165
|
-
const codegenTransformer = createCodegenTransformer({
|
|
166
|
-
frameTransformer,
|
|
167
|
-
textTransformer,
|
|
168
|
-
rectangleTransformer,
|
|
169
|
-
instanceTransformer,
|
|
170
|
-
vectorTransformer,
|
|
171
|
-
booleanOperationTransformer,
|
|
172
|
-
shouldInferAutoLayout,
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
return codegenTransformer;
|
|
176
|
-
}
|
|
File without changes
|