From a79d671873fe909ebc5afd89bdf699bcb806867d Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Mon, 25 May 2026 10:23:19 +0300 Subject: [PATCH] fix(kiwi): preserve pattern spacing --- packages/core/src/kiwi/fig/node-change/paint.ts | 1 + packages/core/src/kiwi/fig/node-change/serialize.ts | 1 + packages/core/src/scene-graph/types.ts | 1 + tests/engine/io/fig/export/paint-schema-fields.test.ts | 2 ++ tests/engine/io/fig/import/paint-schema-fields.test.ts | 2 ++ 5 files changed, 7 insertions(+) diff --git a/packages/core/src/kiwi/fig/node-change/paint.ts b/packages/core/src/kiwi/fig/node-change/paint.ts index ac3a7fce1..14199032c 100644 --- a/packages/core/src/kiwi/fig/node-change/paint.ts +++ b/packages/core/src/kiwi/fig/node-change/paint.ts @@ -79,6 +79,7 @@ function applyImagePaintFields(fill: Fill, p: Paint): void { function applySchemaPaintFields(fill: Fill, p: Paint): void { if (p.sourceNodeId) fill.sourceNodeId = guidToString(p.sourceNodeId) + if (p.spacing) fill.spacing = p.spacing if (p.patternSpacing) fill.patternSpacing = p.patternSpacing if (p.patternTileType) fill.patternTileType = p.patternTileType as Fill['patternTileType'] if (p.verticalAlignment) fill.verticalAlignment = p.verticalAlignment as Fill['verticalAlignment'] diff --git a/packages/core/src/kiwi/fig/node-change/serialize.ts b/packages/core/src/kiwi/fig/node-change/serialize.ts index f166b7f61..df2cd6d92 100644 --- a/packages/core/src/kiwi/fig/node-change/serialize.ts +++ b/packages/core/src/kiwi/fig/node-change/serialize.ts @@ -218,6 +218,7 @@ function fillToKiwiPaint(f: SceneNode['fills'][number]): Paint { if (f.imageScaleMode) paint.imageScaleMode = f.imageScaleMode if (f.imageTransform) paint.transform = f.imageTransform if (f.sourceNodeId) paint.sourceNodeId = stringToGuid(f.sourceNodeId) + if (f.spacing) paint.spacing = f.spacing if (f.patternSpacing) paint.patternSpacing = f.patternSpacing if (f.patternTileType) paint.patternTileType = f.patternTileType if (f.verticalAlignment) paint.verticalAlignment = f.verticalAlignment diff --git a/packages/core/src/scene-graph/types.ts b/packages/core/src/scene-graph/types.ts index b3a1dc46f..2ee5b4f14 100644 --- a/packages/core/src/scene-graph/types.ts +++ b/packages/core/src/scene-graph/types.ts @@ -145,6 +145,7 @@ export interface Fill { imageScaleMode?: ImageScaleMode imageTransform?: GradientTransform sourceNodeId?: string + spacing?: number patternSpacing?: Vector patternTileType?: PatternTileType verticalAlignment?: PatternAlignment diff --git a/tests/engine/io/fig/export/paint-schema-fields.test.ts b/tests/engine/io/fig/export/paint-schema-fields.test.ts index 0760478d3..26d18760b 100644 --- a/tests/engine/io/fig/export/paint-schema-fields.test.ts +++ b/tests/engine/io/fig/export/paint-schema-fields.test.ts @@ -15,6 +15,7 @@ describe('Figma paint schema field export', () => { opacity: 0.75, visible: true, sourceNodeId: '12:34', + spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'VERTICAL_HEXAGONAL', verticalAlignment: 'CENTER', @@ -45,6 +46,7 @@ describe('Figma paint schema field export', () => { expect(fills?.[0]).toMatchObject({ type: 'PATTERN', sourceNodeId: { sessionID: 12, localID: 34 }, + spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'VERTICAL_HEXAGONAL', verticalAlignment: 'CENTER', diff --git a/tests/engine/io/fig/import/paint-schema-fields.test.ts b/tests/engine/io/fig/import/paint-schema-fields.test.ts index 8cbe9c764..5c3195d0d 100644 --- a/tests/engine/io/fig/import/paint-schema-fields.test.ts +++ b/tests/engine/io/fig/import/paint-schema-fields.test.ts @@ -18,6 +18,7 @@ describe('Figma paint schema field import', () => { opacity: 0.75, visible: true, sourceNodeId, + spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'HORIZONTAL_HEXAGONAL', verticalAlignment: 'CENTER', @@ -32,6 +33,7 @@ describe('Figma paint schema field import', () => { type: 'PATTERN', opacity: 0.75, sourceNodeId: '12:34', + spacing: 6, patternSpacing: { x: 8, y: 12 }, patternTileType: 'HORIZONTAL_HEXAGONAL', verticalAlignment: 'CENTER',