From 2fd28fbbc5c0243c6d5ff25fe5747dd01f7766c8 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Mon, 18 May 2026 01:23:35 +0300 Subject: [PATCH] fix(fig): apply derived glyph override patches --- .../derived-symbol-data/layout.ts | 7 +++++-- .../core/src/kiwi/instance-overrides/types.ts | 1 + packages/core/src/kiwi/node-change/convert.ts | 18 ++---------------- .../kiwi/node-change/derived-text-glyphs.ts | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 packages/core/src/kiwi/node-change/derived-text-glyphs.ts diff --git a/packages/core/src/kiwi/instance-overrides/derived-symbol-data/layout.ts b/packages/core/src/kiwi/instance-overrides/derived-symbol-data/layout.ts index 96c0acb52..b388db816 100644 --- a/packages/core/src/kiwi/instance-overrides/derived-symbol-data/layout.ts +++ b/packages/core/src/kiwi/instance-overrides/derived-symbol-data/layout.ts @@ -1,4 +1,5 @@ import { convertLetterSpacing, convertLineHeight } from '#core/kiwi/node-change/convert' +import { convertFigmaDerivedTextGlyphs } from '#core/kiwi/node-change/derived-text-glyphs' import type { DerivedSymbolOverride, OverrideContext } from '#core/kiwi/instance-overrides/types' import type { SceneNode } from '#core/scene-graph' @@ -26,11 +27,13 @@ function resolveSizeOnlyPosition( return withinParent ? { x: source.x, y: source.y } : { x: 0, y: 0 } } -function buildDsdTextUpdates(d: DerivedSymbolOverride): Partial { +function buildDsdTextUpdates(d: DerivedSymbolOverride, blobs: Uint8Array[]): Partial { const updates: Partial = {} if (d.fontSize !== undefined) updates.fontSize = d.fontSize if (d.lineHeight !== undefined) updates.lineHeight = convertLineHeight(d.lineHeight, d.fontSize) if (d.letterSpacing !== undefined) updates.letterSpacing = convertLetterSpacing(d.letterSpacing, d.fontSize) + const figmaDerivedTextGlyphs = convertFigmaDerivedTextGlyphs(d.derivedTextData, blobs) + if (figmaDerivedTextGlyphs.length > 0) updates.figmaDerivedTextGlyphs = figmaDerivedTextGlyphs return updates } @@ -40,7 +43,7 @@ export function buildDsdLayoutUpdates( d: DerivedSymbolOverride, target: SceneNode ): { updates: Partial; hasSize: boolean } { - const updates: Partial = buildDsdTextUpdates(d) + const updates: Partial = buildDsdTextUpdates(d, ctx.blobs) const figmaDerivedLayout: NonNullable = {} if (d.size) { diff --git a/packages/core/src/kiwi/instance-overrides/types.ts b/packages/core/src/kiwi/instance-overrides/types.ts index a8741c0ad..c972ce322 100644 --- a/packages/core/src/kiwi/instance-overrides/types.ts +++ b/packages/core/src/kiwi/instance-overrides/types.ts @@ -50,6 +50,7 @@ export interface DerivedSymbolOverride { fontSize?: number lineHeight?: NodeChange['lineHeight'] letterSpacing?: NodeChange['letterSpacing'] + derivedTextData?: NodeChange['derivedTextData'] fillGeometry?: Array<{ windingRule?: string; commandsBlob?: number }> strokeGeometry?: Array<{ windingRule?: string; commandsBlob?: number }> } diff --git a/packages/core/src/kiwi/node-change/convert.ts b/packages/core/src/kiwi/node-change/convert.ts index 0e8d715dc..c204b57c9 100644 --- a/packages/core/src/kiwi/node-change/convert.ts +++ b/packages/core/src/kiwi/node-change/convert.ts @@ -7,6 +7,7 @@ import { guidToString } from './guid' import { convertEffects, convertFills, convertStrokes } from './paint' import { importStyleRuns } from './style-runs' export { importStyleRuns } from './style-runs' +import { convertFigmaDerivedTextGlyphs } from './derived-text-glyphs' import { convertLetterSpacing, convertLineHeight, mapTextDecoration } from './text-values' export { convertEffects, convertFills, convertStrokes, setVariableColorResolver } from './paint' export { convertLetterSpacing, convertLineHeight, mapTextDecoration } from './text-values' @@ -258,21 +259,6 @@ function importedTextLineHeight(nc: NodeChange): number | null { return convertLineHeight(nc.lineHeight, nc.fontSize) } -function convertFigmaDerivedTextGlyphs(nc: NodeChange, blobs: Uint8Array[]) { - return (nc.derivedTextData?.glyphs ?? []) - .map((glyph) => { - const blob = glyph.commandsBlob === undefined ? undefined : blobs[glyph.commandsBlob] - if (!blob) return null - return { - commandsBlob: blob, - x: glyph.position.x, - y: glyph.position.y, - fontSize: glyph.fontSize - } - }) - .filter((glyph): glyph is NonNullable => !!glyph) -} - function convertTextProps( nc: NodeChange, blobs: Uint8Array[] @@ -320,7 +306,7 @@ function convertTextProps( (getOpenPencilPluginValue(nc, TEXT_DIRECTION_PLUGIN_KEY) as | SceneNode['textDirection'] | null) || 'AUTO', - figmaDerivedTextGlyphs: convertFigmaDerivedTextGlyphs(nc, blobs) + figmaDerivedTextGlyphs: convertFigmaDerivedTextGlyphs(nc.derivedTextData, blobs) } } diff --git a/packages/core/src/kiwi/node-change/derived-text-glyphs.ts b/packages/core/src/kiwi/node-change/derived-text-glyphs.ts new file mode 100644 index 000000000..54d60abd3 --- /dev/null +++ b/packages/core/src/kiwi/node-change/derived-text-glyphs.ts @@ -0,0 +1,19 @@ +import type { NodeChange } from '#core/kiwi/binary/codec' +import type { FigmaDerivedTextGlyph } from '#core/scene-graph' + +export function convertFigmaDerivedTextGlyphs( + derivedTextData: NodeChange['derivedTextData'], + blobs: Uint8Array[] +): FigmaDerivedTextGlyph[] { + return (derivedTextData?.glyphs ?? []) + .map((glyph) => { + if (glyph.commandsBlob === undefined) return null + return { + commandsBlob: blobs[glyph.commandsBlob], + x: glyph.position.x, + y: glyph.position.y, + fontSize: glyph.fontSize + } + }) + .filter((glyph): glyph is NonNullable => !!glyph) +}