/** * 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 * }>} * `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 } }