figma-generate-design

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Build / Update Screens from Design System

从设计系统构建/更新屏幕

Use this skill to create or update full-page screens in Figma by reusing the published design system — components, variables, and styles — rather than drawing primitives with hardcoded values. The key insight: the Figma file likely has a published design system with components, color/spacing variables, and text/effect styles that correspond to the codebase's UI components and tokens. Find and use those instead of drawing boxes with hex colors.
MANDATORY: You MUST also load figma-use before any
use_figma
call. That skill contains critical rules (color ranges, font loading, etc.) that apply to every script you write.
Always pass
skillNames: "figma-generate-design"
when calling
use_figma
as part of this skill.
This is a logging parameter — it does not affect execution.
使用此技能通过复用已发布的设计系统(组件、变量和样式)在Figma中创建或更新全屏屏幕,而非使用硬编码值绘制基础元素。核心要点:Figma文件中可能存在已发布的设计系统,其中的组件、颜色/间距变量以及文本/效果样式与代码库的UI组件和令牌相对应。请查找并使用这些资源,而非手动绘制带十六进制颜色的框。
强制要求:在调用任何
use_figma
之前,必须先加载figma-use。该技能包含适用于所有脚本的关键规则(如颜色范围、字体加载等)。
调用
use_figma
时,请始终传入
skillNames: "figma-generate-design"
。这是一个日志参数,不影响执行。

Skill Boundaries

技能边界

  • Use this skill when the deliverable is a Figma screen (new or updated) composed of design system component instances.
  • If the user wants to generate code from a Figma design, switch to figma-implement-design.
  • If the user wants to create new reusable components or variants, use figma-use directly.
  • If the user wants to write Code Connect mappings, switch to figma-code-connect-components.
  • 当交付物是由设计系统组件实例组成的Figma屏幕(新建或更新)时,使用此技能。
  • 如果用户希望从Figma设计生成代码,请切换到figma-implement-design
  • 如果用户希望创建新的可复用组件或变体,请直接使用figma-use
  • 如果用户希望编写Code Connect映射,请切换到figma-code-connect-components

Prerequisites

前置条件

  • Figma MCP server must be connected
  • The target Figma file must have a published design system with components (or access to a team library)
  • User should provide either:
    • A Figma file URL / file key to work in
    • Or context about which file to target (the agent can discover pages)
  • Source code or description of the screen to build/update
  • 必须已连接Figma MCP服务器
  • 目标Figma文件必须包含已发布的设计系统组件(或可访问团队库)
  • 用户需提供以下任一信息:
    • 要操作的Figma文件URL/文件密钥
    • 或关于目标文件的上下文信息(Agent可自动发现页面)
  • 要构建/更新的屏幕的源代码或描述

Parallel Workflow with generate_figma_design (Web Apps Only)

与generate_figma_design的并行工作流(仅适用于Web应用)

When building a screen from a web app that can be rendered in a browser, the best results come from running both approaches in parallel:
  1. In parallel:
    • Start building the screen using this skill's workflow (use_figma + design system components)
    • Run
      generate_figma_design
      to capture a pixel-perfect screenshot of the running web app
  2. Once both complete: Update the use_figma output to match the pixel-perfect layout from the
    generate_figma_design
    capture. The capture provides the exact spacing, sizing, and visual treatment to aim for, while your use_figma output has proper component instances linked to the design system.
  3. Once confirmed looking good: Delete the
    generate_figma_design
    output — it was only used as a visual reference.
This combines the best of both:
generate_figma_design
gives pixel-perfect layout accuracy, while use_figma gives proper design system component instances that stay linked and updatable.
This workflow only applies to web apps where
generate_figma_design
can capture the running page. For non-web apps (iOS, Android, etc.) or when updating existing screens, use the standard workflow below.
当从可在浏览器中渲染的Web应用构建屏幕时,最佳结果来自并行运行两种方法:
  1. 并行执行:
    • 使用此技能的工作流开始构建屏幕(use_figma + 设计系统组件)
    • 运行
      generate_figma_design
      捕获运行中Web应用的像素级精确截图
  2. 两者完成后: 更新use_figma的输出,使其与
    generate_figma_design
    捕获的像素级精确布局匹配。截图提供了目标布局的精确间距、尺寸和视觉样式,而use_figma输出则包含与设计系统关联的标准组件实例。
  3. 确认效果无误后: 删除
    generate_figma_design
    的输出——它仅用作视觉参考。
