@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.
@@ -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" && (!("visible" in fill) || fill.visible === true));
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" && (!("visible" in stroke) || stroke.visible === true)) ?? [];
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,
@@ -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;