All skills
openai avatar

/figma-generate-library

@0e7823c official
by openaiopenai/skills28k stars
1,891

Build or update a professional-grade design system in Figma from a codebase. Use when the user wants to create variables/tokens, build component libraries, set up theming (light/dark modes), document foundations, or reconcile gaps between code and Figma. This skill teaches WHAT to build and in WHAT ORDER — it complements the `figma-use` skill which teaches HOW to call the Plugin API. Both skills should be loaded together.

Use this Skill: https://skilld.dev/gh/openai/skills/figma-generate-library

This session only. Nothing lands on disk.

referencesnaming-conventions.md

≈4.8k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Part of the figma-generate-library skill.

Naming Conventions Reference

This reference documents every naming convention used in the figma-generate-library workflow. Cover all naming decisions in order: variables, components, pages, variants, styles, separators, status indicators. The last section explains when to match an existing file's conventions vs. using the defaults here.


1. Variable Naming

Slash hierarchy (the universal pattern)

All Figma variables use slash-separated paths. The slash creates visual grouping in the Variables panel and maps directly to the token hierarchy in code.

{category}/{subcategory}/{role}

Real examples from Simple DS and Material 3:

color/bg/primary
color/bg/secondary
color/text/primary
color/text/muted
color/border/default
color/border/focus
color/feedback/error
color/feedback/success
spacing/xs
spacing/sm
spacing/md
spacing/lg
spacing/xl
spacing/2xl
radius/none
radius/sm
radius/md
radius/lg
radius/full
typography/body/font-size
typography/body/line-height
typography/heading/font-size
typography/heading/font-weight

Primitives collection

Primitive variables hold raw values and are not exposed to consumers (scope = []). They use a flat {family}/{step} format matching the color scale convention from Simple DS:

blue/50
blue/100
blue/200
...
blue/900
gray/50
gray/100
...
gray/900
red/500
green/500

Step numbers follow the convention of the target codebase. If the codebase uses 100–900, use that. If it uses 50–950, use that. If there is no codebase convention, use 100–900 in increments of 100.

Semantic collection

Semantic variables alias primitives. They use the role-based {category}/{role} or {category}/{subcategory}/{role} pattern:

color/bg/primary         → alias: primitives/white (light), primitives/gray/900 (dark)
color/bg/secondary       → alias: primitives/gray/100 (light), primitives/gray/800 (dark)
color/text/primary       → alias: primitives/gray/900 (light), primitives/white (dark)
color/text/secondary     → alias: primitives/gray/600 (light), primitives/gray/400 (dark)
color/border/default     → alias: primitives/gray/200 (light), primitives/gray/700 (dark)

Rule: Semantic variables must never hold raw hex values — they always alias a primitive. If you need a new color value, create the primitive first, then create the semantic alias.

Casing

Default: Use lowercase with forward slashes: color/bg/primary, spacing/2xl.

When to deviate:

  • If the existing file uses PascalCase (e.g., Material 3 uses Schemes/Primary) — match it.
  • If the design team prefers PascalCase for readability in the Variables panel — acceptable as long as the code syntax is separately defined and uses the platform-correct case.
  • Mode names can use spaces and mixed case (e.g., SDS Light, Mode 1 → Light) — these are labels, not identifiers.

Never: camelCase inside variable names (colorBgPrimary as a Figma name is wrong — that belongs in Android code syntax only). Never use spaces inside a path segment: color/bg primary is wrong; color/bg/primary is correct.

Key distinction: The casing rule applies to Figma variable names. Code syntax names follow platform conventions regardless of the Figma name case — see §9 for the full picture.


2. Component Naming

Main components: PascalCase, no prefix

Published components intended for library consumers use plain PascalCase names:

Button
Input
Checkbox
Toggle
Avatar
Badge
Card
Dialog
Tooltip
Banner

Do not use a namespace prefix for public components (e.g., do not name them DS/Button or sds-Button). Slashes in component names create nested grouping in the Assets panel, which is correct for sub-components but not for top-level public components.

Sub-components: underscore prefix + slash namespace

Internal sub-components that are NOT meant for library consumers use the _ prefix. This hides them from the Assets panel by default and signals to other designers that they should not be used directly.

_Button/Slot           (internal icon slot for Button)
_Input/Indicator       (internal state indicator for Input)
_Badge/Dot             (internal dot sub-component of Badge)
_Parts/Avatar.Status   (UI3 pattern: _Parts/{ParentName}.{SubPart})
_Slider/Handle         (UI3 pattern: _{ParentName}/{SubPart})

Pattern rules:

  • Use _ prefix for ALL internal sub-components — no exceptions.
  • Use slash namespacing to group sub-components under their parent: _Button/IconSlot.
  • For sub-components shared by multiple parents, use _Parts/{ComponentName}.{SubPart}.