这种方式结合了两者的优势:
generate_figma_design
提供像素级精确的布局精度,而use_figma提供与设计系统关联的可更新组件实例。
此工作流仅适用于
generate_figma_design
可捕获运行页面的Web应用
。对于非Web应用(iOS、Android等)或更新现有屏幕的场景,请使用下方的标准工作流。

Required Workflow

必选工作流

Follow these steps in order. Do not skip steps.
请按顺序执行以下步骤,请勿跳过。

Step 1: Understand the Screen

步骤1:理解屏幕需求

Before touching Figma, understand what you're building:
  1. If building from code, read the relevant source files to understand the page structure, sections, and which components are used.
  2. Identify the major sections of the screen (e.g., Header, Hero, Content Panels, Pricing Grid, FAQ Accordion, Footer).
  3. For each section, list the UI components involved (buttons, inputs, cards, navigation pills, accordions, etc.).
在操作Figma之前,先明确要构建的内容:
  1. 如果从代码构建,请阅读相关源文件,了解页面结构、各部分组成及使用的组件。
  2. 识别屏幕的主要部分(例如:Header、Hero、内容面板、定价网格、FAQ折叠面板、Footer)。
  3. 为每个部分列出涉及的UI组件(按钮、输入框、卡片、导航胶囊、折叠面板等)。

Step 2: Discover Design System — Components, Variables, and Styles

步骤2:发现设计系统——组件、变量和样式

You need three things from the design system: components (buttons, cards, etc.), variables (colors, spacing, radii), and styles (text styles, effect styles like shadows). Don't hardcode hex colors or pixel values when design system tokens exist.
你需要从设计系统中获取三样东西:组件(按钮、卡片等)、变量(颜色、间距、圆角)和样式(文本样式、阴影等效果样式)。当存在设计系统令牌时,请勿硬编码十六进制颜色或像素值。

2a: Discover components

2a:发现组件

Preferred: inspect existing screens first. If the target file already contains screens using the same design system, skip
search_design_system
and inspect existing instances directly. A single
use_figma
call that walks an existing frame's instances gives you an exact, authoritative component map:
js
const frame = figma.currentPage.findOne(n => n.name === "Existing Screen");
const uniqueSets = new Map();
frame.findAll(n => n.type === "INSTANCE").forEach(inst => {
  const mc = inst.mainComponent;
  const cs = mc?.parent?.type === "COMPONENT_SET" ? mc.parent : null;
  const key = cs ? cs.key : mc?.key;
  const name = cs ? cs.name : mc?.name;
  if (key && !uniqueSets.has(key)) {
    uniqueSets.set(key, { name, key, isSet: !!cs, sampleVariant: mc.name });
  }
});
return [...uniqueSets.values()];
Only fall back to
search_design_system
when the file has no existing screens to reference. When using it, search broadly — try multiple terms and synonyms (e.g., "button", "input", "nav", "card", "accordion", "header", "footer", "tag", "avatar", "toggle", "icon", etc.). Use
includeComponents: true
to focus on components.
Include component properties in your map — you need to know which TEXT properties each component exposes for text overrides. Create a temporary instance, read its
componentProperties
(and those of nested instances), then remove the temp instance.
Example component map with property info:
Component Map:
- Button → key: "abc123", type: COMPONENT_SET
  Properties: { "Label#2:0": TEXT, "Has Icon#4:64": BOOLEAN }
- PricingCard → key: "ghi789", type: COMPONENT_SET
  Properties: { "Device": VARIANT, "Variant": VARIANT }
  Nested "Text Heading" has: { "Text#2104:5": TEXT }
  Nested "Button" has: { "Label#2:0": TEXT }
