@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.js
CHANGED
|
@@ -429,7 +429,7 @@ function applyInferredLayout(parentNode, result) {
|
|
|
429
429
|
};
|
|
430
430
|
}
|
|
431
431
|
|
|
432
|
-
function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys }) {
|
|
432
|
+
function createCodeGenerator({ frameTransformer, slotTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys }) {
|
|
433
433
|
function isSkippedInstance(node) {
|
|
434
434
|
if (!skipComponentKeys || skipComponentKeys.size === 0) return false;
|
|
435
435
|
if (node.type !== "INSTANCE") return false;
|
|
@@ -453,6 +453,8 @@ function createCodeGenerator({ frameTransformer, textTransformer, rectangleTrans
|
|
|
453
453
|
type: "COMPONENT"
|
|
454
454
|
}, (node)=>frameTransformer(node, traverse)) // NOTE: Treat component node as Frame for now
|
|
455
455
|
.with({
|
|
456
|
+
type: "SLOT"
|
|
457
|
+
}, (node)=>slotTransformer(node, traverse)).with({
|
|
456
458
|
type: "INSTANCE"
|
|
457
459
|
}, (node)=>instanceTransformer(node, traverse)).with({
|
|
458
460
|
type: "VECTOR"
|
|
@@ -530,8 +532,24 @@ function createPropsConverter({ handlers, shorthands, defaults }) {
|
|
|
530
532
|
});
|
|
531
533
|
}
|
|
532
534
|
|
|
535
|
+
function traverseNode(node, callback) {
|
|
536
|
+
callback(node);
|
|
537
|
+
if (!("children" in node)) return;
|
|
538
|
+
for (const child of node.children){
|
|
539
|
+
traverseNode(child, callback);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function findOne(node, callback) {
|
|
543
|
+
let result;
|
|
544
|
+
traverseNode(node, (n)=>{
|
|
545
|
+
if (callback(n)) {
|
|
546
|
+
result = n;
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
return result;
|
|
550
|
+
}
|
|
533
551
|
function getFirstSolidFill(node) {
|
|
534
|
-
const fills = node.fills.filter((fill)=>fill.type === "SOLID"
|
|
552
|
+
const fills = node.fills.filter((fill)=>fill.type === "SOLID");
|
|
535
553
|
if (fills.length === 0) {
|
|
536
554
|
return undefined;
|
|
537
555
|
}
|
|
@@ -542,7 +560,7 @@ function getFirstFillVariable(node) {
|
|
|
542
560
|
return fill?.boundVariables?.color;
|
|
543
561
|
}
|
|
544
562
|
function getFirstStroke(node) {
|
|
545
|
-
const strokes = node.strokes?.filter((stroke)=>stroke.type === "SOLID"
|
|
563
|
+
const strokes = node.strokes?.filter((stroke)=>stroke.type === "SOLID") ?? [];
|
|
546
564
|
if (strokes.length === 0) {
|
|
547
565
|
return undefined;
|
|
548
566
|
}
|
|
@@ -20576,6 +20594,7 @@ const componentAvatar = {
|
|
|
20576
20594
|
"36",
|
|
20577
20595
|
"42",
|
|
20578
20596
|
"48",
|
|
20597
|
+
"56",
|
|
20579
20598
|
"64",
|
|
20580
20599
|
"80",
|
|
20581
20600
|
"96",
|
|
@@ -20629,6 +20648,7 @@ const componentAvatarStack = {
|
|
|
20629
20648
|
"36",
|
|
20630
20649
|
"42",
|
|
20631
20650
|
"48",
|
|
20651
|
+
"56",
|
|
20632
20652
|
"64",
|
|
20633
20653
|
"80",
|
|
20634
20654
|
"96",
|
|
@@ -20721,6 +20741,9 @@ const componentBottomSheet = {
|
|
|
20721
20741
|
"name": "componentBottomSheet",
|
|
20722
20742
|
"key": "ffe99a21452831c28bd9375aac0aaf37d7ee6a0d",
|
|
20723
20743
|
"componentPropertyDefinitions": {
|
|
20744
|
+
"Contents Slot#6752:0": {
|
|
20745
|
+
"type": "SLOT"
|
|
20746
|
+
},
|
|
20724
20747
|
"Title#19787:3": {
|
|
20725
20748
|
"type": "TEXT"
|
|
20726
20749
|
},
|
|
@@ -20736,9 +20759,6 @@ const componentBottomSheet = {
|
|
|
20736
20759
|
"Show Description#25192:0": {
|
|
20737
20760
|
"type": "BOOLEAN"
|
|
20738
20761
|
},
|
|
20739
|
-
"Contents#25320:0": {
|
|
20740
|
-
"type": "INSTANCE_SWAP"
|
|
20741
|
-
},
|
|
20742
20762
|
"Show Safe Area#25488:8": {
|
|
20743
20763
|
"type": "BOOLEAN"
|
|
20744
20764
|
},
|
|
@@ -21065,6 +21085,9 @@ const componentChlid = {
|
|
|
21065
21085
|
"name": "componentChlid",
|
|
21066
21086
|
"key": "ef79a21a39ceb4ce24b2fb93c9b430c1980a3e71",
|
|
21067
21087
|
"componentPropertyDefinitions": {
|
|
21088
|
+
"Slot#6081:0": {
|
|
21089
|
+
"type": "SLOT"
|
|
21090
|
+
},
|
|
21068
21091
|
"Type": {
|
|
21069
21092
|
"type": "VARIANT",
|
|
21070
21093
|
"variantOptions": [
|
|
@@ -22752,6 +22775,9 @@ const componentSelectBoxItemHorizontal = {
|
|
|
22752
22775
|
"name": "componentSelectBoxItemHorizontal",
|
|
22753
22776
|
"key": "8174af8ef3654dad996723883f5b84f44f791513",
|
|
22754
22777
|
"componentPropertyDefinitions": {
|
|
22778
|
+
"Content Slot#6752:6": {
|
|
22779
|
+
"type": "SLOT"
|
|
22780
|
+
},
|
|
22755
22781
|
"Title#28452:21": {
|
|
22756
22782
|
"type": "TEXT"
|
|
22757
22783
|
},
|
|
@@ -22799,6 +22825,9 @@ const componentSelectBoxItemVertical = {
|
|
|
22799
22825
|
"name": "componentSelectBoxItemVertical",
|
|
22800
22826
|
"key": "ccc88f0aae500c64e7d43be63c4f1a70baf76bfe",
|
|
22801
22827
|
"componentPropertyDefinitions": {
|
|
22828
|
+
"Content Slot#6765:0": {
|
|
22829
|
+
"type": "SLOT"
|
|
22830
|
+
},
|
|
22802
22831
|
"Title#58766:114": {
|
|
22803
22832
|
"type": "TEXT"
|
|
22804
22833
|
},
|
|
@@ -23182,13 +23211,14 @@ function createInstanceTransformer({ frameTransformer, componentRepository }) {
|
|
|
23182
23211
|
const transform = defineElementTransformer((node, traverse)=>{
|
|
23183
23212
|
const component = componentRepository?.getOne(node.componentSetKey ?? node.componentKey);
|
|
23184
23213
|
if (component) {
|
|
23214
|
+
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);
|
|
23185
23215
|
return createElement("Instance", {
|
|
23186
23216
|
componentName: component.name,
|
|
23187
23217
|
...Object.fromEntries(Object.entries(node.componentProperties).filter(([_, props])=>props.type === "VARIANT" || props.type === "TEXT").map(([key, props])=>[
|
|
23188
23218
|
camelCase(key.split("#")[0]),
|
|
23189
23219
|
camelCase(props.value)
|
|
23190
23220
|
]))
|
|
23191
|
-
});
|
|
23221
|
+
}, slotChildren);
|
|
23192
23222
|
}
|
|
23193
23223
|
return frameTransformer(node, traverse);
|
|
23194
23224
|
});
|
|
@@ -23478,8 +23508,22 @@ function createPipeline(options = {}) {
|
|
|
23478
23508
|
const booleanOperationTransformer = createBooleanOperationTransformer({
|
|
23479
23509
|
propsConverters
|
|
23480
23510
|
});
|
|
23511
|
+
const slotTransformer = defineElementTransformer((node, traverse)=>{
|
|
23512
|
+
const slotName = node.componentPropertyReferences?.slotContentId?.split("#")[0];
|
|
23513
|
+
const frameResult = frameTransformer({
|
|
23514
|
+
...node,
|
|
23515
|
+
type: "FRAME"
|
|
23516
|
+
}, traverse);
|
|
23517
|
+
if (!frameResult) return undefined;
|
|
23518
|
+
return createElement("Slot", {
|
|
23519
|
+
...slotName && {
|
|
23520
|
+
name: slotName
|
|
23521
|
+
}
|
|
23522
|
+
}, frameResult);
|
|
23523
|
+
});
|
|
23481
23524
|
const codegenTransformer = createCodeGenerator({
|
|
23482
23525
|
frameTransformer,
|
|
23526
|
+
slotTransformer,
|
|
23483
23527
|
textTransformer,
|
|
23484
23528
|
rectangleTransformer,
|
|
23485
23529
|
instanceTransformer,
|
|
@@ -436,7 +436,7 @@ function applyInferredLayout(parentNode, result) {
|
|
|
436
436
|
};
|
|
437
437
|
}
|
|
438
438
|
|
|
439
|
-
function createCodeGenerator({ frameTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys }) {
|
|
439
|
+
function createCodeGenerator({ frameTransformer, slotTransformer, textTransformer, rectangleTransformer, instanceTransformer, vectorTransformer, booleanOperationTransformer, shouldInferAutoLayout, skipComponentKeys }) {
|
|
440
440
|
function isSkippedInstance(node) {
|
|
441
441
|
if (!skipComponentKeys || skipComponentKeys.size === 0) return false;
|
|
442
442
|
if (node.type !== "INSTANCE") return false;
|
|
@@ -460,6 +460,8 @@ function createCodeGenerator({ frameTransformer, textTransformer, rectangleTrans
|
|
|
460
460
|
type: "COMPONENT"
|
|
461
461
|
}, (node)=>frameTransformer(node, traverse)) // NOTE: Treat component node as Frame for now
|
|
462
462
|
.with({
|
|
463
|
+
type: "SLOT"
|
|
464
|
+
}, (node)=>slotTransformer(node, traverse)).with({
|
|
463
465
|
type: "INSTANCE"
|
|
464
466
|
}, (node)=>instanceTransformer(node, traverse)).with({
|
|
465
467
|
type: "VECTOR"
|
|
@@ -565,8 +567,11 @@ function findAll(node, callback) {
|
|
|
565
567
|
function findAllInstances({ node, key }) {
|
|
566
568
|
return findAll(node, (n)=>n.type === "INSTANCE" && (n.componentKey === key || n.componentSetKey === key));
|
|
567
569
|
}
|
|
570
|
+
function findSlotNode(node, slotPropertyKey) {
|
|
571
|
+
return findOne(node, (child)=>child.type === "SLOT" && child.componentPropertyReferences?.slotContentId === slotPropertyKey);
|
|
572
|
+
}
|
|
568
573
|
function getFirstSolidFill(node) {
|
|
569
|
-
const fills = node.fills.filter((fill)=>fill.type === "SOLID"
|
|
574
|
+
const fills = node.fills.filter((fill)=>fill.type === "SOLID");
|
|
570
575
|
if (fills.length === 0) {
|
|
571
576
|
return undefined;
|
|
572
577
|
}
|
|
@@ -577,7 +582,7 @@ function getFirstFillVariable(node) {
|
|
|
577
582
|
return fill?.boundVariables?.color;
|
|
578
583
|
}
|
|
579
584
|
function getFirstStroke(node) {
|
|
580
|
-
const strokes = node.strokes?.filter((stroke)=>stroke.type === "SOLID"
|
|
585
|
+
const strokes = node.strokes?.filter((stroke)=>stroke.type === "SOLID") ?? [];
|
|
581
586
|
if (strokes.length === 0) {
|
|
582
587
|
return undefined;
|
|
583
588
|
}
|
|
@@ -7215,6 +7220,7 @@ const componentAvatar = {
|
|
|
7215
7220
|
"36",
|
|
7216
7221
|
"42",
|
|
7217
7222
|
"48",
|
|
7223
|
+
"56",
|
|
7218
7224
|
"64",
|
|
7219
7225
|
"80",
|
|
7220
7226
|
"96",
|
|
@@ -7268,6 +7274,7 @@ const componentAvatarStack = {
|
|
|
7268
7274
|
"36",
|
|
7269
7275
|
"42",
|
|
7270
7276
|
"48",
|
|
7277
|
+
"56",
|
|
7271
7278
|
"64",
|
|
7272
7279
|
"80",
|
|
7273
7280
|
"96",
|
|
@@ -7360,6 +7367,9 @@ const componentBottomSheet = {
|
|
|
7360
7367
|
"name": "componentBottomSheet",
|
|
7361
7368
|
"key": "ffe99a21452831c28bd9375aac0aaf37d7ee6a0d",
|
|
7362
7369
|
"componentPropertyDefinitions": {
|
|
7370
|
+
"Contents Slot#6752:0": {
|
|
7371
|
+
"type": "SLOT"
|
|
7372
|
+
},
|
|
7363
7373
|
"Title#19787:3": {
|
|
7364
7374
|
"type": "TEXT"
|
|
7365
7375
|
},
|
|
@@ -7375,9 +7385,6 @@ const componentBottomSheet = {
|
|
|
7375
7385
|
"Show Description#25192:0": {
|
|
7376
7386
|
"type": "BOOLEAN"
|
|
7377
7387
|
},
|
|
7378
|
-
"Contents#25320:0": {
|
|
7379
|
-
"type": "INSTANCE_SWAP"
|
|
7380
|
-
},
|
|
7381
7388
|
"Show Safe Area#25488:8": {
|
|
7382
7389
|
"type": "BOOLEAN"
|
|
7383
7390
|
},
|
|
@@ -7704,6 +7711,9 @@ const componentChlid = {
|
|
|
7704
7711
|
"name": "componentChlid",
|
|
7705
7712
|
"key": "ef79a21a39ceb4ce24b2fb93c9b430c1980a3e71",
|
|
7706
7713
|
"componentPropertyDefinitions": {
|
|
7714
|
+
"Slot#6081:0": {
|
|
7715
|
+
"type": "SLOT"
|
|
7716
|
+
},
|
|
7707
7717
|
"Type": {
|
|
7708
7718
|
"type": "VARIANT",
|
|
7709
7719
|
"variantOptions": [
|
|
@@ -9391,6 +9401,9 @@ const componentSelectBoxItemHorizontal = {
|
|
|
9391
9401
|
"name": "componentSelectBoxItemHorizontal",
|
|
9392
9402
|
"key": "8174af8ef3654dad996723883f5b84f44f791513",
|
|
9393
9403
|
"componentPropertyDefinitions": {
|
|
9404
|
+
"Content Slot#6752:6": {
|
|
9405
|
+
"type": "SLOT"
|
|
9406
|
+
},
|
|
9394
9407
|
"Title#28452:21": {
|
|
9395
9408
|
"type": "TEXT"
|
|
9396
9409
|
},
|
|
@@ -9438,6 +9451,9 @@ const componentSelectBoxItemVertical = {
|
|
|
9438
9451
|
"name": "componentSelectBoxItemVertical",
|
|
9439
9452
|
"key": "ccc88f0aae500c64e7d43be63c4f1a70baf76bfe",
|
|
9440
9453
|
"componentPropertyDefinitions": {
|
|
9454
|
+
"Content Slot#6765:0": {
|
|
9455
|
+
"type": "SLOT"
|
|
9456
|
+
},
|
|
9441
9457
|
"Title#58766:114": {
|
|
9442
9458
|
"type": "TEXT"
|
|
9443
9459
|
},
|
|
@@ -10068,11 +10084,8 @@ const createBottomSheetHandler = (_ctx)=>defineComponentHandler(componentBottomS
|
|
|
10068
10084
|
showHandle: props["Show Handle#49774:6"].value,
|
|
10069
10085
|
showCloseButton: props["Show Close Button#19787:11"].value
|
|
10070
10086
|
};
|
|
10071
|
-
const
|
|
10072
|
-
|
|
10073
|
-
key: props["Contents#25320:0"].componentKey
|
|
10074
|
-
});
|
|
10075
|
-
const bottomSheetBody = bodyNodes.length === 1 ? createLocalSnippetElement$v("BottomSheetBody", {}, bodyNodes[0].children.map(traverse)) : createLocalSnippetElement$v("BottomSheetBody", {}, createElement("div", undefined, "No content available"));
|
|
10087
|
+
const slotNode = findSlotNode(node, "Contents Slot#6752:0");
|
|
10088
|
+
const bottomSheetBody = slotNode ? createLocalSnippetElement$v("BottomSheetBody", {}, traverse(slotNode)) : createLocalSnippetElement$v("BottomSheetBody", {}, createElement("div", undefined, "No content available"));
|
|
10076
10089
|
const footerNodes = findAllInstances({
|
|
10077
10090
|
node,
|
|
10078
10091
|
// TODO: Bottom Action Bar (WIP) handler의 키. 해당 컴포넌트(템플릿) 핸들러 작성 시 handler.transform()으로 대체
|
|
@@ -11343,7 +11356,7 @@ const PREFIX_KEYS = [
|
|
|
11343
11356
|
componentSelectBoxItemPrefixCustom.key
|
|
11344
11357
|
];
|
|
11345
11358
|
const { createLocalSnippetElement: createLocalSnippetElement$7 } = createLocalSnippetHelper("select-box");
|
|
11346
|
-
const createSelectBoxHorizontalHandler = (ctx)=>defineComponentHandler(componentSelectBoxItemHorizontal.key, (node)=>{
|
|
11359
|
+
const createSelectBoxHorizontalHandler = (ctx)=>defineComponentHandler(componentSelectBoxItemHorizontal.key, (node, traverse)=>{
|
|
11347
11360
|
const { componentProperties: props } = node;
|
|
11348
11361
|
const { tag, suffix } = tsPattern.match(props.Control.value).with("Checkmark", ()=>({
|
|
11349
11362
|
tag: "CheckSelectBox",
|
|
@@ -11375,6 +11388,8 @@ const createSelectBoxHorizontalHandler = (ctx)=>defineComponentHandler(component
|
|
|
11375
11388
|
// return undefined if not icon
|
|
11376
11389
|
return undefined;
|
|
11377
11390
|
})();
|
|
11391
|
+
const contentSlotNode = props["Show Custom Content#56903:0"].value ? findSlotNode(node, "Content Slot#6752:6") : undefined;
|
|
11392
|
+
const footer = contentSlotNode ? traverse(contentSlotNode) : undefined;
|
|
11378
11393
|
const commonProps = {
|
|
11379
11394
|
// layout: "horizontal",
|
|
11380
11395
|
...prefixIcon && {
|
|
@@ -11387,8 +11402,8 @@ const createSelectBoxHorizontalHandler = (ctx)=>defineComponentHandler(component
|
|
|
11387
11402
|
...suffix && {
|
|
11388
11403
|
suffix
|
|
11389
11404
|
},
|
|
11390
|
-
...
|
|
11391
|
-
footer
|
|
11405
|
+
...footer && {
|
|
11406
|
+
footer
|
|
11392
11407
|
},
|
|
11393
11408
|
...tag === "RadioSelectBoxItem" && {
|
|
11394
11409
|
value: props["Title#28452:21"].value
|
|
@@ -11402,7 +11417,7 @@ const createSelectBoxHorizontalHandler = (ctx)=>defineComponentHandler(component
|
|
|
11402
11417
|
};
|
|
11403
11418
|
return createLocalSnippetElement$7(tag, commonProps, undefined);
|
|
11404
11419
|
});
|
|
11405
|
-
const createSelectBoxVerticalHandler = (ctx)=>defineComponentHandler(componentSelectBoxItemVertical.key, (node)=>{
|
|
11420
|
+
const createSelectBoxVerticalHandler = (ctx)=>defineComponentHandler(componentSelectBoxItemVertical.key, (node, traverse)=>{
|
|
11406
11421
|
const { componentProperties: props } = node;
|
|
11407
11422
|
const { tag, suffix } = tsPattern.match(props.Control.value).with("Checkmark", ()=>({
|
|
11408
11423
|
tag: "CheckSelectBox",
|
|
@@ -11434,6 +11449,8 @@ const createSelectBoxVerticalHandler = (ctx)=>defineComponentHandler(componentSe
|
|
|
11434
11449
|
// return undefined if not icon
|
|
11435
11450
|
return undefined;
|
|
11436
11451
|
})();
|
|
11452
|
+
const contentSlotNode = props["Show Custom Content#58766:119"].value ? findSlotNode(node, "Content Slot#6765:0") : undefined;
|
|
11453
|
+
const footer = contentSlotNode ? traverse(contentSlotNode) : undefined;
|
|
11437
11454
|
const commonProps = {
|
|
11438
11455
|
// layout: "vertical",
|
|
11439
11456
|
...prefixIcon && {
|
|
@@ -11446,8 +11463,8 @@ const createSelectBoxVerticalHandler = (ctx)=>defineComponentHandler(componentSe
|
|
|
11446
11463
|
...suffix && {
|
|
11447
11464
|
suffix
|
|
11448
11465
|
},
|
|
11449
|
-
...
|
|
11450
|
-
footer
|
|
11466
|
+
...footer && {
|
|
11467
|
+
footer
|
|
11451
11468
|
},
|
|
11452
11469
|
...tag === "RadioSelectBoxItem" && {
|
|
11453
11470
|
value: props["Title#58766:114"].value
|
|
@@ -31945,8 +31962,13 @@ function createPipeline(options = {}) {
|
|
|
31945
31962
|
});
|
|
31946
31963
|
const vectorTransformer = createVectorTransformer();
|
|
31947
31964
|
const booleanOperationTransformer = createBooleanOperationTransformer();
|
|
31965
|
+
const slotTransformer = defineElementTransformer((node, traverse)=>frameTransformer({
|
|
31966
|
+
...node,
|
|
31967
|
+
type: "FRAME"
|
|
31968
|
+
}, traverse));
|
|
31948
31969
|
const codeGenerator = createCodeGenerator({
|
|
31949
31970
|
frameTransformer,
|
|
31971
|
+
slotTransformer,
|
|
31950
31972
|
textTransformer,
|
|
31951
31973
|
rectangleTransformer,
|
|
31952
31974
|
instanceTransformer,
|
|
@@ -69,6 +69,12 @@ interface NormalizedInstanceNode extends NormalizedFrameTrait {
|
|
|
69
69
|
overrides?: FigmaRestSpec.InstanceNode["overrides"];
|
|
70
70
|
children: NormalizedSceneNode[];
|
|
71
71
|
}
|
|
72
|
+
interface NormalizedSlotNode extends NormalizedFrameTrait {
|
|
73
|
+
type: FigmaRestSpec.SlotNode["type"];
|
|
74
|
+
componentPropertyReferences?: FigmaRestSpec.IsLayerTrait["componentPropertyReferences"] & {
|
|
75
|
+
slotContentId?: string;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
72
78
|
interface NormalizedVectorNode extends NormalizedDefaultShapeTrait, NormalizedCornerTrait {
|
|
73
79
|
type: FigmaRestSpec.VectorNode["type"];
|
|
74
80
|
}
|
|
@@ -80,7 +86,7 @@ interface NormalizedUnhandledNode {
|
|
|
80
86
|
id: string;
|
|
81
87
|
original: FigmaRestSpec.Node | SceneNode;
|
|
82
88
|
}
|
|
83
|
-
type NormalizedSceneNode = NormalizedFrameNode | NormalizedRectangleNode | NormalizedTextNode | NormalizedComponentNode | NormalizedInstanceNode | NormalizedVectorNode | NormalizedBooleanOperationNode | NormalizedUnhandledNode;
|
|
89
|
+
type NormalizedSceneNode = NormalizedFrameNode | NormalizedRectangleNode | NormalizedTextNode | NormalizedComponentNode | NormalizedInstanceNode | NormalizedSlotNode | NormalizedVectorNode | NormalizedBooleanOperationNode | NormalizedUnhandledNode;
|
|
84
90
|
|
|
85
91
|
interface ElementNode {
|
|
86
92
|
__IS_JSX_ELEMENT_NODE: true;
|