Saltar al contenido

Code Connect

Beta

Có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 FigmaEn 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 · OpenNada: 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=Trueerror="…" con el texto del hint, que es el mensaje.
State=FilleddefaultValue="…" en vez de placeholder.
Un ícono por instance swapSe 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:check

El 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:

  1. Desde el MCP de Figma (Claude Code, Cursor): por cada template, add_code_connect_map con el nodeId, el source, el componentName y el contenido del archivo como template, con templateDataJson: {"isParserless": true, "nestable": <metadata.nestable>}.
  2. Desde la CLI, con el figma.config.json que ya está en la raíz:
FIGMA_ACCESS_TOKEN=… npx figma connect publish

npx 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

  1. Copiá el template más parecido de figma/ y cambiá la cabecera: url con el node-id del set, source y component con el archivo y el export de registry/ds.
  2. 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.
  3. Si el set cambió en Figma, regenerá el snapshot: el script scripts/figma-scan-components.js se pega en la consola de plugins de Figma y devuelve el JSON para figma/components.json.
  4. npm run figma:check tiene que quedar en cero problemas.

Índice Figma ↔ código

Set en FigmaPáginaEn códigoTemplate
.Accordion itemAccordionAccordionItemregistry/ds/accordion.tsxfigma/accordion-item.figma.ts
AccordionAccordionAccordionregistry/ds/accordion.tsxfigma/accordion.figma.ts
AlertAlert, Toast & BannerAlertregistry/ds/alert.tsxfigma/alert.figma.ts
BannerAlert, Toast & BannerBannerregistry/ds/alert.tsxfigma/banner.figma.ts
ToastAlert, Toast & BanneruseToastregistry/ds/toast.tsxfigma/toast.figma.ts
AvatarAvatarAvatarregistry/ds/avatar.tsxfigma/avatar.figma.ts
Avatar groupAvatarAvatarGroupregistry/ds/avatar.tsxfigma/avatar-group.figma.ts
BadgeBadge & ChipBadgeregistry/ds/badge.tsxfigma/badge.figma.ts
Badge GroupBadge & ChipBadgeGroupregistry/ds/badge.tsxfigma/badge-group.figma.ts
ChipBadge & ChipChipregistry/ds/badge.tsxfigma/chip.figma.ts
.Breadcrumb itemBreadcrumbBreadcrumbItemregistry/ds/breadcrumb.tsxfigma/breadcrumb-item.figma.ts
BreadcrumbBreadcrumbBreadcrumbregistry/ds/breadcrumb.tsxfigma/breadcrumb.figma.ts
ButtonButtonButtonregistry/ds/button.tsxfigma/button.figma.ts
CardCardCardregistry/ds/card.tsxfigma/card.figma.ts
CheckboxCheckbox & RadioCheckboxregistry/ds/checkbox.tsxfigma/checkbox.figma.ts
Checkbox itemCheckbox & RadioCheckboxregistry/ds/checkbox.tsxfigma/checkbox-item.figma.ts
RadioCheckbox & RadioRadioregistry/ds/radio.tsxfigma/radio.figma.ts
Radio itemCheckbox & RadioRadioregistry/ds/radio.tsxfigma/radio-item.figma.ts
ComboboxComboboxComboboxregistry/ds/combobox.tsxfigma/combobox.figma.ts
CalendarDate pickerCalendarregistry/ds/calendar.tsxfigma/calendar.figma.ts
Date pickerDate pickerDatePickerregistry/ds/date-picker.tsxfigma/date-picker.figma.ts
DividerDividerDividerregistry/ds/divider.tsxfigma/divider.figma.ts
DrawerDrawerDrawerregistry/ds/drawer.tsxfigma/drawer.figma.ts
.Dropdown itemDropdown menuMenuItemregistry/ds/menu.tsxfigma/dropdown-item.figma.ts
Dropdown menuDropdown menuMenuregistry/ds/menu.tsxfigma/dropdown-menu.figma.ts
Empty stateEmpty stateEmptyStateregistry/ds/empty-state.tsxfigma/empty-state.figma.ts
File uploadFile uploadFileUploadregistry/ds/file-upload.tsxfigma/file-upload.figma.ts
.Footer linkFooterFooterLinkregistry/ds/footer.tsxfigma/footer-link.figma.ts
FooterFooterFooterregistry/ds/footer.tsxfigma/footer.figma.ts
InputInputInputregistry/ds/input.tsxfigma/input.figma.ts
Input CodeInputInputCoderegistry/ds/input-code.tsxfigma/input-code.figma.ts
Rounded InputInputInputregistry/ds/input.tsxfigma/rounded-input.figma.ts
TextareaInputTextarearegistry/ds/input.tsxfigma/textarea.figma.ts
LinkLinkLinkregistry/ds/link.tsxfigma/link.figma.ts
.Modal footerModalModalFooterregistry/ds/modal.tsxfigma/modal-footer.figma.ts
.Modal headerModalModalHeaderregistry/ds/modal.tsxfigma/modal-header.figma.ts
ModalModalModalregistry/ds/modal.tsxfigma/modal.figma.ts
.Navbar linkNavbarNavbarLinkregistry/ds/navbar.tsxfigma/navbar-link.figma.ts
.Navbar menu linkNavbarNavbarMenuLinkregistry/ds/navbar.tsxfigma/navbar-menu-link.figma.ts
.Navbar mobile linkNavbarNavbarMobileLinkregistry/ds/navbar.tsxfigma/navbar-mobile-link.figma.ts
NavbarNavbarNavbarregistry/ds/navbar.tsxfigma/navbar.figma.ts
Navbar drawerNavbarNavbarMobileregistry/ds/navbar.tsxfigma/navbar-drawer.figma.ts
Navbar dropdownNavbarNavbarMenuregistry/ds/navbar.tsxfigma/navbar-dropdown.figma.ts
Number fieldNumber fieldNumberFieldregistry/ds/number-field.tsxfigma/number-field.figma.ts
PaginationPaginationPaginationregistry/ds/pagination.tsxfigma/pagination.figma.ts
Pagination — ArrowsPaginationPaginationregistry/ds/pagination.tsxfigma/pagination-arrows.figma.ts
Pagination — CompactPaginationPaginationregistry/ds/pagination.tsxfigma/pagination-compact.figma.ts
Pagination — Prev/NextPaginationPaginationregistry/ds/pagination.tsxfigma/pagination-prev-next.figma.ts
PopoverPopoverPopoverregistry/ds/popover.tsxfigma/popover.figma.ts
ProgressProgressProgressregistry/ds/progress.tsxfigma/progress.figma.ts
Multi-selectSelect & MenuSelectregistry/ds/select.tsxfigma/multi-select.figma.ts
SelectSelect & MenuSelectregistry/ds/select.tsxfigma/select.figma.ts
.Sidebar itemSidebarSidebarItemregistry/ds/sidebar.tsxfigma/sidebar-item.figma.ts
.Sidebar sub-itemSidebarSidebarItemregistry/ds/sidebar.tsxfigma/sidebar-sub-item.figma.ts
SidebarSidebarSidebarregistry/ds/sidebar.tsxfigma/sidebar.figma.ts
SkeletonSkeletonSkeletonregistry/ds/skeleton.tsxfigma/skeleton.figma.ts
SliderSliderSliderregistry/ds/slider.tsxfigma/slider.figma.ts
SpinnerSpinnerSpinnerregistry/ds/spinner.tsxfigma/spinner.figma.ts
.Step itemStepperStepperregistry/ds/stepper.tsxfigma/step-item.figma.ts
StepperStepperStepperregistry/ds/stepper.tsxfigma/stepper.figma.ts
SwitchSwitchSwitchregistry/ds/switch.tsxfigma/switch.figma.ts
.Table cellTableTableCellregistry/ds/table.tsxfigma/table-cell.figma.ts
TableTableTableregistry/ds/table.tsxfigma/table.figma.ts
.Tab itemTabsTabregistry/ds/tabs.tsxfigma/tab-item.figma.ts
TabsTabsTabsregistry/ds/tabs.tsxfigma/tabs.figma.ts
.Toggle itemToggle groupToggleItemregistry/ds/toggle-group.tsxfigma/toggle-item.figma.ts
Toggle groupToggle groupToggleGroupregistry/ds/toggle-group.tsxfigma/toggle-group.figma.ts
TooltipTooltipTooltipregistry/ds/tooltip.tsxfigma/tooltip.figma.ts