首选方式:先检查现有屏幕。如果目标文件中已有使用同一设计系统的屏幕,请跳过
search_design_system
,直接检查现有组件实例。通过一次
use_figma
调用遍历现有框架的实例,即可获得精确的权威组件映射:
js
const frame = figma.currentPage.findOne(n => n.name === "Existing Screen");
const uniqueSets = new Map();
frame.findAll(n => n.type === "INSTANCE").forEach(inst => {
  const mc = inst.mainComponent;
  const cs = mc?.parent?.type === "COMPONENT_SET" ? mc.parent : null;
  const key = cs ? cs.key : mc?.key;
  const name = cs ? cs.name : mc?.name;
  if (key && !uniqueSets.has(key)) {
    uniqueSets.set(key, { name, key, isSet: !!cs, sampleVariant: mc.name });
  }
});
return [...uniqueSets.values()];
仅当文件中没有可参考的现有屏幕时,才使用
search_design_system
作为备选。使用时,请广泛搜索——尝试多个术语和同义词(例如:"button"、"input"、"nav"、"card"、"accordion"、"header"、"footer"、"tag"、"avatar"、"toggle"、"icon"等)。设置
includeComponents: true
以聚焦组件。
在映射中包含组件属性——你需要知道每个组件暴露了哪些TEXT属性用于文本覆盖。创建一个临时实例,读取其
componentProperties
(以及嵌套实例的属性),然后删除该临时实例。
包含属性信息的组件映射示例:
Component Map:
- Button → key: "abc123", type: COMPONENT_SET
  Properties: { "Label#2:0": TEXT, "Has Icon#4:64": BOOLEAN }
- PricingCard → key: "ghi789", type: COMPONENT_SET
  Properties: { "Device": VARIANT, "Variant": VARIANT }
  Nested "Text Heading" has: { "Text#2104:5": TEXT }
  Nested "Button" has: { "Label#2:0": TEXT }

2b: Discover variables (colors, spacing, radii)

2b:发现变量(颜色、间距、圆角)

Inspect existing screens first (same as components). Or use
search_design_system
with
includeVariables: true
.
WARNING: Two different variable discovery methods — do not confuse them.
  • use_figma
    with
    figma.variables.getLocalVariableCollectionsAsync()
    — returns only local variables defined in the current file. If this returns empty, it does not mean no variables exist. Remote/published library variables are invisible to this API.
  • search_design_system
    with
    includeVariables: true
    — searches across all linked libraries, including remote and published ones. This is the correct tool for discovering design system variables.
Never conclude "no variables exist" based solely on
getLocalVariableCollectionsAsync()
returning empty.
Always also run
search_design_system
with
includeVariables: true
to check for library variables before deciding to create your own.
Query strategy:
search_design_system
matches against variable names (e.g., "Gray/gray-9", "core/gray/100", "space/400"), not categories. Run multiple short, simple queries in parallel rather than one compound query:
  • Primitive colors: "gray", "red", "blue", "green", "white", "brand"
  • Semantic colors: "background", "foreground", "border", "surface", "text"
  • Spacing/sizing: "space", "radius", "gap", "padding"
If initial searches return empty, try shorter fragments or different naming conventions — libraries vary widely ("grey" vs "gray", "spacing" vs "space", "color/bg" vs "background").
Inspect an existing screen's bound variables for the most authoritative results:
js
const frame = figma.currentPage.findOne(n => n.name === "Existing Screen");
const varMap = new Map();
frame.findAll(() => true).forEach(node => {
  const bv = node.boundVariables;
  if (!bv) return;
  for (const [prop, binding] of Object.entries(bv)) {
    const bindings = Array.isArray(binding) ? binding : [binding];
    for (const b of bindings) {
      if (b?.id && !varMap.has(b.id)) {
        const v = await figma.variables.getVariableByIdAsync(b.id);
        if (v) varMap.set(b.id, { name: v.name, id: v.id, key: v.key, type: v.resolvedType, remote: v.remote });
      }
    }
  }
});
return [...varMap.values()];
For library variables (remote = true), import them by key with
figma.variables.importVariableByKeyAsync(key)
. For local variables, use
figma.variables.getVariableByIdAsync(id)
directly.
See variable-patterns.md for binding patterns.
首选方式:先检查现有屏幕(与组件发现方式相同)。或使用
search_design_system
并设置
includeVariables: true
注意:两种变量发现方法不同,请勿混淆。
  • use_figma
    搭配
    figma.variables.getLocalVariableCollectionsAsync()
    ——仅返回当前文件中定义的本地变量。如果返回空,不代表不存在变量。远程/已发布的库变量对此API不可见。
  • search_design_system
    搭配
    includeVariables: true
    ——搜索所有关联库,包括远程和已发布的库。这是发现设计系统变量的正确工具。
