@seed-design/figma 1.3.8 → 1.3.10

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.
@@ -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" && (!("visible" in fill) || fill.visible === true));
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" && (!("visible" in stroke) || stroke.visible === true)) ?? [];
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" && (!("visible" in fill) || fill.visible === true));
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" && (!("visible" in stroke) || stroke.visible === true)) ?? [];
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 bodyNodes = findAllInstances({
10072
- node,
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
- ...props["Show Custom Content#56903:0"].value && {
11391
- footer: createSeedReactElement("Box", undefined, "Footer Placeholder")
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
- ...props["Show Custom Content#58766:119"].value && {
11450
- footer: createSeedReactElement("Box", undefined, "Footer Placeholder")
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;