Figma Component Generator logo

Figma Component Generator

Community
cris-achiardi
figma-component-generator

Generate Figma component sets from source code using the figma-cli tool. This skill should be used when the user wants to create or update Figma components by reading React/CSS source files and generating matching component sets with variants, properties, and variable bindings. Invoked as a slash command with a Figma page URL or component name.

Overview

Publishercris-achiardi
Repositoryclaude-skills
Skill namefigma-component-generator
Stars
72
Forks
8
Bundled files
10
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 10 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by cris-achiardi on GitHub. Read the source before you install it.

Installation

Install the Figma Component Generator AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/cris-achiardi/claude-skills/tree/main/skills/figma-component-generator
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/cris-achiardi/claude-skills.git /tmp/claude-skills
mkdir -p .claude/skills
cp -r /tmp/claude-skills/skills/figma-component-generator .claude/skills/figma-component-generator
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Figma Component Generator in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Figma Component Generator on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Figma Component Generator is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Figma Component Generator

Generate Figma component sets from source code (TSX, CSS Modules, metadata files) using the figma-cli eval command. Reads component logic, styles, and optional metadata to produce a properly structured Figma component set with variants, sizes, colors, and boolean properties -- all bound to Figma variables.

Prerequisites

  • The figma-cli repo must be cloned locally
  • Figma Desktop must be running with CDP enabled (port 9222)
  • The target Figma file must be open
  • The daemon should be running (node src/index.js daemon start)

To verify the connection:

bash
curl -s http://localhost:9222/json

Usage

/figma-component-generator <figma-page-url> [component-path]
  • figma-page-url: URL of the Figma page where the component should be created (required)
  • component-path: Path to the component folder (if not provided, ask the user)

Workflow

Step 1: Resolve inputs

Parse the Figma page URL to extract the file and page context. If component-path is not provided, ask the user for it.

Locate the figma-cli repo. Check common locations:

  • Look for a figma-cli directory in the current working directory or its parent
  • Check ~/figma-cli or ~/Projects/figma-cli
  • Or ask the user for the path if not found

Store the CLI path for use in all subsequent eval commands:

CLI_PATH=<path-to-figma-cli>

Step 2: Analyze the component source

Read the component files. At minimum, look for:

  1. Component logic (.tsx, .jsx, .vue, .svelte): Extract props, variants, types, default values
  2. Styles (.module.css, .css, .scss): Extract sizing, colors, spacing, border radius, token usage
  3. Metadata (.metadata.ts, .metadata.json): If available, extract structured variant definitions, sizes, colors, descriptions

From these files, build a component spec:

  • Variant dimensions: Identify the props that create visual variants (e.g., variant: solid|soft|outline, color: primary|danger|..., size: sm|md|lg)
  • Sizing tokens: Map size variants to pixel values (height, padding, font-size, gap)
  • Color tokens: Map each variant+color combination to CSS custom properties (e.g., var(--background-interactive-primary))
  • Boolean features: Identify optional visual elements (dots, icons, close buttons) that should become boolean component properties
  • Shape properties: Border radius, stroke width, stroke alignment

Step 3: Classify component and resolve dependencies

Before querying variables or generating, determine whether this component should be generated as a component set, and if so, resolve its atom dependencies.

Read references/rules/atomic-dependencies.md and follow the classification and resolution workflow:

  1. Classify the component as Visual, Layout Wrapper, or Compositional using the CSS and metadata signals described in the rule
  2. If Layout Wrapper: present the clarity checkpoint to the user and wait for their choice before proceeding. Do NOT generate a component set unless the user explicitly requests it.
  3. If Visual or Compositional: extract dependency names from metadata (composition.nestedComponents, composition.commonPartners) and source imports
  4. Resolve dependencies using the lookup table or Figma traversal (see below)
  5. Build a dependency map: for each found dependency, record the component set ID and available variants. For missing dependencies, warn the user.
  6. Pass the dependency map to Step 6 (generation) so the eval script uses createInstance() instead of raw frames for found dependencies.