请勿仅根据
getLocalVariableCollectionsAsync()
返回空就判定“不存在变量”
。在决定创建新变量之前,请务必同时运行
search_design_system
并设置
includeVariables: true
以检查库变量。
查询策略:
search_design_system
匹配变量名称(例如:"Gray/gray-9"、"core/gray/100"、"space/400"),而非分类。请并行运行多个简短的简单查询,而非单个复合查询:
  • 基础颜色: "gray"、"red"、"blue"、"green"、"white"、"brand"
  • 语义颜色: "background"、"foreground"、"border"、"surface"、"text"
  • 间距/尺寸: "space"、"radius"、"gap"、"padding"
如果初始搜索返回空,请尝试更短的片段或不同的命名规范——各库的命名差异很大(例如"grey" vs "gray"、"spacing" vs "space"、"color/bg" vs "background")。
检查现有屏幕的绑定变量可获得最权威的结果:
js
const frame = figma.currentPage.findOne(n => n.name === "Existing Screen");
const varMap = new Map();
frame.findAll(() => true).forEach(node => {
  const bv = node.boundVariables;
  if (!bv) return;
  for (const [prop, binding] of Object.entries(bv)) {
    const bindings = Array.isArray(binding) ? binding : [binding];
    for (const b of bindings) {
      if (b?.id && !varMap.has(b.id)) {
        const v = await figma.variables.getVariableByIdAsync(b.id);
        if (v) varMap.set(b.id, { name: v.name, id: v.id, key: v.key, type: v.resolvedType, remote: v.remote });
      }
    }
  }
});
return [...varMap.values()];
对于库变量(remote = true),通过密钥使用
figma.variables.importVariableByKeyAsync(key)
导入。对于本地变量,直接使用
figma.variables.getVariableByIdAsync(id)
有关绑定模式,请参阅variable-patterns.md

2c: Discover styles (text styles, effect styles)

2c:发现样式(文本样式、效果样式)

Search for styles using
search_design_system
with
includeStyles: true
and terms like "heading", "body", "shadow", "elevation". Or inspect what an existing screen uses:
js
const frame = figma.currentPage.findOne(n => n.name === "Existing Screen");
const styles = { text: new Map(), effect: new Map() };
frame.findAll(() => true).forEach(node => {
  if ('textStyleId' in node && node.textStyleId) {
    const s = figma.getStyleById(node.textStyleId);
    if (s) styles.text.set(s.id, { name: s.name, id: s.id, key: s.key });
  }
  if ('effectStyleId' in node && node.effectStyleId) {
    const s = figma.getStyleById(node.effectStyleId);
    if (s) styles.effect.set(s.id, { name: s.name, id: s.id, key: s.key });
  }
});
return {
  textStyles: [...styles.text.values()],
  effectStyles: [...styles.effect.values()]
};
Import library styles with
figma.importStyleByKeyAsync(key)
, then apply with
node.textStyleId = style.id
or
node.effectStyleId = style.id
.
See text-style-patterns.md and effect-style-patterns.md for details.
使用
search_design_system
并设置
includeStyles: true
,搭配"heading"、"body"、"shadow"、"elevation"等术语搜索样式。或检查现有屏幕使用的样式:
js
const frame = figma.currentPage.findOne(n => n.name === "Existing Screen");
const styles = { text: new Map(), effect: new Map() };
frame.findAll(() => true).forEach(node => {
  if ('textStyleId' in node && node.textStyleId) {
    const s = figma.getStyleById(node.textStyleId);
    if (s) styles.text.set(s.id, { name: s.name, id: s.id, key: s.key });
  }
  if ('effectStyleId' in node && node.effectStyleId) {
    const s = figma.getStyleById(node.effectStyleId);
    if (s) styles.effect.set(s.id, { name: s.name, id: s.id, key: s.key });
  }
});
return {
  textStyles: [...styles.text.values()],
  effectStyles: [...styles.effect.values()]
};
使用
figma.importStyleByKeyAsync(key)
导入库样式,然后通过
node.textStyleId = style.id
node.effectStyleId = style.id
应用样式。
有关详细信息,请参阅text-style-patterns.mdeffect-style-patterns.md

Step 3: Create the Page Wrapper Frame First

步骤3:先创建页面容器框架

Do NOT build sections as top-level page children and reparent them later — moving nodes across
use_figma
calls with
appendChild()
silently fails and produces orphaned frames. Instead, create the wrapper first, then build each section directly inside it.
Create the page wrapper in its own
use_figma
call. Position it away from existing content and return its ID:
js
// Find clear space
let maxX = 0;
for (const child of figma.currentPage.children) {
  maxX = Math.max(maxX, child.x + child.width);
}

