50 lines
1.7 KiB
JavaScript
50 lines
1.7 KiB
JavaScript
/**
|
|
* createVariableCollection
|
|
*
|
|
* Creates a new Figma variable collection with the specified name and modes.
|
|
* If `modeNames` has more than one entry, the first mode is renamed from
|
|
* Figma's default "Mode 1" to the first name, and additional modes are added.
|
|
*
|
|
* Every created collection is tagged with `dsb_key` plugin data so it can be
|
|
* found and cleaned up idempotently by `cleanupOrphans`.
|
|
*
|
|
* @param {string} name - The display name of the collection (e.g. "Color", "Spacing").
|
|
* @param {string[]} modeNames - Ordered list of mode names (e.g. ["Light", "Dark"] or ["Value"]).
|
|
* @param {string} [runId] - Optional dsb_run_id to tag for cleanup.
|
|
* @returns {Promise<{
|
|
* collection: VariableCollection,
|
|
* modeIds: Record<string, string>
|
|
* }>}
|
|
* `modeIds` maps each mode name to its modeId string.
|
|
*/
|
|
async function createVariableCollection(name, modeNames, runId) {
|
|
if (!modeNames || modeNames.length === 0) {
|
|
throw new Error('createVariableCollection: modeNames must have at least one entry.')
|
|
}
|
|
|
|
// Create the collection — Figma always creates it with one mode named "Mode 1".
|
|
const collection = figma.variables.createVariableCollection(name)
|
|
|
|
// Tag for idempotent cleanup
|
|
collection.setPluginData('dsb_key', `collection/${name}`)
|
|
if (runId) {
|
|
collection.setPluginData('dsb_run_id', runId)
|
|
}
|
|
|
|
// modeIds accumulator
|
|
const modeIds = {}
|
|
|
|
// Rename the default first mode
|
|
const defaultMode = collection.modes[0]
|
|
collection.renameMode(defaultMode.modeId, modeNames[0])
|
|
modeIds[modeNames[0]] = defaultMode.modeId
|
|
|
|
// Add additional modes
|
|
for (let i = 1; i < modeNames.length; i++) {
|
|
const newModeId = collection.addMode(modeNames[i])
|
|
modeIds[modeNames[i]] = newModeId
|
|
}
|
|
|
|
return { collection, modeIds }
|
|
}
|