Figma i 5 wariantów brandu: jak opanować komponenty, zanim design system zacznie się sypać

Jak opanować komponenty w Figma przy 5 wariantach brandu: tokeny, style, variants, biblioteki, naming, wersjonowanie i porządki z duplikatami — bez rozsypywania design systemu.
02 maja 2026
blog

Dlaczego wiele wariantów brandu szybko prowadzi do chaosu w komponentach Figma?

Bo każdy dodatkowy wariant brandu działa jak mnożnik złożoności: trzeba go uwzględnić w niemal każdym komponencie, w każdym stanie i w każdej kombinacji właściwości. W praktyce rośnie liczba wariantów komponentów (Variant properties), stylów (kolor, typografia, efekty) i zależności między nimi, a to szybko przekracza próg „ogarnialności” w bibliotece.

Chaos pojawia się, gdy w Figma przestaje istnieć jedno, stabilne źródło prawdy dla wyglądu i nazewnictwa. Różne osoby zaczynają rozwiązywać ten sam problem inaczej (np. osobne komponenty na brand A/B/C zamiast wspólnej struktury), przez co biblioteka dubluje elementy, a różnice między brandami nie są konsekwentnie modelowane.

  • Mnożenie kombinacji – jeśli komponent ma kilka właściwości (np. rozmiar, typ, stan), dołożenie „brand” jako kolejnej właściwości tworzy lawinę kombinacji, które trzeba utrzymać i przetestować.
  • Rozjazd styli i tokenów – bez ścisłego powiązania komponentów ze spójnymi stylami/zmiennymi, warianty brandu są „zaszywane” lokalnie (nadpisania), co utrudnia aktualizacje i powoduje niejednolite wyniki.
  • Dublowanie komponentów – zespoły często tworzą osobne zestawy komponentów per brand, co zwiększa liczbę elementów w bibliotece i ryzyko, że poprawka trafi tylko do części z nich.
  • Spadek czytelności i używalności – rosnąca liczba wariantów i podobnie nazwanych komponentów utrudnia wyszukiwanie, wybór właściwego elementu i poprawne użycie (częstsze „pomyłki” we właściwościach).

W efekcie zamiast przewidywalnej biblioteki dostajesz system, w którym te same komponenty zachowują się inaczej zależnie od miejsca użycia, a każda zmiana brandowa lub produktowa wymaga serii ręcznych korekt i kontroli spójności.

Jak zaprojektować tokeny i style, żeby wspierały różne brandy bez mnożenia komponentów?

Klucz to rozdzielenie tego, co jest semantyką (rola w UI), od tego, co jest wartością brandową (konkretny kolor, font, promień). Komponenty powinny odwoływać się wyłącznie do tokenów semantycznych (np. color.text.primary, color.bg.surface, radius.md), a nie do „twardych” wartości typu #0055FF czy Brand Blue. Wtedy zmiana brandu polega na podmianie mapowania tokenów na wartości, a nie na tworzeniu nowych wariantów komponentów.

Praktycznie oznacza to dwuwarstwowy model tokenów: tokens semantyczne (używane w komponentach) oraz tokens bazowe (palety, skale typografii) przypisane per brand. Dla każdego brandu definiujesz zestaw bazowych wartości (np. skala kolorów, fonty, skala promieni), a następnie mapujesz je do semantyki. Komponent „Button/Primary” zawsze korzysta z color.action.primary i color.onAction.primary; w brandzie A te tokeny wskazują na jedne wartości, w brandzie B na inne.