const wrapper = figma.createFrame();
wrapper.name = "Homepage";
wrapper.layoutMode = "VERTICAL";
wrapper.primaryAxisAlignItems = "CENTER";
wrapper.counterAxisAlignItems = "CENTER";
wrapper.resize(1440, 100);
wrapper.layoutSizingHorizontal = "FIXED";
wrapper.layoutSizingVertical = "HUG";
wrapper.x = maxX + 200;
wrapper.y = 0;

return { success: true, wrapperId: wrapper.id };
请勿先将各部分作为页面顶级子元素构建,之后再重新父化——在
use_figma
调用之间使用
appendChild()
移动节点会静默失败,导致框架成为孤立节点。请先创建容器,然后直接在容器内构建每个部分。
在单独的
use_figma
调用中创建页面容器。将其放置在远离现有内容的位置,并返回其ID:
js
// 寻找空白区域
let maxX = 0;
for (const child of figma.currentPage.children) {
  maxX = Math.max(maxX, child.x + child.width);
}

const wrapper = figma.createFrame();
wrapper.name = "Homepage";
wrapper.layoutMode = "VERTICAL";
wrapper.primaryAxisAlignItems = "CENTER";
wrapper.counterAxisAlignItems = "CENTER";
wrapper.resize(1440, 100);
wrapper.layoutSizingHorizontal = "FIXED";
wrapper.layoutSizingVertical = "HUG";
wrapper.x = maxX + 200;
wrapper.y = 0;

return { success: true, wrapperId: wrapper.id };

Step 4: Build Each Section Inside the Wrapper

步骤4:在容器内逐个构建各部分

This is the most important step. Build one section at a time, each in its own
use_figma
call. At the start of each script, fetch the wrapper by ID and append new content directly to it.
js
const createdNodeIds = [];
const wrapper = await figma.getNodeByIdAsync("WRAPPER_ID_FROM_STEP_3");

// Import design system components by key
const buttonSet = await figma.importComponentSetByKeyAsync("BUTTON_SET_KEY");
const primaryButton = buttonSet.children.find(c =>
  c.type === "COMPONENT" && c.name.includes("variant=primary")
) || buttonSet.defaultVariant;

// Import design system variables for colors and spacing
const bgColorVar = await figma.variables.importVariableByKeyAsync("BG_COLOR_VAR_KEY");
const spacingVar = await figma.variables.importVariableByKeyAsync("SPACING_VAR_KEY");

// Build section frame with variable bindings (not hardcoded values)
const section = figma.createFrame();
section.name = "Header";
section.layoutMode = "HORIZONTAL";
section.setBoundVariable("paddingLeft", spacingVar);
section.setBoundVariable("paddingRight", spacingVar);
const bgPaint = figma.variables.setBoundVariableForPaint(
  { type: 'SOLID', color: { r: 0, g: 0, b: 0 } }, 'color', bgColorVar
);
section.fills = [bgPaint];

// Import and apply text/effect styles
const shadowStyle = await figma.importStyleByKeyAsync("SHADOW_STYLE_KEY");
section.effectStyleId = shadowStyle.id;

// Create component instances inside the section
const btnInstance = primaryButton.createInstance();
section.appendChild(btnInstance);
createdNodeIds.push(btnInstance.id);

// Append section to wrapper
wrapper.appendChild(section);
section.layoutSizingHorizontal = "FILL"; // AFTER appending

createdNodeIds.push(section.id);
return { success: true, createdNodeIds };
After each section, validate with
get_screenshot
before moving on. Look closely for cropped/clipped text (line heights cutting off content) and overlapping elements — these are the most common issues and easy to miss at a glance.
这是最重要的步骤。一次构建一个部分,每个部分使用单独的
use_figma
调用。在每个脚本开始时,通过ID获取容器,然后将新内容直接追加到其中。
js
const createdNodeIds = [];
const wrapper = await figma.getNodeByIdAsync("WRAPPER_ID_FROM_STEP_3");

// 通过密钥导入设计系统组件
const buttonSet = await figma.importComponentSetByKeyAsync("BUTTON_SET_KEY");
const primaryButton = buttonSet.children.find(c =>
  c.type === "COMPONENT" && c.name.includes("variant=primary")
) || buttonSet.defaultVariant;

