Merge pull request #595 from 0xemc/fix/create-component-drops-bound-variables

fix(figma-api): preserve variable bindings when converting a node to a component
This commit is contained in:
Danila Poyarkov 2026-09-02 01:21:27 +03:00 committed by GitHub
commit ec440d818c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 1 deletions

View file

@ -261,7 +261,9 @@ export class FigmaAPI implements NodeProxyHost {
paddingBottom: raw.paddingBottom,
paddingLeft: raw.paddingLeft,
pluginData: structuredClone(raw.pluginData),
pluginRelaunchData: structuredClone(raw.pluginRelaunchData)
pluginRelaunchData: structuredClone(raw.pluginRelaunchData),
boundVariables: { ...raw.boundVariables },
variableModes: { ...raw.variableModes }
})
for (const childId of raw.childIds) {
this.graph.cloneTree(childId, comp.id)

View file

@ -25,6 +25,27 @@ describe('createComponentFromNode', () => {
expect(api.getNodeById(frameId)).toBeNull()
})
test('preserves root variable bindings and explicit modes', () => {
const api = createAPI()
const collection = api.createVariableCollection('Radii')
const variable = api.createVariable('radius/md', 'FLOAT', collection.id, 8)
const frame = api.createFrame()
frame.name = 'Card'
frame.resize(200, 50)
frame.cornerRadius = 8
api.bindVariable(frame.id, 'cornerRadius', variable.id)
api.graph.updateNode(frame.id, {
variableModes: { [collection.id]: collection.defaultModeId }
})
const comp = api.createComponentFromNode(frame)
const raw = api.graph.getNode(comp.id)
expect(raw?.boundVariables.cornerRadius).toBe(variable.id)
expect(raw?.variableModes).toEqual({ [collection.id]: collection.defaultModeId })
})
test('preserves auto-layout HUG sizing when padding changes after conversion', () => {
const api = createAPI()
const frame = api.createFrame()