Żeby nie mnożyć komponentów, trzeba też jasno określić, co jest elementem brandu, a co wariantem produktu/UI. W komponentach dopuszczasz warianty wynikające z zachowania i struktury (np. size, state, emphasis), a brand jest traktowany jako kontekst tokenów, nie jako dodatkowy wariant komponentu.

  • Nazewnictwo tokenów: semantyczne, oparte o role UI (tekst/tło/obramowanie/akcja/status) i poziomy (primary/secondary/subtle), bez nazw brandowych.
  • Zakres tokenizacji: tylko atrybuty, które realnie zmieniają się między brandami (kolor, typografia, radius, shadow, spacing jeśli potrzebne). Nie tokenizuj wszystkiego „na siłę”, bo utrudnisz utrzymanie.
  • Mapowanie per brand: osobne zestawy wartości (palety i skale) + mapowanie do semantyki; komponenty wskazują wyłącznie na semantykę.
  • Konsekwencja w użyciu: żadnych lokalnych override’ów w komponentach na poziomie instancji; jeśli pojawia się potrzeba, to zwykle brakuje tokenu semantycznego albo definicji roli.

W Figmie najważniejsze jest, by style/zmienne były zorganizowane tak, aby przełączanie brandu odbywało się przez zmianę zestawu wartości (np. kolekcji zmiennych/trybu), a nie przez wymianę komponentów. To utrzymuje jedną bibliotekę komponentów i pozwala skalować liczbę brandów bez eksplozji wariantów.

💡 Oddziel semantykę od brandu: komponenty odwołują się wyłącznie do tokenów ról UI (np. color.action.primary), a brand zmieniasz tylko przez podmianę mapowania tych tokenów na wartości. Traktuj brand jako kontekst tokenów (kolekcja/tryb zmiennych), nie jako wariant komponentu—unikniesz eksplozji wariantów.

Jak używać variants i properties, żeby komponent był jeden, a zachowanie i wygląd były konfigurowalne?

W Figma jeden „komponent” staje się konfigurowalny wtedy, gdy tworzysz dla niego zestaw variantów (czyli kontrolowanych wersji tego samego komponentu) i opisujesz je properties (czyli parametrami, które użytkownik instancji wybiera w panelu). Variants rozwiązują problem mnożenia osobnych komponentów „Primary/Secondary/Disabled itd.”, a properties sprawiają, że te różnice są wybierane jak ustawienia, a nie przez podmianę całego elementu.

Praktyczny model jest taki: najpierw identyfikujesz, co w komponencie realnie się zmienia i powinno być wybieralne. Z tego robisz properties o możliwie małej liczbie wartości, aby ograniczyć eksplozję kombinacji. Zmiany stricte wizualne i stanowe (np. variant stylu, state typu default/hover/pressed/disabled, size) najczęściej mapujesz na properties typu „Variant” (wartości dyskretne), a elementy opcjonalne (np. ikona, badge, opis pomocniczy) na properties logiczne (włącz/wyłącz), które pokazują/ukrywają warstwy. Tekst i inne wartości edytowalne zostawiasz jako content instancji, a nie jako kolejne varianty.

Kluczowe jest też rozdzielenie „wyglądu” od „zachowania” na poziomie właściwości. „Zachowanie” w Figma oznacza głównie stany odwzorowane variantami oraz ich interakcje w prototypie (np. on hover → przełącz na variant Hover). Wtedy jedna instancja ma spójny model: użytkownik wybiera properties, a interakcje przełączają te same properties/varianty, zamiast prowadzić do ręcznych podmian komponentów.

Aby komponent pozostał „jeden”, dbaj o jednoznaczne nazwy properties (np. Type, State, Size) i unikaj dublowania znaczeń (np. nie twórz osobno variantów „Disabled” i jednocześnie property „Disabled=true”). Każdy wymiar zmiany powinien mieć jedno miejsce w modelu, a w wariantach powinny istnieć tylko te kombinacje, które są realnie potrzebne w produkcie. Dzięki temu instancje są przewidywalne, a edycja systemu sprowadza się do aktualizacji jednego komponentu i jego właściwości, zamiast utrzymywania wielu równoległych komponentów.

Jak zorganizować biblioteki i zależności, żeby zespoły nie tworzyły „kopii na wszelki wypadek”?