Private documentation components

Components used only for internal documentation (not for production use) use the . prefix:

.ExampleCard
.GuidelineHeader
.DemoFrame

This hides them from consumers while keeping them accessible on the canvas.


3. Page Naming

Five reference design systems use three distinct naming patterns. Choose one pattern and apply it consistently across all pages in the file.

Pattern 1: Plain names (Simple DS, Material 3, Polaris)

The most common pattern. Clean, readable, no decoration.

Cover
---
Foundations
Icons
---
Accordion
Avatars
Buttons
Cards
Dialog
Inputs
Menu
---
Utilities
Component Playground

Use this pattern when starting from scratch or when the target file already uses this style.

Pattern 2: Emoji prefix + status (UI3 Library)

The most expressive pattern. The page name encodes asset type, design status, and code readiness.

Anatomy: [Asset Type Emoji] [Optional FPL Label] [Status Circle] Component Name [Code Status Bracket]

Segment Values
Asset type Component pages use the C-flag emoji; pattern pages use the P-flag emoji
Design status Green circle = Ready, Yellow circle = WIP, Red circle = Do not use
Code status (none) = Ready in code, [beta] = Beta, [future] = Not yet built

Examples:

Overview
Status Key
---
FPL COMPONENTS (go/fpl)
[C-flag] FPL [Green] Buttons
[C-flag] FPL [Green] Inputs
[C-flag] FPL [Yellow] Popovers [future]
---
UI3 COMPONENTS
[C-flag] [Green] Comments
---
PATTERNS
[P-flag] [Green] Editor / Layers
---
[Book] Cover
[Headstone] Deprecated

Use this pattern only when building a large, multi-team design system where lifecycle tracking is needed, or when the target file already uses it.

Pattern 3: Emoji prefix (Shop Minis)

A lighter version of the UI3 pattern without status circles.

📔 Cover
ℹ️ About
🚀 Getting started
——— THEME ———
Color
Typography
Spacing
——— COMPONENTS ———
Button
Input
Card

Use this pattern when the target file already uses emoji prefixes but does not need lifecycle tracking.

Universal rules (all patterns)

  • Cover is always first.
  • Separator pages come before and after each logical section.
  • Foundation/token pages always come before component pages.
  • Utility and internal pages always come last.
  • Pick one convention and do not mix patterns within a file.

4. Variant Naming

Property=Value format

All component variant properties and their values use Property=Value format in the Figma component set:

Size=Small, Style=Primary, State=Default
Size=Medium, Style=Secondary, State=Hover
Size=Large, Style=Ghost, State=Disabled

Actual property names match code prop names where possible:

Figma Property Code Prop Equivalent
Size size
Style / Variant variant
State Typically controlled by :hover, :focus, :disabled in CSS, but state in some systems
Type type
Disabled disabled (boolean)
Icon icon (boolean or instance swap)

Property value casing

Property values use Title Case in Figma (to be readable in the Variants panel), mapping to lowercase in code:

Figma value Code value
Small "small" / "sm"
Medium "medium" / "md"
Large "large" / "lg"
Primary "primary"
Disabled disabled (boolean prop)
Default (typically the absent/unset case)

Boolean properties

