|
| 1 | +import assert from 'assert'; |
| 2 | +import { parseSVG } from 'svg-path-parser'; |
| 3 | + |
| 4 | +import { BooleanOperationNode, Transform } from '@figpot/src/clients/figma'; |
| 5 | +import { MappingType } from '@figpot/src/features/document'; |
| 6 | +import { transformBlend } from '@figpot/src/features/transformers/partials/transformBlend'; |
| 7 | +import { transformChildren } from '@figpot/src/features/transformers/partials/transformChildren'; |
| 8 | +import { transformDimensionAndRotationAndPosition } from '@figpot/src/features/transformers/partials/transformDimensionAndRotationAndPosition'; |
| 9 | +import { transformEffects } from '@figpot/src/features/transformers/partials/transformEffects'; |
| 10 | +import { transformFills } from '@figpot/src/features/transformers/partials/transformFills'; |
| 11 | +import { transformLayoutAttributes } from '@figpot/src/features/transformers/partials/transformLayout'; |
| 12 | +import { transformProportion } from '@figpot/src/features/transformers/partials/transformProportion'; |
| 13 | +import { transformSceneNode } from '@figpot/src/features/transformers/partials/transformSceneNode'; |
| 14 | +import { transformStrokes } from '@figpot/src/features/transformers/partials/transformStrokes'; |
| 15 | +import { translateBoolType } from '@figpot/src/features/translators/translateBoolType'; |
| 16 | +import { translateId } from '@figpot/src/features/translators/translateId'; |
| 17 | +import { translateCommands } from '@figpot/src/features/translators/vectors/translateCommands'; |
| 18 | +import { PenpotNode } from '@figpot/src/models/entities/penpot/node'; |
| 19 | +import { BoolShape } from '@figpot/src/models/entities/penpot/shapes/bool'; |
| 20 | +import { BoolContent } from '@figpot/src/models/entities/penpot/shapes/bool'; |
| 21 | + |
| 22 | +function translatePathNode(node: BooleanOperationNode, figmaNodeTransform: Transform): BoolContent[] { |
| 23 | + assert(node.fillGeometry); |
| 24 | + |
| 25 | + // TODO: this won't work for `exclude`, the Figma path of the bool operation does seems to not involves the exclusion |
| 26 | + // Meaning within the UI the preview will be a `difference` operation, if moving position or switching back and forth to another bool mode it will adjust correctly |
| 27 | + return translateCommands(node, figmaNodeTransform, parseSVG(node.fillGeometry[0].path)); |
| 28 | +} |
| 29 | + |
| 30 | +export function transformBooleanNode( |
| 31 | + registeredPageNodes: PenpotNode[], |
| 32 | + node: BooleanOperationNode, |
| 33 | + closestFigmaFrameId: string, |
| 34 | + figmaNodeTransform: Transform, |
| 35 | + mapping: MappingType |
| 36 | +): BoolShape { |
| 37 | + transformChildren(registeredPageNodes, node, closestFigmaFrameId, figmaNodeTransform, mapping); |
| 38 | + |
| 39 | + return { |
| 40 | + type: 'bool', |
| 41 | + name: node.name, |
| 42 | + shapes: node.children.map((figmaChild) => translateId(figmaChild.id, mapping)), |
| 43 | + boolContent: translatePathNode(node, figmaNodeTransform), |
| 44 | + boolType: translateBoolType(node.booleanOperation), |
| 45 | + ...transformFills(node), |
| 46 | + ...transformEffects(node, mapping), |
| 47 | + ...transformStrokes(node), |
| 48 | + ...transformDimensionAndRotationAndPosition(node, figmaNodeTransform), |
| 49 | + ...transformSceneNode(node), |
| 50 | + ...transformBlend(node), |
| 51 | + ...transformProportion(node), |
| 52 | + ...transformLayoutAttributes(node), |
| 53 | + }; |
| 54 | +} |
0 commit comments