// 导入用于颜色和间距的设计系统变量
const bgColorVar = await figma.variables.importVariableByKeyAsync("BG_COLOR_VAR_KEY");
const spacingVar = await figma.variables.importVariableByKeyAsync("SPACING_VAR_KEY");

// 使用变量绑定(而非硬编码值)构建部分框架
const section = figma.createFrame();
section.name = "Header";
section.layoutMode = "HORIZONTAL";
section.setBoundVariable("paddingLeft", spacingVar);
section.setBoundVariable("paddingRight", spacingVar);
const bgPaint = figma.variables.setBoundVariableForPaint(
  { type: 'SOLID', color: { r: 0, g: 0, b: 0 } }, 'color', bgColorVar
);
section.fills = [bgPaint];

// 导入并应用文本/效果样式
const shadowStyle = await figma.importStyleByKeyAsync("SHADOW_STYLE_KEY");
section.effectStyleId = shadowStyle.id;

// 在部分内创建组件实例
const btnInstance = primaryButton.createInstance();
section.appendChild(btnInstance);
createdNodeIds.push(btnInstance.id);

// 将部分追加到容器
wrapper.appendChild(section);
section.layoutSizingHorizontal = "FILL"; // 追加后设置

createdNodeIds.push(section.id);
return { success: true, createdNodeIds };
每个部分构建完成后,调用
get_screenshot
验证,再进行下一步。请仔细检查是否有文本被裁剪(行高截断内容)和元素重叠——这些是最常见的问题,容易被忽略。

Override instance text with setProperties()

使用setProperties()覆盖实例文本

Component instances ship with placeholder text ("Title", "Heading", "Button"). Use the component property keys you discovered in Step 2 to override them with
setProperties()
— this is more reliable than direct
node.characters
manipulation. See component-patterns.md for the full pattern.
For nested instances that expose their own TEXT properties, call
setProperties()
on the nested instance:
js
const nestedHeading = cardInstance.findOne(n => n.type === "INSTANCE" && n.name === "Text Heading");
if (nestedHeading) {
  nestedHeading.setProperties({ "Text#2104:5": "Actual heading from source code" });
}
Only fall back to direct
node.characters
for text that is NOT managed by any component property.
组件实例默认带有占位文本("Title"、"Heading"、"Button")。使用步骤2中发现的组件属性密钥,通过
setProperties()
覆盖文本——这比直接操作
node.characters
更可靠。有关完整模式,请参阅component-patterns.md
对于暴露自身TEXT属性的嵌套实例,请在嵌套实例上调用
setProperties()
js
const nestedHeading = cardInstance.findOne(n => n.type === "INSTANCE" && n.name === "Text Heading");
if (nestedHeading) {
  nestedHeading.setProperties({ "Text#2104:5": "来自源代码的实际标题" });
}
仅当文本不受任何组件属性管理时,才使用直接操作
node.characters
的备选方案。

Read source code defaults carefully

仔细阅读源代码默认值

When translating code components to Figma instances, check the component's default prop values in the source code, not just what's explicitly passed. For example,
<Button size="small">Register</Button>
with no variant prop — check the component definition to find
variant = "primary"
as the default. Selecting the wrong variant (e.g., Neutral instead of Primary) produces a visually incorrect result that's easy to miss.
将代码组件转换为Figma实例时,请检查源代码中组件的默认属性值,而非仅关注显式传递的属性。例如,
<Button size="small">Register</Button>
没有传递variant属性——请检查组件定义,确认
variant = "primary"
是否为默认值。选择错误的变体(例如Neutral而非Primary按钮)会导致视觉效果错误,且容易被忽略。

What to build manually vs. import from design system

手动构建与从设计系统导入的区分

