Code Connect
BetaCómo cada set de Figma se traduce al componente de código, qué está listo y qué falta para verlo en Dev Mode.
Code Connect es la función de Figma que, al seleccionar una instancia en
Dev Mode, muestra el snippet real del componente de código en vez del CSS
genérico que Figma inventa. Un diseñador elige Style=Stroke, Size=lg en el
panel de propiedades y el developer ve <Button variant="stroke" size="lg">.
Polen tiene ese mapeo escrito para todos los sets públicos de 🌻 FDS
Components y para los sub-componentes privados que tienen equivalente en
código (.Tab item, .Modal header, .Sidebar item…): 68 templates en la
carpeta figma/ del repo, uno por set.
Cómo se traduce
Cada template lee las propiedades de la instancia seleccionada y arma el snippet con estas reglas, iguales en los 68:
| En Figma | En código |
|---|---|
Una variante con el valor por defecto del código (Size=md, Style=Fill) | Se omite la prop, como en el playground. |
State = Hover · Focus · Pressed · Open | Nada: son automáticos. Solo Disabled escribe disabled. |
Show label, Show hint, Show action… | La prop aparece o no (label="…"); sin label visible se pasa aria-label. |
State=Error o Destructive=True | error="…" con el texto del hint, que es el mensaje. |
State=Filled | defaultValue="…" en vez de placeholder. |
| Un ícono por instance swap | Se resuelve con el template del ícono anidado (iconLeft={<Icono />}). |
| Un componente anidado (el Button de un Alert, el Avatar del Navbar) | Lo renderiza su propio template, con sus propias propiedades. |
| Ítems repetidos (tabs, pasos, links del footer) | Se recorren y cada uno es un hijo o un objeto del array (steps, items). |
Recetas (Modal › Type, Card › Type) | Composición base más un comentario con el nombre de la receta y el link a la doc. |
Lo que no existe en código (Input Tags, Tabs Marker, Modal footer Carousel) | Se emite lo más cercano y un comentario // que lo dice. |
Y un Toast no genera JSX: genera la llamada toast({ title, color, action })
del hook useToast().
Verificación sin Figma
Como no se puede publicar, los templates se prueban en el repo contra un
snapshot real de los sets (figma/components.json, generado con la Plugin
API):
npm run figma:checkEl validador (scripts/check-figma-templates.ts) hace cuatro cosas por
template: comprueba que cada propiedad que lee existe en el set con ese tipo y
que cada getEnum mapea todas las opciones de la variante; exige que toda
propiedad del set esté leída o declarada en un comentario // figma-ignore:
con su motivo; lo ejecuta con cada combinación de variantes y booleanos
(4.227 ejecuciones) y rechaza cualquier snippet con un valor sin resolver; y
compila los 1.585 snippets distintos que salen contra registry/ds con
TypeScript. Las tres primeras corren también en npm test.
Publicar cuando el plan lo permita
Con un seat Dev o Full en un plan Organization, hay dos caminos:
- Desde el MCP de Figma (Claude Code, Cursor): por cada template,
add_code_connect_mapcon elnodeId, elsource, elcomponentNamey el contenido del archivo comotemplate, contemplateDataJson: {"isParserless": true, "nestable": <metadata.nestable>}. - Desde la CLI, con el
figma.config.jsonque ya está en la raíz:
FIGMA_ACCESS_TOKEN=… npx figma connect publishnpx figma connect unpublish lo revierte. Los templates son parserless
(.figma.ts con figma.code), el formato que Figma recomienda hoy.
Agregar o cambiar un template
- Copiá el template más parecido de
figma/y cambiá la cabecera:urlcon elnode-iddel set,sourceycomponentcon el archivo y el export deregistry/ds. - Leé cada propiedad del set con el método de su tipo (
getString,getBoolean,getEnum,getInstanceSwap). Lo que no tenga equivalente va en// figma-ignore:con el motivo entre paréntesis. - Si el set cambió en Figma, regenerá el snapshot: el script
scripts/figma-scan-components.jsse pega en la consola de plugins de Figma y devuelve el JSON parafigma/components.json. npm run figma:checktiene que quedar en cero problemas.
Índice Figma ↔ código
| Set en Figma | Página | En código | Template |
|---|---|---|---|
| .Accordion item | Accordion | AccordionItemregistry/ds/accordion.tsx | figma/accordion-item.figma.ts |
| Accordion | Accordion | Accordionregistry/ds/accordion.tsx | figma/accordion.figma.ts |
| Alert | Alert, Toast & Banner | Alertregistry/ds/alert.tsx | figma/alert.figma.ts |
| Banner | Alert, Toast & Banner | Bannerregistry/ds/alert.tsx | figma/banner.figma.ts |
| Toast | Alert, Toast & Banner | useToastregistry/ds/toast.tsx | figma/toast.figma.ts |
| Avatar | Avatar | Avatarregistry/ds/avatar.tsx | figma/avatar.figma.ts |
| Avatar group | Avatar | AvatarGroupregistry/ds/avatar.tsx | figma/avatar-group.figma.ts |
| Badge | Badge & Chip | Badgeregistry/ds/badge.tsx | figma/badge.figma.ts |
| Badge Group | Badge & Chip | BadgeGroupregistry/ds/badge.tsx | figma/badge-group.figma.ts |
| Chip | Badge & Chip | Chipregistry/ds/badge.tsx | figma/chip.figma.ts |
| .Breadcrumb item | Breadcrumb | BreadcrumbItemregistry/ds/breadcrumb.tsx | figma/breadcrumb-item.figma.ts |
| Breadcrumb | Breadcrumb | Breadcrumbregistry/ds/breadcrumb.tsx | figma/breadcrumb.figma.ts |
| Button | Button | Buttonregistry/ds/button.tsx | figma/button.figma.ts |
| Card | Card | Cardregistry/ds/card.tsx | figma/card.figma.ts |
| Checkbox | Checkbox & Radio | Checkboxregistry/ds/checkbox.tsx | figma/checkbox.figma.ts |
| Checkbox item | Checkbox & Radio | Checkboxregistry/ds/checkbox.tsx | figma/checkbox-item.figma.ts |
| Radio | Checkbox & Radio | Radioregistry/ds/radio.tsx | figma/radio.figma.ts |
| Radio item | Checkbox & Radio | Radioregistry/ds/radio.tsx | figma/radio-item.figma.ts |
| Combobox | Combobox | Comboboxregistry/ds/combobox.tsx | figma/combobox.figma.ts |
| Calendar | Date picker | Calendarregistry/ds/calendar.tsx | figma/calendar.figma.ts |
| Date picker | Date picker | DatePickerregistry/ds/date-picker.tsx | figma/date-picker.figma.ts |
| Divider | Divider | Dividerregistry/ds/divider.tsx | figma/divider.figma.ts |
| Drawer | Drawer | Drawerregistry/ds/drawer.tsx | figma/drawer.figma.ts |
| .Dropdown item | Dropdown menu | MenuItemregistry/ds/menu.tsx | figma/dropdown-item.figma.ts |
| Dropdown menu | Dropdown menu | Menuregistry/ds/menu.tsx | figma/dropdown-menu.figma.ts |
| Empty state | Empty state | EmptyStateregistry/ds/empty-state.tsx | figma/empty-state.figma.ts |
| File upload | File upload | FileUploadregistry/ds/file-upload.tsx | figma/file-upload.figma.ts |
| .Footer link | Footer | FooterLinkregistry/ds/footer.tsx | figma/footer-link.figma.ts |
| Footer | Footer | Footerregistry/ds/footer.tsx | figma/footer.figma.ts |
| Input | Input | Inputregistry/ds/input.tsx | figma/input.figma.ts |
| Input Code | Input | InputCoderegistry/ds/input-code.tsx | figma/input-code.figma.ts |
| Rounded Input | Input | Inputregistry/ds/input.tsx | figma/rounded-input.figma.ts |
| Textarea | Input | Textarearegistry/ds/input.tsx | figma/textarea.figma.ts |
| Link | Link | Linkregistry/ds/link.tsx | figma/link.figma.ts |
| .Modal footer | Modal | ModalFooterregistry/ds/modal.tsx | figma/modal-footer.figma.ts |
| .Modal header | Modal | ModalHeaderregistry/ds/modal.tsx | figma/modal-header.figma.ts |
| Modal | Modal | Modalregistry/ds/modal.tsx | figma/modal.figma.ts |
| .Navbar link | Navbar | NavbarLinkregistry/ds/navbar.tsx | figma/navbar-link.figma.ts |
| .Navbar menu link | Navbar | NavbarMenuLinkregistry/ds/navbar.tsx | figma/navbar-menu-link.figma.ts |
| .Navbar mobile link | Navbar | NavbarMobileLinkregistry/ds/navbar.tsx | figma/navbar-mobile-link.figma.ts |
| Navbar | Navbar | Navbarregistry/ds/navbar.tsx | figma/navbar.figma.ts |
| Navbar drawer | Navbar | NavbarMobileregistry/ds/navbar.tsx | figma/navbar-drawer.figma.ts |
| Navbar dropdown | Navbar | NavbarMenuregistry/ds/navbar.tsx | figma/navbar-dropdown.figma.ts |
| Number field | Number field | NumberFieldregistry/ds/number-field.tsx | figma/number-field.figma.ts |
| Pagination | Pagination | Paginationregistry/ds/pagination.tsx | figma/pagination.figma.ts |
| Pagination — Arrows | Pagination | Paginationregistry/ds/pagination.tsx | figma/pagination-arrows.figma.ts |
| Pagination — Compact | Pagination | Paginationregistry/ds/pagination.tsx | figma/pagination-compact.figma.ts |
| Pagination — Prev/Next | Pagination | Paginationregistry/ds/pagination.tsx | figma/pagination-prev-next.figma.ts |
| Popover | Popover | Popoverregistry/ds/popover.tsx | figma/popover.figma.ts |
| Progress | Progress | Progressregistry/ds/progress.tsx | figma/progress.figma.ts |
| Multi-select | Select & Menu | Selectregistry/ds/select.tsx | figma/multi-select.figma.ts |
| Select | Select & Menu | Selectregistry/ds/select.tsx | figma/select.figma.ts |
| .Sidebar item | Sidebar | SidebarItemregistry/ds/sidebar.tsx | figma/sidebar-item.figma.ts |
| .Sidebar sub-item | Sidebar | SidebarItemregistry/ds/sidebar.tsx | figma/sidebar-sub-item.figma.ts |
| Sidebar | Sidebar | Sidebarregistry/ds/sidebar.tsx | figma/sidebar.figma.ts |
| Skeleton | Skeleton | Skeletonregistry/ds/skeleton.tsx | figma/skeleton.figma.ts |
| Slider | Slider | Sliderregistry/ds/slider.tsx | figma/slider.figma.ts |
| Spinner | Spinner | Spinnerregistry/ds/spinner.tsx | figma/spinner.figma.ts |
| .Step item | Stepper | Stepperregistry/ds/stepper.tsx | figma/step-item.figma.ts |
| Stepper | Stepper | Stepperregistry/ds/stepper.tsx | figma/stepper.figma.ts |
| Switch | Switch | Switchregistry/ds/switch.tsx | figma/switch.figma.ts |
| .Table cell | Table | TableCellregistry/ds/table.tsx | figma/table-cell.figma.ts |
| Table | Table | Tableregistry/ds/table.tsx | figma/table.figma.ts |
| .Tab item | Tabs | Tabregistry/ds/tabs.tsx | figma/tab-item.figma.ts |
| Tabs | Tabs | Tabsregistry/ds/tabs.tsx | figma/tabs.figma.ts |
| .Toggle item | Toggle group | ToggleItemregistry/ds/toggle-group.tsx | figma/toggle-item.figma.ts |
| Toggle group | Toggle group | ToggleGroupregistry/ds/toggle-group.tsx | figma/toggle-group.figma.ts |
| Tooltip | Tooltip | Tooltipregistry/ds/tooltip.tsx | figma/tooltip.figma.ts |