@seed-design/figma 1.3.7 → 1.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/codegen/index.cjs +51 -7
- package/lib/codegen/index.d.ts +9 -2
- package/lib/codegen/index.d.ts.map +1 -1
- package/lib/codegen/index.js +51 -7
- package/lib/codegen/targets/react/index.cjs +39 -17
- package/lib/codegen/targets/react/index.d.ts +7 -1
- package/lib/codegen/targets/react/index.d.ts.map +1 -1
- package/lib/codegen/targets/react/index.js +39 -17
- package/lib/index.cjs +64 -6
- package/lib/index.d.ts +8 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +64 -6
- package/package.json +3 -3
- package/src/codegen/core/codegen.ts +4 -0
- package/src/codegen/targets/figma/instance.ts +29 -11
- package/src/codegen/targets/figma/pipeline.ts +15 -1
- package/src/codegen/targets/react/component/handlers/bottom-sheet.ts +9 -13
- package/src/codegen/targets/react/component/handlers/image-frame.ts +1 -1
- package/src/codegen/targets/react/component/handlers/select-box.ts +16 -10
- package/src/codegen/targets/react/pipeline.ts +7 -1
- package/src/entities/data/__generated__/component-sets/index.d.ts +14 -3
- package/src/entities/data/__generated__/component-sets/index.mjs +14 -3
- package/src/entities/data/__generated__/components/index.d.ts +5 -15
- package/src/entities/data/__generated__/components/index.mjs +5 -15
- package/src/normalizer/from-plugin.ts +34 -1
- package/src/normalizer/from-rest.ts +34 -2
- package/src/normalizer/types.ts +8 -0
- package/src/utils/figma-node.ts +14 -8
package/lib/codegen/index.cjs
CHANGED
|
@@ -448,7 +448,7 @@ function applyInferredLayout(parentNode, result) {
|
|
|
448
448
|
};
|
|
449
449
|
}
|
|
450
450
|
|
|
451
|
-
function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys }) {
|
|
451
|
+
function createCodeGenerator({ frameTransformer, slotTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys }) {
|
|
452
452
|
function isSkippedInstance(node) {
|
|
453
453
|
if (!skipComponentKeys || skipComponentKeys.size === 0) return false;
|
|
454
454
|
if (node.type !== "INSTANCE") return false;
|
|
@@ -472,6 +472,8 @@ function createCodeGenerator({ frameTransformer, textTransformer, rectangleTrans
|
|
|
472
472
|
type: "COMPONENT"
|
|
473
473
|
}, (node)=>frameTransformer(node, traverse)) // NOTE: Treat component node as Frame for now
|
|
474
474
|
.with({
|
|
475
|
+
type: "SLOT"
|
|
476
|
+
}, (node)=>slotTransformer(node, traverse)).with({
|
|
475
477
|
type: "INSTANCE"
|
|
476
478
|
}, (node)=>instanceTransformer(node, traverse)).with({
|
|
477
479
|
type: "VECTOR"
|
|
@@ -549,8 +551,24 @@ function createPropsConverter({ handlers, shorthands, defaults }) {
|
|
|
549
551
|
});
|
|
550
552
|
}
|
|
551
553
|
|
|
554
|
+
function traverseNode(node, callback) {
|
|
555
|
+
callback(node);
|
|
556
|
+
if (!("children" in node)) return;
|
|
557
|
+
for (const child of node.children){
|
|
558
|
+
traverseNode(child, callback);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
function findOne(node, callback) {
|
|
562
|
+
let result;
|
|
563
|
+
traverseNode(node, (n)=>{
|
|
564
|
+
if (callback(n)) {
|
|
565
|
+
result = n;
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
return result;
|
|
569
|
+
}
|
|
552
570
|
function getFirstSolidFill(node) {
|
|
553
|
-
const fills = node.fills.filter((fill)=>fill.type === "SOLID"
|
|
571
|
+
const fills = node.fills.filter((fill)=>fill.type === "SOLID");
|
|
554
572
|
if (fills.length === 0) {
|
|
555
573
|
return undefined;
|
|
556
574
|
}
|
|
@@ -561,7 +579,7 @@ function getFirstFillVariable(node) {
|
|
|
561
579
|
return fill?.boundVariables?.color;
|
|
562
580
|
}
|
|
563
581
|
function getFirstStroke(node) {
|
|
564
|
-
const strokes = node.strokes?.filter((stroke)=>stroke.type === "SOLID"
|
|
582
|
+
const strokes = node.strokes?.filter((stroke)=>stroke.type === "SOLID") ?? [];
|
|
565
583
|
if (strokes.length === 0) {
|
|
566
584
|
return undefined;
|
|
567
585
|
}
|
|
@@ -20595,6 +20613,7 @@ const componentAvatar = {
|
|
|
20595
20613
|
"36",
|
|
20596
20614
|
"42",
|
|
20597
20615
|
"48",
|
|
20616
|
+
"56",
|
|
20598
20617
|
"64",
|
|
20599
20618
|
"80",
|
|
20600
20619
|
"96",
|
|
@@ -20648,6 +20667,7 @@ const componentAvatarStack = {
|
|
|
20648
20667
|
"36",
|
|
20649
20668
|
"42",
|
|
20650
20669
|
"48",
|
|
20670
|
+
"56",
|
|
20651
20671
|
"64",
|
|
20652
20672
|
"80",
|
|
20653
20673
|
"96",
|
|
@@ -20740,6 +20760,9 @@ const componentBottomSheet = {
|
|
|
20740
20760
|
"name": "componentBottomSheet",
|
|
20741
20761
|
"key": "ffe99a21452831c28bd9375aac0aaf37d7ee6a0d",
|
|
20742
20762
|
"componentPropertyDefinitions": {
|
|
20763
|
+
"Contents Slot#6752:0": {
|
|
20764
|
+
"type": "SLOT"
|
|
20765
|
+
},
|
|
20743
20766
|
"Title#19787:3": {
|
|
20744
20767
|
"type": "TEXT"
|
|
20745
20768
|
},
|
|
@@ -20755,9 +20778,6 @@ const componentBottomSheet = {
|
|
|
20755
20778
|
"Show Description#25192:0": {
|
|
20756
20779
|
"type": "BOOLEAN"
|
|
20757
20780
|
},
|
|
20758
|
-
"Contents#25320:0": {
|
|
20759
|
-
"type": "INSTANCE_SWAP"
|
|
20760
|
-
},
|
|
20761
20781
|
"Show Safe Area#25488:8": {
|
|
20762
20782
|
"type": "BOOLEAN"
|
|
20763
20783
|
},
|
|
@@ -21084,6 +21104,9 @@ const componentChlid = {
|
|
|
21084
21104
|
"name": "componentChlid",
|
|
21085
21105
|
"key": "ef79a21a39ceb4ce24b2fb93c9b430c1980a3e71",
|
|
21086
21106
|
"componentPropertyDefinitions": {
|
|
21107
|
+
"Slot#6081:0": {
|
|
21108
|
+
"type": "SLOT"
|
|
21109
|
+
},
|
|
21087
21110
|
"Type": {
|
|
21088
21111
|
"type": "VARIANT",
|
|
21089
21112
|
"variantOptions": [
|
|
@@ -22771,6 +22794,9 @@ const componentSelectBoxItemHorizontal = {
|
|
|
22771
22794
|
"name": "componentSelectBoxItemHorizontal",
|
|
22772
22795
|
"key": "8174af8ef3654dad996723883f5b84f44f791513",
|
|
22773
22796
|
"componentPropertyDefinitions": {
|
|
22797
|
+
"Content Slot#6752:6": {
|
|
22798
|
+
"type": "SLOT"
|
|
22799
|
+
},
|
|
22774
22800
|
"Title#28452:21": {
|
|
22775
22801
|
"type": "TEXT"
|
|
22776
22802
|
},
|
|
@@ -22818,6 +22844,9 @@ const componentSelectBoxItemVertical = {
|
|
|
22818
22844
|
"name": "componentSelectBoxItemVertical",
|
|
22819
22845
|
"key": "ccc88f0aae500c64e7d43be63c4f1a70baf76bfe",
|
|
22820
22846
|
"componentPropertyDefinitions": {
|
|
22847
|
+
"Content Slot#6765:0": {
|
|
22848
|
+
"type": "SLOT"
|
|
22849
|
+
},
|
|
22821
22850
|
"Title#58766:114": {
|
|
22822
22851
|
"type": "TEXT"
|
|
22823
22852
|
},
|
|
@@ -23201,13 +23230,14 @@ function createInstanceTransformer({ frameTransformer, componentRepository }) {
|
|
|
23201
23230
|
const transform = defineElementTransformer((node, traverse)=>{
|
|
23202
23231
|
const component = componentRepository?.getOne(node.componentSetKey ?? node.componentKey);
|
|
23203
23232
|
if (component) {
|
|
23233
|
+
const slotChildren = Object.entries(node.componentProperties).filter(([_, prop])=>prop.type === "SLOT").map(([key])=>findOne(node, (child)=>child.type === "SLOT" && child.componentPropertyReferences?.slotContentId === key)).filter((slot)=>slot != null).map((slot)=>traverse(slot)).filter((el)=>el != null);
|
|
23204
23234
|
return createElement("Instance", {
|
|
23205
23235
|
componentName: component.name,
|
|
23206
23236
|
...Object.fromEntries(Object.entries(node.componentProperties).filter(([_, props])=>props.type === "VARIANT" || props.type === "TEXT").map(([key, props])=>[
|
|
23207
23237
|
changeCase.camelCase(key.split("#")[0]),
|
|
23208
23238
|
changeCase.camelCase(props.value)
|
|
23209
23239
|
]))
|
|
23210
|
-
});
|
|
23240
|
+
}, slotChildren);
|
|
23211
23241
|
}
|
|
23212
23242
|
return frameTransformer(node, traverse);
|
|
23213
23243
|
});
|
|
@@ -23497,8 +23527,22 @@ function createPipeline(options = {}) {
|
|
|
23497
23527
|
const booleanOperationTransformer = createBooleanOperationTransformer({
|
|
23498
23528
|
propsConverters
|
|
23499
23529
|
});
|
|
23530
|
+
const slotTransformer = defineElementTransformer((node, traverse)=>{
|
|
23531
|
+
const slotName = node.componentPropertyReferences?.slotContentId?.split("#")[0];
|
|
23532
|
+
const frameResult = frameTransformer({
|
|
23533
|
+
...node,
|
|
23534
|
+
type: "FRAME"
|
|
23535
|
+
}, traverse);
|
|
23536
|
+
if (!frameResult) return undefined;
|
|
23537
|
+
return createElement("Slot", {
|
|
23538
|
+
...slotName && {
|
|
23539
|
+
name: slotName
|
|
23540
|
+
}
|
|
23541
|
+
}, frameResult);
|
|
23542
|
+
});
|
|
23500
23543
|
const codegenTransformer = createCodeGenerator({
|
|
23501
23544
|
frameTransformer,
|
|
23545
|
+
slotTransformer,
|
|
23502
23546
|
textTransformer,
|
|
23503
23547
|
rectangleTransformer,
|
|
23504
23548
|
instanceTransformer,
|
package/lib/codegen/index.d.ts
CHANGED
|
@@ -72,6 +72,12 @@ interface NormalizedInstanceNode extends NormalizedFrameTrait {
|
|
|
72
72
|
overrides?: FigmaRestSpec.InstanceNode["overrides"];
|
|
73
73
|
children: NormalizedSceneNode[];
|
|
74
74
|
}
|
|
75
|
+
interface NormalizedSlotNode extends NormalizedFrameTrait {
|
|
76
|
+
type: FigmaRestSpec.SlotNode["type"];
|
|
77
|
+
componentPropertyReferences?: FigmaRestSpec.IsLayerTrait["componentPropertyReferences"] & {
|
|
78
|
+
slotContentId?: string;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
75
81
|
interface NormalizedVectorNode extends NormalizedDefaultShapeTrait, NormalizedCornerTrait {
|
|
76
82
|
type: FigmaRestSpec.VectorNode["type"];
|
|
77
83
|
}
|
|
@@ -83,7 +89,7 @@ interface NormalizedUnhandledNode {
|
|
|
83
89
|
id: string;
|
|
84
90
|
original: FigmaRestSpec.Node | SceneNode;
|
|
85
91
|
}
|
|
86
|
-
type NormalizedSceneNode = NormalizedFrameNode | NormalizedRectangleNode | NormalizedTextNode | NormalizedComponentNode | NormalizedInstanceNode | NormalizedVectorNode | NormalizedBooleanOperationNode | NormalizedUnhandledNode;
|
|
92
|
+
type NormalizedSceneNode = NormalizedFrameNode | NormalizedRectangleNode | NormalizedTextNode | NormalizedComponentNode | NormalizedInstanceNode | NormalizedSlotNode | NormalizedVectorNode | NormalizedBooleanOperationNode | NormalizedUnhandledNode;
|
|
87
93
|
|
|
88
94
|
interface ElementNode {
|
|
89
95
|
__IS_JSX_ELEMENT_NODE: true;
|
|
@@ -116,6 +122,7 @@ declare function defineElementTransformer<T extends NormalizedSceneNode>(transfo
|
|
|
116
122
|
|
|
117
123
|
interface CodeGeneratorDeps {
|
|
118
124
|
frameTransformer: ElementTransformer<NormalizedFrameNode | NormalizedComponentNode | NormalizedInstanceNode>;
|
|
125
|
+
slotTransformer: ElementTransformer<NormalizedSlotNode>;
|
|
119
126
|
textTransformer: ElementTransformer<NormalizedTextNode>;
|
|
120
127
|
rectangleTransformer: ElementTransformer<NormalizedRectangleNode>;
|
|
121
128
|
instanceTransformer: ElementTransformer<NormalizedInstanceNode>;
|
|
@@ -133,7 +140,7 @@ interface CodeGenerator {
|
|
|
133
140
|
jsx: string;
|
|
134
141
|
} | undefined;
|
|
135
142
|
}
|
|
136
|
-
declare function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys, }: CodeGeneratorDeps): CodeGenerator;
|
|
143
|
+
declare function createCodeGenerator({ frameTransformer, slotTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys, }: CodeGeneratorDeps): CodeGenerator;
|
|
137
144
|
|
|
138
145
|
interface ComponentHandler<T extends NormalizedInstanceNode["componentProperties"] = NormalizedInstanceNode["componentProperties"]> {
|
|
139
146
|
key: string;
|