← Wszystkie case studiesCase study · Figma-to-Code

Projekty z Figmy zamieniane w gotowy do wdrożenia kod frontendu

Produkcyjny system, który zamienia projekty z Figmy w czysty, gotowy do wdrożenia kod frontendu — wielomodalny LLM działa na JSON pliku i jego wyrenderowanych pikselach, osadzony we wzorcach komponentów danego projektu.

Stack
Python · wielomodalny LLM · RAG · LangChain · Pydantic
Zakres
Generowanie kodu z projektu (design-to-code)
Niezawodność
~15% rozjechanych klatek → wyłapane przez walidację pixel-diff
Problem

Plik Figmy to nie specyfikacja — to niejednoznaczny zbiór wskazówek

Większość narzędzi design-to-code ignoruje to samo: plik Figmy nie jest specyfikacją, tylko zbiorem wizualnych wskazówek. Przyciski nie mają nazw semantycznych. Design tokens żyją w osobnej bibliotece. Reguły auto-layoutu znaczą co innego w różnych kontekstach, a projekt zostawia to wszystko domyślne.

Skieruj na tę niejednoznaczność zwykły LLM, a wypełni luki zgadywaniem. Halucynuje nazwy klas, wymyśla propy, które nie istnieją, i produkuje kod, który renderuje się źle już przy pierwszym uruchomieniu. Wynik wygląda wiarygodnie i wykłada się na review — co jest gorsze niż brak wyniku.

Architektura

Dwa sygnały — JSON i vision — łączone przed generowaniem

System parsuje JSON eksportowany z Figmy i wyciąga hierarchię komponentów, design tokens oraz reguły constraintów. Warstwa RAG pobiera następnie pasujące wzorce komponentów z bazy wiedzy specyficznej dla danego repozytorium, więc model generuje kod zgodny z istniejącymi konwencjami projektu, a nie generyczny boilerplate.

Równolegle wielomodalny vision działa na wyrenderowanej klatce i wyłapuje to, co JSON pomija — nachodzące się elementy, rytm wizualny, breakpointy responsywne. Oba sygnały są łączone przed generowaniem, a ustrukturyzowane wyjścia przez Pydantic wymuszają, że każda nazwa komponentu, prop i import się resolvują, zanim powstanie jakikolwiek plik.

Co się psuło

Zagnieżdżone komponenty i fix, który je oswoił

Zagnieżdżone komponenty były najtrudniejszym przypadkiem na produkcji. Gdy karta zawiera badge, który zawiera ikonę, okno kontekstu wypełnia się szumem komponentu-rodzica, a model zaczyna wymyślać nazwy propów, żeby połączyć to, czego już wyraźnie nie widzi.

Fixem był hierarchiczny chunking: najpierw generujemy komponenty liściowe, cache'ujemy ich schematy i wstrzykujemy do kontekstu rodzica tylko właściwy interfejs. Rodzic nie rozumuje już nad surowymi dziećmi — rozumuje nad ich zresolvowanymi kontraktami, a wymyślane propy przestają się pojawiać.

Walidacja

Nic nie trafia dalej, dopóki piksele się nie zgadzają

Między generowaniem a dostarczeniem stoją dwie bramki. Pierwszą wymusza Pydantic: każda nazwa komponentu, prop i import muszą się resolvować, zanim powstanie plik, więc strukturalnie zepsuty kod nigdy nie opuszcza pipeline'u.

Druga bramka jest wizualna. Skrajne przypadki auto-layoutu powodowały rozjechany wynik w ~15% klatek, więc krok walidacji renderuje wygenerowany kod headlessowo i porównuje piksele z oryginalną klatką. Niepowodzenia wracają do kolejki z diffem jako dodatkowym kontekstem, więc model poprawia się względem konkretnej rozbieżności, a nie zgaduje ponownie. Klient dostaje kod, o którym już wiadomo, że renderuje się tak jak projekt, a działa to tylko dlatego, że błędny wynik jest tu wykrywalny maszynowo, a nie kwestią wyczucia.

Narzędzie Figma-to-Code: podgląd wireframe’u z Figmy po lewej, wygenerowany React/TSX po prawej i log pipeline’u przechodzący każdy etap aż do finalnej walidacji.
Rys. 01Narzędzie w produkcji — wireframe z Figmy staje się kodem React/TSX, a log pipeline’u przechodzi każdy etap aż do finalnej walidacji.
Bezpłatny audyt procesów

Zobacz, jak wyglądałoby to w Twoich procesach.

Skontaktuj się

30 minut · wskazujemy 3 najlepsze obszary do automatyzacji · bez zobowiązań