From 9391ac0112de5da94bc252e7b1f59322d04c885b Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Mon, 16 Mar 2026 14:17:28 +0300 Subject: [PATCH] Fix save crash when COLOR variable is missing alpha MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reuse safeColor() (which defaults a ?? 1) in the variable export path. The Kiwi schema requires all Color struct fields — variables created without explicit alpha caused 'Missing required field a'. Fixes #128 --- packages/core/src/fig-export.ts | 4 ++-- packages/core/src/kiwi-serialize.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/fig-export.ts b/packages/core/src/fig-export.ts index 7d097304e..a13f7cd50 100644 --- a/packages/core/src/fig-export.ts +++ b/packages/core/src/fig-export.ts @@ -1,7 +1,7 @@ import { zipSync, deflateSync, type Zippable } from 'fflate' import { CANVAS_BG_COLOR, IS_BROWSER, IS_TAURI } from './constants' -import { sceneNodeToKiwi, fractionalPosition, buildFigKiwi, buildFontDigestMap } from './kiwi-serialize' +import { sceneNodeToKiwi, fractionalPosition, buildFigKiwi, buildFontDigestMap, safeColor } from './kiwi-serialize' import { initCodec, getCompiledSchema, getSchemaBytes } from './kiwi/codec' import { stringToGuid } from './kiwi/kiwi-convert' import { renderThumbnail } from './render-image' @@ -34,7 +34,7 @@ function variableValueToKiwi( } if (type === 'COLOR' && typeof value === 'object' && 'r' in value) { return { - value: { colorValue: { r: value.r, g: value.g, b: value.b, a: value.a } }, + value: { colorValue: safeColor(value as { r: number; g: number; b: number; a?: number }) }, dataType: 'COLOR', resolvedDataType: 'COLOR' } diff --git a/packages/core/src/kiwi-serialize.ts b/packages/core/src/kiwi-serialize.ts index bdc2739e9..77f33a500 100644 --- a/packages/core/src/kiwi-serialize.ts +++ b/packages/core/src/kiwi-serialize.ts @@ -251,7 +251,7 @@ function exportTextData(node: SceneNode): NodeChange['textData'] { } } -function safeColor(c: { r: number; g: number; b: number; a?: number }): Color { +export function safeColor(c: { r: number; g: number; b: number; a?: number }): Color { return { r: c.r, g: c.g, b: c.b, a: c.a ?? 1 } }