Kopie „na wszelki wypadek” powstają, gdy nie ma jasnego źródła prawdy, a użycie komponentu z biblioteki jest ryzykowne: zależności są nieczytelne, komponenty są zbyt „ciężkie” (ciągną niepotrzebne style), a zmiany mogą zepsuć lokalny ekran. Organizacja bibliotek i zależności powinna więc minimalizować niepewność: z góry wiadomo, skąd brać komponenty, co jest stabilne, co można bezpiecznie modyfikować i jaki jest koszt aktualizacji.

Praktycznie działa układ warstwowy: jedna biblioteka bazowa jako jedyne źródło tokenów i prymitywów (kolory, typografia, odstępy, siatki, ikony, podstawowe komponenty UI) oraz osobne biblioteki dla elementów specyficznych dla wariantów brandu lub produktowych „patternów”. Kluczowe jest, aby biblioteki wyższego poziomu zależały od niższych (dziedziczyły tokeny i prymitywy), a nie odwrotnie; dzięki temu zespoły nie muszą kopiować komponentów tylko po to, by „odciąć się” od zmian w innych częściach systemu.

Żeby nie prowokować kopiowania, zależności muszą być przewidywalne i lekkie. Komponenty w bazie powinny opierać się na tokenach, a nie na „wypalonych” wartościach, oraz unikać ukrytych powiązań (np. komponent przycisku, który zakłada konkretny kolor tła ekranu). Dla wariantów brandu lepsze jest podmianianie tokenów i stylów w dedykowanej bibliotece wariantu niż duplikowanie całych komponentów; zespół widzi wtedy, że różnica wynika z konfiguracji, a nie z równoległej implementacji.

Równie ważne jest zarządzanie wersjami i publikacją: biblioteki powinny być publikowane jako konkretne, opisane wersje, a aktualizacja w plikach produktowych powinna być świadomą decyzją, nie „przypadkowym” kliknięciem. Jeśli zespół wie, że może pozostać na stabilnej wersji i zaplanować migrację, rzadziej kopiuje komponent, by „zamrozić” zachowanie. Wspiera to także jednoznaczne oznaczanie elementów stabilnych vs. eksperymentalnych (na poziomie nazw/deskrypcji komponentów i stron w bibliotece), aby nie trzeba było tworzyć kopii tylko z obawy przed zmianą API komponentu.

Na koniec: ogranicz możliwość modyfikacji przez narzucenie granic, gdzie wolno dostosowywać. Jeżeli komponenty mają przewidziane punkty konfiguracji (np. warianty, rozmiary, stany) i jasne zasady „nie odpinamy instancji, chyba że…”, zespoły nie muszą tworzyć duplikatów, by osiągnąć lokalny efekt. Kopiowanie staje się wyjątkiem uzasadnionym konkretną potrzebą, a nie standardową strategią zabezpieczającą.

Jak ustalić naming i strukturę plików, żeby dało się wyszukiwać i utrzymywać komponenty?

Żeby komponenty w Figma dało się szybko znaleźć i bezpiecznie utrzymywać, naming i struktura muszą być przewidywalne: każdy element powinien mieć jednoznaczny „adres” wynikający z miejsca w bibliotece oraz spójny zapis wariantów. W praktyce oznacza to ustalenie (i konsekwentne stosowanie) jednej taksonomii: od poziomu plików (bibliotek), przez strony i sekcje, po nazwy zestawów komponentów oraz nazwy właściwości wariantów. Wyszukiwanie działa najlepiej, gdy nazwa zawiera stałe, rozpoznawalne fragmenty (np. kategoria i rola), a nie opis sytuacyjny.

Na poziomie plików przyjmij zasadę: jeden plik = jedna biblioteka o jasnym zakresie odpowiedzialności. Pliki nazywaj tak, by od razu było wiadomo, co zawierają i dla jakiego brandu/zakresu służą, np. według wzorca [System] / [Brand lub Shared] / [Zakres]. Jeśli obsługujesz kilka wariantów brandu, pilnuj rozdzielenia tego, co wspólne (shared) od tego, co brandowe — wtedy zmiany nie „rozlewają się” po całej bazie i łatwiej kontrolować publikacje bibliotek. Dodatkowo utrzymuj ten sam układ stron w każdym pliku (np. Components, Styles/Tokens, Changelog), bo nawigacja staje się nawykiem.

