interface SetLayoutModeParams {
nodeId: string;
layoutMode: "NONE" | "HORIZONTAL" | "VERTICAL";
layoutWrap?: "NO_WRAP" | "WRAP";
}
interface SetPaddingParams {
nodeId: string;
top?: number;
right?: number;
bottom?: number;
left?: number;
}
interface SetAxisAlignParams {
nodeId: string;
primaryAxisAlignItems?: "MIN" | "CENTER" | "MAX" | "SPACE_BETWEEN";
counterAxisAlignItems?: "MIN" | "CENTER" | "MAX" | "BASELINE";
}
interface SetLayoutSizingParams {
nodeId: string;
horizontal?: "FIXED" | "HUG" | "FILL";
vertical?: "FIXED" | "HUG" | "FILL";
}
interface SetItemSpacingParams {
nodeId: string;
spacing: number;
}
/**
* Set layout mode on a frame
*/
export async function setLayoutMode(params: SetLayoutModeParams): Promise<{
id: string;
name: string;
layoutMode: string;
}> {
const { nodeId, layoutMode, layoutWrap = "NO_WRAP" } = params;
const node = await figma.getNodeByIdAsync(nodeId);
if (!node) {
throw new Error(`Node not found with ID: ${nodeId}`);
}
if (
node.type !== "FRAME" &&
node.type !== "COMPONENT" &&
node.type !== "INSTANCE"
) {
throw new Error(`Node does not support layout mode: ${nodeId}`);
}
const frame = node as FrameNode | ComponentNode | InstanceNode;
frame.layoutMode = layoutMode;
if (layoutMode !== "NONE") {
frame.layoutWrap = layoutWrap;
}
return {
id: frame.id,
name: frame.name,
layoutMode: frame.layoutMode,
};
}
/**
* Set padding on a frame
*/
export async function setPadding(params: SetPaddingParams): Promise<{
id: string;
name: string;
paddingTop: number;
paddingRight: number;
paddingBottom: number;
paddingLeft: number;
}> {
const { nodeId, top, right, bottom, left } = params;
const node = await figma.getNodeByIdAsync(nodeId);
if (!node) {
throw new Error(`Node not found with ID: ${nodeId}`);
}
if (!("paddingTop" in node)) {
throw new Error(`Node does not support padding: ${nodeId}`);
}
const frame = node as FrameNode;
if (top !== undefined) frame.paddingTop = top;
if (right !== undefined) frame.paddingRight = right;
if (bottom !== undefined) frame.paddingBottom = bottom;
if (left !== undefined) frame.paddingLeft = left;
return {
id: frame.id,
name: frame.name,
paddingTop: frame.paddingTop,
paddingRight: frame.paddingRight,
paddingBottom: frame.paddingBottom,
paddingLeft: frame.paddingLeft,
};
}
/**
* Set axis alignment on a frame
*/
export async function setAxisAlign(params: SetAxisAlignParams): Promise<{
id: string;
name: string;
primaryAxisAlignItems: string;
counterAxisAlignItems: string;
}> {
const { nodeId, primaryAxisAlignItems, counterAxisAlignItems } = params;
const node = await figma.getNodeByIdAsync(nodeId);
if (!node) {
throw new Error(`Node not found with ID: ${nodeId}`);
}
if (!("primaryAxisAlignItems" in node)) {
throw new Error(`Node does not support axis alignment: ${nodeId}`);
}
const frame = node as FrameNode;
if (primaryAxisAlignItems !== undefined) {
frame.primaryAxisAlignItems = primaryAxisAlignItems;
}
if (counterAxisAlignItems !== undefined) {
frame.counterAxisAlignItems = counterAxisAlignItems;
}
return {
id: frame.id,
name: frame.name,
primaryAxisAlignItems: frame.primaryAxisAlignItems,
counterAxisAlignItems: frame.counterAxisAlignItems,
};
}
/**
* Set layout sizing on a frame
*/
export async function setLayoutSizing(params: SetLayoutSizingParams): Promise<{
id: string;
name: string;
layoutSizingHorizontal: string;
layoutSizingVertical: string;
}> {
const { nodeId, horizontal, vertical } = params;
const node = await figma.getNodeByIdAsync(nodeId);
if (!node) {
throw new Error(`Node not found with ID: ${nodeId}`);
}
if (!("layoutSizingHorizontal" in node)) {
throw new Error(`Node does not support layout sizing: ${nodeId}`);
}
const frame = node as FrameNode;
if (horizontal !== undefined) {
frame.layoutSizingHorizontal = horizontal;
}
if (vertical !== undefined) {
frame.layoutSizingVertical = vertical;
}
return {
id: frame.id,
name: frame.name,
layoutSizingHorizontal: frame.layoutSizingHorizontal,
layoutSizingVertical: frame.layoutSizingVertical,
};
}
/**
* Set item spacing on a frame
*/
export async function setItemSpacing(params: SetItemSpacingParams): Promise<{
id: string;
name: string;
itemSpacing: number;
}> {
const { nodeId, spacing } = params;
const node = await figma.getNodeByIdAsync(nodeId);
if (!node) {
throw new Error(`Node not found with ID: ${nodeId}`);
}
if (!("itemSpacing" in node)) {
throw new Error(`Node does not support item spacing: ${nodeId}`);
}
const frame = node as FrameNode;
frame.itemSpacing = spacing;
return {
id: frame.id,
name: frame.name,
itemSpacing: frame.itemSpacing,
};
}