Boolean component properties in Figma use true / false as values (Figma's native boolean), not Yes / No or On / Off.


5. Style Naming (Text and Effect Styles)

Text styles: category/name

Display/Large
Display/Medium
Display/Small
Heading/1
Heading/2
Heading/3
Body/Large
Body/Medium
Body/Small
Label/Large
Label/Small
Code/Inline

The category segment maps to the typographic role. Use the same category names as the codebase's typography scale where possible.

Effect styles (shadows): category/name

Shadow/None
Shadow/Subtle
Shadow/Medium
Shadow/Strong
Shadow/Overlay
Elevation/0
Elevation/1
Elevation/2
Elevation/3
Elevation/4
Elevation/5

Use Shadow/ for named semantic shadows. Use Elevation/N for Material Design-style numbered elevation levels.


6. Separator Pages

Separator pages are empty pages whose sole purpose is to create visual breaks in the Figma page panel. Two conventions:

Convention Example Used by
Three dashes --- Simple DS, UI3, Polaris, Material 3
Decorated text ——— COMPONENTS ——— Shop Minis

The three-dash convention (---) is the most common and the default for new files. Use it unless the target file uses the decorated-text style.

Where to place separators:

Cover
---                    ← after cover
Foundations
Icons
---                    ← before components
[component pages]
---                    ← before utilities
Utilities

7. Status Indicators (UI3 Emoji System)

The UI3 Library uses colored circle emojis in page names to communicate design readiness at a glance. This system is optional but powerful for large teams.

Emoji Meaning When to use
Green circle Ready / Approved Design is stable, reviewed, and safe to use
Yellow circle WIP / In Progress Design is being actively worked on, may change
Red circle Do not use Not ready, do not reference; may be deprecated

Code readiness is communicated via brackets appended to the component name:

Bracket Meaning
(none) Component is implemented in code and stable
[beta] Component is in code but not yet stable (~3 weeks from ready)
[future] Not yet implemented in code

Documentation status (within component pages):

If building a UI3-style system, each documentation frame gets a status banner with one of these labels:

  • APPROVED — fully vetted
  • READY FOR REVIEW — awaiting sign-off
  • WORK IN PROGRESS — actively being designed
  • NEEDS UPDATE — outdated, requires revision
  • DO NOT REFERENCE — should not be used

This system is only recommended for large, multi-team systems where lifecycle tracking provides real value. For smaller systems, skip the emoji status indicators and use plain page names.


8. When to Match Existing vs. Use Defaults

Always inspect before naming anything. Run get_metadata or inspectFileStructure to discover existing conventions before creating any pages or variables.

Match the existing file when:

  • The file already has pages with a consistent naming pattern (emoji prefixes, separator style, casing).
  • The file already has variable collections with an established naming scheme.
  • The file was started by a design team and carries intentional decisions.
  • Any existing component names use a specific pattern (PascalCase, kebab-case, namespace prefixes).

Use the defaults from this document when:

  • Starting a brand-new Figma file with no existing content.
  • The existing conventions are inconsistent (mix of styles = no convention to match).
  • The user explicitly asks for a fresh design system following best practices.

When code and Figma disagree:

If the codebase uses button-primary but Figma has a component named Button, do not rename the Figma component. Instead:

  • Keep the Figma name as Button (PascalCase, human-readable).
  • Set variable code syntax to match the exact CSS token name from the codebase.
  • Set Code Connect source path to the actual code file and use the exact code component name.

The rule: Figma names are for designers; code syntax and Code Connect source paths carry the exact code identifiers. These two identity systems operate in parallel.


9. Figma Variable Names vs Code Names — The Full Picture

This is one of the most misunderstood areas. Figma names and code names follow different conventions on purpose — they serve different audiences and live in different environments.

Why they differ

Figma variable name Code syntax (WEB)
Audience Designers in the Variables panel Developers in CSS/Swift/Kotlin
Separator / (slash) — creates visual grouping in Figma UI - (hyphen) — required by CSS custom property syntax
Case lowercase (or PascalCase for display — see below) kebab-case for CSS; camelCase for JS/Android
Depth 2–4 levels Flat for CSS; dot-notation for JS
Namespace Implicit (by collection) Explicit prefix (--p-, --md-, --cds-)

The transformation

Figma variable name              Code syntax (WEB)
──────────────────               ─────────────────
color/bg/primary          →      var(--color-bg-primary)
spacing/xs                →      var(--spacing-xs)
radius/md                 →      var(--radius-md)
typography/body/font-size →      var(--typography-body-font-size)

Pattern: replace "/" with "-", wrap in var(--)

**CRITICAL: The `var()` wrapper is REQUIRED for WEB code syntax.** Figma expects the full CSS function syntax — not just the property name. If you set `--color-bg-primary` (without `var()`), Dev Mode will show raw hex values instead of the variable reference. Always set `var(--color-bg-primary)`.
Figma variable name              Code syntax (ANDROID)
──────────────────               ─────────────────────
color/bg/primary          →      colorBgPrimary
spacing/xs                →      spacingXs
radius/md                 →      radiusMd

Pattern: replace "/" with "", capitalize each word after first
Figma variable name              Code syntax (iOS)
──────────────────               ─────────────────
color/bg/primary          →      Color.bgPrimary
spacing/xs                →      Spacing.xs
radius/md                 →      Radius.md

Pattern: first segment becomes class name, remainder becomes property (camelCase)

Real-world examples from the 5 reference files

File Figma variable name WEB code syntax ANDROID code syntax
Simple DS color/bg/primary var(--color-bg-primary) colorBgPrimary
Simple DS spacing/sm var(--spacing-sm) spacingSm
Material 3 Schemes/Primary var(--md-sys-color-primary) colorPrimary
Material 3 Corner/Extra-small var(--md-sys-shape-corner-extra-small) shapeCornerExtraSmall
Polaris color/bg/surface var(--p-color-bg-surface) —

Key observation from Material 3: The Figma name Schemes/Primary uses PascalCase with a space, but the WEB code syntax is var(--md-sys-color-primary) — entirely kebab-case with a vendor prefix md-sys-. The Figma name and the code syntax bear almost no resemblance. This is intentional and common in mature design systems.

Casing in Figma: lowercase is default, PascalCase is valid for display

The guideline to use lowercase is a default, not a universal rule. Evidence from real files:

File Figma case Code output case Why
Simple DS color/bg/primary (lowercase) var(--color-bg-primary) Direct mapping — simple
Material 3 Schemes/Primary (PascalCase) var(--md-sys-color-primary) PascalCase reads better in Variables panel; code name is independently defined
Polaris color/bg/surface (lowercase) var(--p-color-bg-surface) Direct mapping with vendor prefix

Rule: Use lowercase when the Figma name will map directly to the CSS name. Use PascalCase (or match existing file) when the design system has human-readable variable names that are distinct from the technical code names.

When the codebase doesn't use CSS custom properties

Some JavaScript-first systems (Chakra, Ant Design, MUI) don't use CSS var(--...) at all. Their tokens live in JS theme objects:

Chakra:    colors.gray[500]         →  JS: theme.colors.gray[500]
Ant:       colorPrimary             →  JS: token.colorPrimary
MUI:       palette.primary.main     →  JS: theme.palette.primary.main

In these cases, set WEB code syntax to the JS property path rather than a CSS variable:

// For a JS-object-based system like Chakra:
v.setVariableCodeSyntax('WEB', 'colors.gray.500');

// For Ant Design:
v.setVariableCodeSyntax('WEB', 'colorPrimary');

Hierarchy depth: match the codebase

The number of slash levels should mirror the codebase's nesting depth:

Codebase pattern Figma depth Example
--primary (flat) 1–2 levels color/primary
--color-bg-surface (3-part) 3 levels color/bg/surface
--md-sys-color-primary (vendor + 3-part) 3 levels (vendor prefix goes in code syntax only) color/primary
theme.palette.primary.main (4-part) 3–4 levels color/palette/primary/main

Important: Vendor prefixes (--p-, --md-sys-, --cds-) belong in the code syntax, not the Figma variable name. The Figma name color/bg/surface + code syntax var(--p-color-bg-surface) is the correct pattern.

Action at discovery time

During Phase 0 discovery, capture both sides of the mapping explicitly:

For each token found in the codebase:
  CSS variable:   --sds-color-background-brand-default
  Figma name:     color/bg/brand/default        (slash hierarchy, no vendor prefix)
  WEB syntax:     var(--sds-color-background-brand-default)  (exact CSS name)
  ANDROID syntax: sdsColorBackgroundBrandDefault  (camelCase)
  iOS syntax:     Color.backgroundBrandDefault    (dot-notation)

Store this mapping in the state ledger. Use it when calling setVariableCodeSyntax in Phase 1. Never derive the code syntax from the Figma name if you have the original CSS variable name — always use the original.

Source: SKILL.md on GitHub

No alerts16d4 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    This skill provides a structured workflow for generating Figma design libraries from codebases. It includes security considerations regarding the ingestion of external codebase data, but these are managed through mandatory human checkpoints and are necessary for the skill's primary function.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at 0e7823c. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 months ago.

Activeupdated 6 months ago
  • TypeScript
  • figma
  • design-systems
  • component-libraries
  • tokens
  • variables
  • theming
  • design-tokens
  • plugin-api

README badge

README badge for openai/skills/figma-generate-library

Orchestrates multi-phase workflows to build professional design systems in Figma from a codebase, handling tokens, component libraries, theming, and documentation. Requires the figma-use skill for API calls and enforces sequential 20–100+ step workflows across discovery, foundations, file structure, component creation, and QA phases with mandatory user checkpoints between each.

Generated from the current SKILL.md.

Does this skill work standalone, or does it require another skill?
The `figma-use` skill must also be loaded. This skill provides design system workflow and orchestration; `figma-use` provides the Plugin API syntax and execution rules for every `use_figma` call.
Can I build a design system in one or two calls?
No. Building a design system requires 20–100+ sequential `use_figma` calls across five mandatory phases (Discovery, Foundations, File Structure, Components, QA), with user checkpoints between each phase. Attempting to compress this into fewer calls produces broken or unrecoverable results.
How does this skill handle variables and components that already exist in Figma?
Phase 0 (Discovery) inspects the existing Figma file and codebase to identify conflicts and reuse opportunities. The skill then maps code tokens to Figma and asks the user which version wins if they disagree. Use `search_design_system` to check subscribed libraries before creating new components.
What happens if I disconnect mid-workflow or the chat context runs out?
The skill maintains a state ledger (persisted to disk by run ID) tracking all created entities and completed phases. On resumption, reload the skill and run a read-only `use_figma` scan to reconstruct the state map, then resume from the last completed step.
Does this skill create Code Connect mappings?
Optionally. The skill mentions lightweight Code Connect mapping during component creation (Phase 3) and finalizes mappings in Phase 4, but it is not the primary focus — the main workflow is building variables, tokens, file structure, and components.

Generated from the current SKILL.md. These answers refresh after source changes.