Na poziomie komponentów stosuj nazwy w formie ścieżek, które odzwierciedlają hierarchię i ułatwiają filtrowanie w wyszukiwarce zasobów, np. Button / Primary, Form / Field / Text, Navigation / Tabs. Pierwszy segment powinien być stabilną kategorią (co to jest), kolejne segmenty doprecyzowują rodzinę (gdzie/po co), a dopiero na końcu pojawiają się odmiany. Unikaj synonimów i „lokalnych” skrótów; jeśli zespół raz wybierze termin (np. „Field” vs „Input”), musi on być używany wszędzie.

Warianty zapisuj jako właściwości komponentu (variant properties), a nie przez dopisywanie opisów w nazwie. Kluczowe jest, aby nazwy właściwości były stałe i ograniczone do kilku najważniejszych osi (np. Variant, Size, State, Theme/Brand), a wartości były znormalizowane (np. default, hover, disabled zamiast mieszaniny „Hover”, „HOVER”, „onHover”). To pozwala filtrować i podmieniać warianty bez ręcznego szukania oraz zmniejsza liczbę duplikatów.

Dla utrzymania w czasie dodaj prostą konwencję wersjonowania i statusu, ale tak, by nie psuć wyszukiwania. Zamiast mnożyć podobne nazwy, stosuj jedno miejsce na informację o dojrzałości (np. prefix tylko tam, gdzie jest to potrzebne): [WIP] dla komponentów roboczych, a komponenty wycofywane oznaczaj konsekwentnie (np. Deprecated) i trzymaj w wydzielonej sekcji/stronie, żeby nie pojawiały się w pierwszych wynikach. Najważniejsze: raz ustalona struktura nazw nie może się zmieniać „przy okazji” refaktoru — zmiany w nazewnictwie traktuj jak zmianę API biblioteki, bo wpływają na wyszukiwanie, mapowanie w głowach ludzi i stabilność użycia komponentów.

Jak wprowadzić proces zmian i wersjonowania design systemu, żeby nie psuć produktów w trakcie?

Żeby zmiany w design systemie nie rozjeżdżały istniejących ekranów, musisz rozdzielić „rozwój” od „stabilnego użycia” i jasno określić, kiedy zmiana jest kompatybilna wstecznie, a kiedy wymaga migracji. W praktyce oznacza to utrzymywanie co najmniej dwóch stanów biblioteki: wersji stabilnej, z której korzystają produkty, oraz wersji rozwojowej, w której przygotowujesz i testujesz modyfikacje przed publikacją.

Podstawą jest semantyczne wersjonowanie (np. MAJOR.MINOR.PATCH) powiązane z regułami: PATCH to poprawki bez wpływu na API komponentu (np. drobne korekty stylu), MINOR to nowe możliwości bez łamania istniejących użyć (np. nowy wariant, nowy token), a MAJOR to zmiany niekompatybilne (np. zmiana nazw właściwości, usunięcie wariantu, przebudowa struktury komponentu). Kluczowe jest, aby „API komponentu” rozumieć jako to, co widzą i ustawiają użytkownicy komponentu: nazwy wariantów, właściwości, sloty, zachowanie auto-layoutu i sposób override’ów.

Proces wprowadzania zmian powinien minimalizować „breaking changes” poprzez okres przejściowy. Zamiast podmieniać komponent na niekompatybilny, najpierw wprowadzasz następcę jako nową wersję komponentu (np. nowa nazwa lub nowa „rodzina”), a poprzednią oznaczasz jako deprecated (wycofywaną) z jasnym terminem wsparcia. Dopiero po tym, jak produkty wykonają migrację, usuwasz stare elementy w kolejnym wydaniu MAJOR. To podejście pozwala zespołom produktowym aktualizować się w kontrolowanym tempie, bez nagłych regresji w UI.