Build manuallyImport from design system
Page wrapper frameComponents: buttons, cards, inputs, nav, etc.
Section container framesVariables: colors (fills, strokes), spacing (padding, gap), radii
Layout grids (rows, columns)Text styles: heading, body, caption, etc.
Effect styles: shadows, blurs, etc.
Never hardcode hex colors or pixel spacing when a design system variable exists. Use
setBoundVariable
for spacing/radii and
setBoundVariableForPaint
for colors. Apply text styles with
node.textStyleId
and effect styles with
node.effectStyleId
.
手动构建从设计系统导入
页面容器框架组件:按钮、卡片、输入框、导航等
部分容器框架变量:颜色(填充、描边)、间距(内边距、间隙)、圆角
布局网格(行、列)文本样式:标题、正文、说明文字等
效果样式:阴影、模糊等
当存在设计系统变量时,请勿硬编码十六进制颜色或像素间距。使用
setBoundVariable
设置间距/圆角,使用
setBoundVariableForPaint
设置颜色。通过
node.textStyleId
应用文本样式,通过
node.effectStyleId
应用效果样式。

Step 5: Validate the Full Screen

步骤5:验证完整屏幕

After composing all sections, call
get_screenshot
on the full page frame and compare against the source. Fix any issues with targeted
use_figma
calls — don't rebuild the entire screen.
Screenshot individual sections, not just the full page. A full-page screenshot at reduced resolution hides text truncation, wrong colors, and placeholder text that hasn't been overridden. Take a screenshot of each section by node ID to catch:
  • Cropped/clipped text — line heights or frame sizing cutting off descenders, ascenders, or entire lines
  • Overlapping content — elements stacking on top of each other due to incorrect sizing or missing auto-layout
  • Placeholder text still showing ("Title", "Heading", "Button")
  • Truncated content from layout sizing bugs
  • Wrong component variants (e.g., Neutral vs Primary button)
所有部分组装完成后,对整个页面框架调用
get_screenshot
,并与源内容对比。通过针对性的
use_figma
调用修复问题——无需重建整个屏幕。
请对每个部分单独截图,而非仅对完整页面截图。低分辨率的完整页面截图会隐藏文本截断、颜色错误和未覆盖的占位文本。通过节点ID对每个部分截图,以发现以下问题:
  • 文本被裁剪——行高或框架尺寸截断了下行字母、上行字母或整行文本
  • 内容重叠——由于尺寸错误或缺少自动布局,元素堆叠在一起
  • 仍显示占位文本("Title"、"Heading"、"Button")
  • 布局尺寸错误导致内容截断
  • 组件变体错误(例如Neutral按钮而非Primary按钮)

Step 6: Updating an Existing Screen

步骤6:更新现有屏幕

When updating rather than creating from scratch:
  1. Use
    get_metadata
    to inspect the existing screen structure.
  2. Identify which sections need updating and which can stay.
  3. For each section that needs changes:
    • Locate the existing nodes by ID or name
    • Swap component instances if the design system component changed
    • Update text content, variant properties, or layout as needed
    • Remove deprecated sections
    • Add new sections
  4. Validate with
    get_screenshot
    after each modification.
js
// Example: Swap a button variant in an existing screen
const existingButton = await figma.getNodeByIdAsync("EXISTING_BUTTON_INSTANCE_ID");
if (existingButton && existingButton.type === "INSTANCE") {
  // Import the updated component
  const buttonSet = await figma.importComponentSetByKeyAsync("BUTTON_SET_KEY");
  const newVariant = buttonSet.children.find(c =>
    c.name.includes("variant=primary") && c.name.includes("size=lg")
  ) || buttonSet.defaultVariant;
  existingButton.swapComponent(newVariant);
}
return { success: true, mutatedNodeIds: [existingButton.id] };
当更新而非从零开始创建屏幕时:
  1. 使用
    get_metadata
    检查现有屏幕结构。
  2. 确定需要更新的部分和可保留的部分。
  3. 对每个需要修改的部分:
    • 通过ID或名称定位现有节点
    • 如果设计系统组件已更新,替换组件实例
    • 根据需要更新文本内容、变体属性或布局
    • 删除已废弃的部分
    • 添加新部分
  4. 每次修改后调用
    get_screenshot
    验证。
js
// 示例:在现有屏幕中替换按钮变体
const existingButton = await figma.getNodeByIdAsync("EXISTING_BUTTON_INSTANCE_ID");
if (existingButton && existingButton.type === "INSTANCE") {
  // 导入更新后的组件
  const buttonSet = await figma.importComponentSetByKeyAsync("BUTTON_SET_KEY");
  const newVariant = buttonSet.children.find(c =>
    c.name.includes("variant=primary") && c.name.includes("size=lg")
  ) || buttonSet.defaultVariant;
  existingButton.swapComponent(newVariant);
}
return { success: true, mutatedNodeIds: [existingButton.id] };