Dependency resolution with optional lookup table

An external JSON lookup table may exist that maps component names to Figma node IDs. Read references/figma-map-lookup.md for the full schema and generation instructions.

Resolution order:

  1. Check for lookup table: Look for a figma-map.json file provided by the user (typically in ~/.claude/data/). If found, extract the figmaFileKey and compare it to the file key parsed from the Figma URL. If they match, use the map.
  2. Direct ID lookup (fast path): For each dependency name, check components.<name>.componentSetId in the map. If non-null, use figma.getNodeByIdAsync(id) to fetch the node directly. This avoids cross-page traversal entirely.
  3. Fallback to findAll (slow path): If the map doesn't exist, the file keys don't match, or a dependency isn't in the map, fall back to figma.root.findAll(n => n.type === 'COMPONENT_SET' && n.name === name).

The lookup table is optional — the skill must work without it. Never hardcode a specific file path; treat it as an external data source that may or may not be present.

Step 4: Query Figma variables

Before generating, fetch all available Figma variables to build a mapping:

bash
cd $CLI_PATH && node src/index.js eval "
(async () => {
  const allVars = await figma.variables.getLocalVariablesAsync();
  return JSON.stringify(allVars.map(v => v.name));
})()"

Token-to-variable mapping: Convert CSS token names to Figma variable paths:

  • var(--background-interactive-primary) maps to background/interactive/primary
  • Strip var(-- and ), replace - with / for path segments

For each token used by the component, check if a matching Figma variable exists. Track any unmapped tokens for the final report.

For detailed mapping rules and patterns, read references/figma-plugin-api-patterns.md.

Step 5: Navigate to the target page

Parse the node-id from the Figma URL (URL-encoded, e.g., 2001-2 means 2001:2).

bash
cd $CLI_PATH && node src/index.js eval "
(async () => {
  const targetId = '<decoded-node-id>';
  const page = figma.root.children.find(p => p.id === targetId);
  if (!page) {
    // Fallback: find by name
    const page2 = figma.root.children.find(p => p.name.trim() === '> <ComponentName>');
    if (page2) { figma.currentPage = page2; return 'Navigated by name'; }
    return 'Page not found';
  }
  figma.currentPage = page;
  return 'Navigated to: ' + page.name;
})()"

Step 6: Generate the component set

Build a single eval script that creates all variant combinations. The script must:

  1. Load fonts (load the weights your design system requires -- see references/figma-typography.md)
  2. Fetch variables and create a lookup helper
  3. Create component variants by iterating over all dimension combinations:
    • For each combination of variant properties (e.g., solid + primary + md), create a figma.createComponent()
    • Name it using Figma's variant syntax: Variant=solid, Color=primary, Size=md
    • Set auto-layout, sizing, padding, gap, corner radius
    • Set fills/strokes with placeholder colors, then bind to Figma variables
    • Create child elements (text labels, dots, icons) with proper variable bindings
    • For children that map to resolved dependencies (from Step 3), use componentNode.createInstance() instead of creating raw frames. See references/rules/atomic-dependencies.md for instance creation and variant selection patterns.
    • Add boolean component properties for optional elements
  4. Combine all variants using figma.combineAsVariants(components, figma.currentPage)
  5. Arrange in a grid for readability (remove auto-layout from set, position manually)
  6. Return a report with created count and any unmapped variables

For detailed Figma Plugin API patterns and code examples, read references/figma-plugin-api-patterns.md.

Pattern detection checklist

Before generating, scan the component source for these patterns and load the relevant rule:

PatternDetection SignalRule File
Sizing & layoutAny componentreferences/rules/sizing-modes.md (always read)
Iconslucide-react imports, icon props, SVG elements, spinnersreferences/figma-icon-library.md + references/rules/icon-recoloring.md
TypographyText nodes, font tokens, text-style CSS propertiesreferences/figma-typography.md
Nested components.map() loops, repeated elements with per-item state (isActive, isSelected)references/rules/nested-components.md
Dynamic item countPositive: prop is an array mapped with .map(); runtime-determined count; no fixed upper bound. Negative: named structural children (header/footer); fixed count (OTP=6, rating=5); single-child wrapper (Tooltip trigger); render-propsreferences/rules/slots.md
Floating overlaysImports from @floating-ui/*, @radix-ui/react-popover, @radix-ui/react-dropdown-menu, @radix-ui/react-tooltip, cmdk, @headlessui/react; uses createPortal; position: absolute|fixed with high z-index on the expanded part; conditional render of menu/dropdown/popover contentreferences/rules/floating-overlays.md
Atomic dependenciesMolecule/organism; metadata nestedComponents non-empty; imports design-system componentsreferences/rules/atomic-dependencies.md

Cross-dependency: Nested components and Dynamic item count often fire together. When a parent maps over items AND each item has per-item state (isActive, isSelected), you need BOTH: create a sub-component set per nested-components.md, then use slot Pattern A (instance-filled) in the parent per slots.md. If items are heterogeneous or have no per-item state, only slots.md applies (Pattern B, frame-filled).

Key rules for the eval script:
  • Wrap everything in (async () => { ... })()
  • Always set a placeholder fill/stroke BEFORE binding a variable
  • Append children to parent BEFORE setting layoutSizingHorizontal
  • Apply text style (textStyleId) BEFORE setting .characters (avoids Inter font loading issues)
  • Return JSON.stringify() for structured results
  • Use figma.variables.setBoundVariableForPaint() for variable binding
  • For complex scripts, write to a temp .js file and use eval --file <path>, then clean up after
  • Icons should use your project's icon component set when available -- read references/figma-icon-library.md
  • All text must use the project's font family via Figma text styles -- read references/figma-typography.md
Grid layout strategy:

Arrange variants in a grid where:

  • Columns = sizes (sm, md, lg)
  • Rows = colors (neutral, primary, ...)
  • Sections (separated by gap) = visual variants (solid, soft, outline)

Step 7: Report results

After generation, present a summary:

## Component Generated: Badge

- **Variants created**: 63 (3 variants x 7 colors x 3 sizes)
- **Properties**: Variant, Color, Size, Show Dot (boolean)
- **Variables bound**: 42 fill bindings, 21 stroke bindings
- **Unmapped tokens**: (none)
  OR
- **Unmapped tokens**:
  - `var(--background-utility-coral)` -- no matching Figma variable found
  - `var(--foreground-utility-coral)` -- no matching Figma variable found
- **Dependencies resolved**: 3/5 (Button, SearchInput, Select found; Input, Checkbox not in file)
  OR
- **Dependencies**: none (atom component)

If there are unmapped tokens, suggest the user create the missing variables in Figma or check for naming mismatches.

Important Notes

  • Never delete existing content on the page. Only add new nodes.
  • The figma-cli daemon has a 60-second timeout. For very large component sets (100+ variants), consider splitting into multiple eval calls.
  • If the connection is lost mid-generation, run node src/index.js daemon restart and retry.
  • The eval script can be substantial in size. The daemon handles large payloads.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Figma Component Generator AI skill do?

Generate Figma component sets from source code using the figma-cli tool. This skill should be used when the user wants to create or update Figma components by reading React/CSS source files and generating matching component sets with variants, properties, and variable bindings. Invoked as a slash command with a Figma page URL or component name.

Why use Figma Component Generator on TypingMind?

Because you install it once and use it with any model. Figma Component Generator is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Figma Component Generator in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/cris-achiardi/claude-skills/tree/main/skills/figma-component-generator. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Figma Component Generator?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Figma Component Generator?

As many as you like. As long as a model supports skills, you can use Figma Component Generator with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Figma Component Generator AI skill free?

Yes. It is published on GitHub by cris-achiardi under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