Równolegle potrzebujesz standardu komunikacji zmian, bo nawet kompatybilna aktualizacja może wymagać świadomości (np. zmiana kontrastu, nowe stany). Każde wydanie powinno mieć krótki changelog z informacją: co się zmieniło, kogo dotyczy, czy wymaga działań w plikach produktu, oraz jaka jest rekomendowana ścieżka migracji. Jeśli zmiana jest potencjalnie ryzykowna, warunkiem publikacji powinno być przetestowanie jej na reprezentatywnych ekranach (najczęściej: najczęściej używane komponenty, kluczowe flowy) w kopii plików lub na środowisku testowym.

Ochronę produktów w trakcie zapewnia też zasada „nie zmieniaj bez potrzeby”: jeśli aktualizacja ma charakter czysto estetyczny, ale może wpływać na layout (np. inne paddingi, inna typografia), traktuj ją jak zmianę o wysokim ryzyku i rozważ wprowadzenie jej jako nowy wariant lub nowy token, zamiast modyfikować istniejące wartości. Dzięki temu zespoły mogą świadomie przełączać się na nowe ustawienia, zamiast dostać je automatycznie w istniejących ekranach.

Na koniec: wersjonowanie ma sens tylko wtedy, gdy produkty mogą trzymać się konkretnej wersji biblioteki i aktualizować ją w zaplanowanych oknach. Jeśli zespoły aktualizują się chaotycznie, będziesz mieć wiele „połówek” migracji naraz. Ustal więc rytm wydań (np. stałe okna na aktualizacje), wymagane kroki przed podbiciem wersji oraz jasne kryteria, kiedy dopuszczasz MAJOR (czyli realnie kosztowną migrację).

Jak wykryć duplikaty i „martwe” komponenty oraz bezpiecznie je usunąć?

Duplikaty to komponenty, które pełnią tę samą funkcję i wygląd (lub prawie ten sam), ale istnieją jako osobne definicje (np. skopiowane między plikami lub bibliotekami). „Martwe” komponenty to takie, które nie mają już żadnych instancji w użyciu (albo są utrzymywane wyłącznie „na wszelki wypadek” mimo braku realnych odwołań). W obu przypadkach ryzyko polega na tym, że usunięcie komponentu, który nadal jest używany, spowoduje odpięcie instancji od źródła lub utrudni aktualizacje w projekcie.

Wykrywanie zacznij od sprawdzenia użycia komponentów w bibliotece: w panelu Assets otwórz komponent (lub zestaw komponentów) i przejdź do informacji o nim, aby zobaczyć, czy i gdzie ma instancje. Komponent bez instancji jest kandydatem na „martwy”, ale zanim go uznasz za zbędny, zweryfikuj, czy nie jest używany w innych plikach, które korzystają z tej samej opublikowanej biblioteki (w praktyce oznacza to sprawdzenie, czy biblioteka jest podpięta do innych plików zespołu i czy tam istnieją instancje). Duplikaty najczęściej rozpoznasz po identycznej nazwie/roli (np. dwa „Button/Primary”), bardzo podobnych właściwościach oraz tym, że instancje w różnych miejscach wskazują na różne źródła (inna biblioteka lub inny komponent nadrzędny). Pomocne jest też wyszukiwanie po nazwie w Assets oraz porównanie struktury warstw i właściwości (np. Auto Layout, style tekstu/koloru, warianty).

