AIOZ UI V3 — Figma MCP → Code Mapping Skill
This skill defines exactly how to translate Figma MCP output into production React code using the AIOZ UI V3 design system.
Rule #1: Never guess token names or class names. Always follow the mapping tables below.
How Figma MCP Returns Data
When the Figma MCP agent inspects a node, it returns values in these formats:
| Data Type | Figma MCP Example | Action |
|---|---|---|
| Color / fill | Onsf/Error/Default, Sf/Pri/Pri |
→ Look up in references/colors.md |
| Typography | Button/01, Body/02, Subheadline/01 |
→ Look up in references/typography.md |
| Icon layer | icon/24px/outline/wallet-01 |
→ Look up in references/icons.md |
| Component name | Button/Primary, Badge/Success, Fields/Default |
→ See Component Map below |
| Variant string | Type=Primary, Size=Medium, Shape=Square |
→ See Variant → Prop Map below |
| Variable value | "Onsf/Bra/Default": "#121212" |
Slash-path format, never CSS --var |
| Setup / config | Project configuration questions | → Look up in references/setup.md |
⚠️ Figma MCP always returns token names with slash separators like
Onsf/Error/Default. It does NOT return CSS custom property format like--onsf-error-default.
⚠️ Two Import Paths — Never Mix Them
// Charts — @aioz-ui/core/components
import {
LineChart,
AreaChart,
BarChart,
DonutChart,
CustomLegend,
Separator,
useSeriesVisibility,
} from '@aioz-ui/core/components'
// All other UI components — @aioz-ui/core-v3/components
import {
Button,
Input,
Badge,
Table,
Header,
Body,
Row,
HeadCell,
Cell,
} from '@aioz-ui/core-v3/components'
// Icons — @aioz-ui/icon-react (always PascalCase + "Icon" suffix)
import { Search01Icon, Plus01Icon, Wallet01Icon } from '@aioz-ui/icon-react'
Component Map
Input: Figma MCP name field on a symbol/instance node
Output: React component to use
| Figma Node Name Pattern | React Component | Import |
|---|---|---|
Button/* |
Button |
import { Button } from '@aioz-ui/core-v3/components' |
Fields/* |
Input |
import { Input } from '@aioz-ui/core-v3/components' |
Badge/* |
Badge |
import { Badge } from '@aioz-ui/core-v3/components' |
Tag/* |
Tag |
import { Tag } from '@aioz-ui/core-v3/components' |
Card/* |
Card |
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@aioz-ui/core-v3/components' |
Toggle/* |
Switch |
import { Switch } from '@aioz-ui/core-v3/components' |
Checkbox/* |
Checkbox |
import { Checkbox } from '@aioz-ui/core-v3/components' |
Tooltips/* |
Tooltip |
import { Tooltip, TooltipProvider, TooltipTrigger, TooltipContent } from '@aioz-ui/core-v3/components' |
Tabs/* |
Tabs |
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@aioz-ui/core-v3/components' |
Table/* |
Table |
import { Table, Header, Body, Row, HeadCell, Cell } from '@aioz-ui/core-v3/components' |
Separator/* |
Separator |
import { Separator } from '@aioz-ui/core-v3/components' |
Pagination item/* |
PaginationGroup |
import { PaginationGroup } from '@aioz-ui/core-v3/components' |
Progress bar/* |
Progress |
import { Progress } from '@aioz-ui/core-v3/components' |
Slider/* |
Slider |
import { Slider } from '@aioz-ui/core-v3/components' |
Upload file/* |
UploadFile |
import { UploadFile } from '@aioz-ui/core-v3/components' |
Menu item/* |
MenuItem |
import { MenuItem } from '@aioz-ui/core-v3/components' |
Dropdown item/* |
DropdownMenu |
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@aioz-ui/core-v3/components' |
Modal/* |
Dialog |
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose } from '@aioz-ui/core-v3/components' |
Block/* |
Block |
import { Block } from '@aioz-ui/core-v3/components' |
IconBadge/* |
IconBadge |
import { IconBadge } from '@aioz-ui/core-v3/components' |
Message/* |
Message |
import { Message } from '@aioz-ui/core-v3/components' |
Breadcrumb/* |
Breadcrumb |
import { Breadcrumb } from '@aioz-ui/core-v3/components' |
Date picker/* |
DatePicker |
import { DatePicker } from '@aioz-ui/core-v3/components' |
Variant → Prop Map
Figma MCP encodes variants as comma-separated Key=Value pairs in the node name:
"Type=Primary, Size=Medium, Icon Only=False, Shape=Square, Danger=False, State=Hover"
| Figma Variant | React Prop | Notes |
|---|---|---|
Type=Primary |
variant="primary" |
|
Type=Secondary |
variant="secondary" |
|
Type=Neutral |
variant="neutral" |
|
Type=Text |
variant="text" |
|
Type=Danger / Danger=True |
variant="danger" |
|
Size=Large |
size="lg" |
|
Size=Medium |
size="md" |
|
Size=Small |
size="sm" |
|
Shape=Circle |
shape="circle" |
|
Shape=Square |
shape="square" |
|
Shape=Default |
shape="default" |
|
State=Default |
(no prop) | Default render state |
State=Hover |
(no prop) | CSS handles it |
State=Focused |
(no prop) | CSS handles it |
State=Pressed |
(no prop) | CSS handles it |
State=Disabled |
disabled |
|
State=Loading |
loading |
|
Icon Only=True |
size="icon" |
Button only |
Full Translation Example
Given this Figma MCP output:
{
"name": "Type=Primary, Size=Medium, Icon Only=False, Shape=Square, Danger=False, State=Default",
"fills": [{ "token": "Sf/Pri/Pri" }],
"textColor": "Onsf/Bra/Default",
"typography": "Button/01"
}
Translate to:
import { Button } from '@aioz-ui/core-v3/components'
;<Button variant="primary" size="md" shape="square">
Label
</Button>
Colors and typography are handled by
Buttoninternally. Apply color/typography classes manually only when building custom layouts outside of component primitives.
Core Rules
-
Token-first — Never use raw Tailwind colors or sizing.
❌ text-gray-500 bg-white border-gray-200 text-sm font-medium ✅ text-content-sec bg-sf-screen border-border-neutral text-body-02 -
Component-first — Use design system primitives over custom divs. See Component Map above.
-
Typography is atomic — Each
text-*class already encodes font-size, line-height, weight, and font-family. Never stack additional font utilities on top. -
Icons only from
@aioz-ui/icon-react— Never SVG literals, emoji, or other libraries.import { Search01Icon } from '@aioz-ui/icon-react' ;<Search01Icon size={16} className="text-icon-neutral" /> -
On-surface text — Text on a
bg-sf-*surface must use the matchingtext-onsf-*class:bg-sf-pri → text-onsf-text-pri bg-sf-error-sec → text-onsf-text-error bg-sf-neutral → text-onsf-text-neutral -
Charts — Always import from
@aioz-ui/core/components(not-v3). Always wrap in the card shell. Always provide bothcategoriesandoverwriteCategories. Readreferences/charts.mdbefore writing any chart code.
Reference Files
Open the relevant file for deep-dive API docs, full token lists, and component examples:
| File | Open When |
|---|---|
references/colors.md |
Full token → Tailwind class tables for text, background, and border tokens |
references/typography.md |
Full text-* class list with font-size, weight, and line-height specs |
references/icons.md |
Icon name transformation rule, size guide, and common icon import list |
references/components.md |
Full props, all variants, and ready-to-use code examples for every component |
references/charts.md |
LineChart, AreaChart, BarChart, DonutChart — APIs, variants, legend, hidden-series |