Reference Docs

参考文档

For detailed API patterns and gotchas, load these from the figma-use references as needed:
  • component-patterns.md — importing by key, finding variants, setProperties, text overrides, working with instances
  • variable-patterns.md — creating/binding variables, importing library variables, scopes, aliasing, discovering existing variables
  • text-style-patterns.md — creating/applying text styles, importing library text styles, type ramps
  • effect-style-patterns.md — creating/applying effect styles (shadows), importing library effect styles
  • gotchas.md — layout pitfalls (HUG/FILL interactions, counterAxisAlignItems, sizing order), paint/color issues, page context resets
如需详细的API模式和注意事项,请根据需要从figma-use参考文档中加载:
  • component-patterns.md——通过密钥导入、查找变体、setProperties、文本覆盖、实例操作
  • variable-patterns.md——创建/绑定变量、导入库变量、作用域、别名、发现现有变量
  • text-style-patterns.md——创建/应用文本样式、导入库文本样式、字体层级
  • effect-style-patterns.md——创建/应用效果样式(阴影)、导入库效果样式
  • gotchas.md——布局陷阱(HUG/FILL交互、counterAxisAlignItems、尺寸设置顺序)、填充/颜色问题、页面上下文重置

Error Recovery

错误恢复

Follow the error recovery process from figma-use:
  1. STOP on error — do not retry immediately.
  2. Read the error message carefully to understand what went wrong.
  3. If the error is unclear, call
    get_metadata
    or
    get_screenshot
    to inspect the current file state.
  4. Fix the script based on the error message.
  5. Retry the corrected script — this is safe because failed scripts are atomic (nothing is created if a script errors).
Because this skill works incrementally (one section per call), errors are naturally scoped to a single section. Previous sections from successful calls remain intact.
请遵循figma-use中的错误恢复流程:
  1. 出错时立即停止——请勿立即重试。
  2. 仔细阅读错误信息,理解问题所在。
  3. 如果错误信息不清晰,调用
    get_metadata
    get_screenshot
    检查当前文件状态。
  4. 根据错误信息修复脚本
  5. 重试修正后的脚本——这是安全的,因为失败的脚本是原子操作(脚本出错时不会创建任何内容)。
由于此技能采用增量式工作(每次调用构建一个部分),错误自然局限于单个部分。之前成功调用创建的部分将保持完整。

Best Practices

最佳实践

  • Always search before building. The design system likely has the component, variable, or style you need. Manual construction and hardcoded values should be the exception, not the rule.
  • Search broadly. Try synonyms and partial terms. A "NavigationPill" might be found under "pill", "nav", "tab", or "chip". For variables, search "color", "spacing", "radius", etc.
  • Prefer design system tokens over hardcoded values. Use variable bindings for colors, spacing, and radii. Use text styles for typography. Use effect styles for shadows. This keeps the screen linked to the design system.
  • Prefer component instances over manual builds. Instances stay linked to the source component and update automatically when the design system evolves.
  • Work section by section. Never build more than one major section per
    use_figma
    call.
  • Return node IDs from every call. You'll need them to compose sections and for error recovery.
  • Validate visually after each section. Use
    get_screenshot
    to catch issues early.
  • Match existing conventions. If the file already has screens, match their naming, sizing, and layout patterns.
  • 先搜索再构建。设计系统很可能包含你需要的组件、变量或样式。手动构建和硬编码值应是例外情况,而非常规操作。
  • 广泛搜索。尝试同义词和部分术语。"NavigationPill"可能在"pill"、"nav"、"tab"或"chip"下被找到。对于变量,搜索"color"、"spacing"、"radius"等。
  • 优先使用设计系统令牌而非硬编码值。使用变量绑定设置颜色、间距和圆角。使用文本样式设置排版。使用效果样式设置阴影。这可使屏幕与设计系统保持关联。
  • 优先使用组件实例而非手动构建。实例与源组件保持关联,设计系统更新时会自动同步。
  • 逐个部分构建。每次
    use_figma
    调用请勿构建多个主要部分。
  • 每次调用返回节点ID。你需要这些ID来组装部分和进行错误恢复。
  • 每个部分构建完成后进行视觉验证。使用
    get_screenshot
    尽早发现问题。
  • 匹配现有规范。如果文件中已有屏幕,请匹配其命名、尺寸和布局模式。 ",