Bezpieczne usuwanie powinno być zawsze poprzedzone migracją, a nie „kasowaniem w ciemno”. Najpierw wybierz jeden komponent jako kanoniczny (ten, który ma prawidłową strukturę, nazewnictwo i jest zgodny z aktualnym brandem), a instancje duplikatów podmień na instancje komponentu kanonicznego. W Figmie zrobisz to przez zamianę komponentu instancji na inny komponent (np. z poziomu właściwości instancji lub przez wybór innego komponentu w zasobach), pilnując, by zachować dopasowanie wariantów i właściwości. Dopiero gdy liczba instancji duplikatu spadnie do zera (we wszystkich plikach korzystających z biblioteki), komponent można usunąć z biblioteki i opublikować zmianę, aby użytkownicy biblioteki nie mieli już do niego dostępu.

W przypadku „martwych” komponentów procedura jest podobna, z tą różnicą, że nie ma czego migrować: po potwierdzeniu braku instancji w całym zakresie użycia biblioteki usuń komponent i opublikuj bibliotekę. Dobrą praktyką jest wykonywanie takich porządków w kontrolowanych paczkach zmian (mniejsza liczba usunięć na publikację), żeby łatwiej było wychwycić ewentualne pomyłki oraz szybko zidentyfikować, co dokładnie zostało usunięte, jeśli ktoś zgłosi problem po aktualizacji biblioteki.

💡 Nie usuwaj „w ciemno”: najpierw wybierz komponent kanoniczny, podmień na niego wszystkie instancje duplikatów i dopiero gdy ich użycie spadnie do zera we wszystkich plikach, kasuj i publikuj. Porządki rób w małych paczkach zmian, żeby łatwo namierzyć ewentualne regresje po aktualizacji biblioteki.

Jakie zasady współpracy (review, ownership) najbardziej redukują chaos przy wielu brandach?

Najmniej chaosu daje rozdzielenie odpowiedzialności na dwa poziomy: „platforma” (fundament systemu) i „brand” (warianty). Ownership powinien być jawny i przypisany do konkretnych obszarów biblioteki, tak aby każda zmiana miała jednego decydenta oraz z góry znaną ścieżkę akceptacji. W praktyce oznacza to: jedna rola/zespół odpowiada za komponenty bazowe, tokeny globalne i zasady API komponentów, a osobne osoby/zespoły odpowiadają za mapowanie tokenów na dany brand (semantyka) i wyjątki brandowe. Bez takiego podziału łatwo o sytuację, w której różne marki „naprawiają” te same komponenty na różne sposoby, co multiplikuje warianty i rozjeżdża zachowanie.

Review powinien mieć stałe bramki jakości i być symetryczny dla wszystkich marek: ten sam minimalny zestaw kryteriów i ten sam przepływ od propozycji do publikacji. Kluczowe jest, by rozróżniać typ zmiany, bo innego rygoru wymaga modyfikacja fundamentu (wpływa na wszystkie marki), a innego dopisanie mapowania tokenów dla pojedynczego brandu. Najlepiej działa zasada: zmiany „platformowe” nie wchodzą bez przeglądu właściciela platformy i sprawdzenia wpływu na wszystkie brandy, a zmiany „brandowe” nie wchodzą bez przeglądu właściciela danego brandu i potwierdzenia, że nie naruszają kontraktu komponentu (np. nie wymuszają nowych wariantów, jeśli problem da się rozwiązać tokenami lub konfiguracją).

Żeby review faktycznie redukowało chaos, potrzebne są proste, egzekwowalne reguły: jedna ścieżka zgłoszenia zmiany, jeden „source of truth” (gdzie to jest zatwierdzone) oraz zasada, że publikacja do biblioteki jest ostatnim krokiem po akceptacji, a nie miejscem eksperymentów. W Figma sprowadza się to do konsekwencji w pracy na gałęziach/trybie review (nie bezpośrednio na głównej bibliotece) oraz do wymagania, by każda propozycja wskazywała: co się zmienia, kogo dotyka (które brandy), czy jest to zmiana API komponentu czy tylko tokenów, i jak będzie utrzymana w kolejnych wariantach.

icon

Formularz kontaktowyContact form

Imię *Name
NazwiskoSurname
Adres e-mail *E-mail address
Telefon *Phone number
UwagiComments