
Jednorazowo zaprojektowany layout potrafi wyglądać świetnie, ale bez systemu szybko się „rozsypuje”. Nowe widoki, warianty, języki, tryb ciemny, zmiany w brandingu — wszystko to mnoży ręczne poprawki i niespójności. Design system przenosi decyzje wizualne z poziomu pojedynczego ekranu na poziom zasad, komponentów i tokenów. Dzięki temu projekt rośnie przewidywalnie, a zespół nie walczy o każdy piksel. Najważniejsze jest połączenie: biblioteka komponentów (w narzędziu graficznym), język decyzji (tokeny) oraz jasno zdefiniowany eksport do kodu.
Zasady to reguły wizualne: siatki, rytm, typografia, kolor, ruch, obraz. Komponenty to gotowe klocki interfejsu (przycisk, karta, baner, pasek nawigacji) w wariantach stanu i rozmiaru. Tokeny to najmniejsze, nazwane decyzje wizualne (np. odstęp 8 px, kolor „brand/primary/600”, promień 12 px), które komponenty zużywają jak „paliwo”. Jeśli zmienisz token, zmienią się wszystkie komponenty, które go używają — bez ręcznego przepinania stu plików.
Najprostszy i najskuteczniejszy zabieg to przyjęcie jednego modułu bazowego (np. 8 px) i jego wielokrotności dla odstępów, rozmiarów ikon, promieni i wysokości elementów. Siatka kolumn (np. 12 na desktopie, 4–6 na mobile) powinna uwzględniać marginesy bezpieczne oraz wyrównania do typografii. Dzięki modulowi 8 px rozwiążesz większość konfliktów przestrzennych: marginesy „zaskakują”, elementy nie pływają, a projekt wygląda spójnie nawet po rozbudowie.
Zdefiniuj skalę tekstu w 6–8 poziomach (np. display, h1–h4, body, caption) oraz pary rozmiar/interlinia dopasowane do gęstości treści. Jeden krój (lub sensowna para) wystarczy w większości przypadków. Dla treści akapitowych trzymaj długość wiersza 60–75 znaków i kontrast co najmniej odpowiadający standardom dostępności. Z punktu widzenia front-endu istotne, aby style miały stabilne nazwy (np. text/body/md), a nie „Body copy nowy 3”.
Podziel kolory na semantyczne (primary, secondary, success, warning, error, info) oraz neutralne (odcienie tła i tekstu). Każdej rodzinie przypisz stopnie jasności (np. 50–900) oraz pary tekst/tło zapewniające czytelność w jasnym i ciemnym motywie. W makiecie używaj nazw semantycznych, a nie numerów HEX — to pozwala później podmienić brand bez przepisywania ekranów.
Każdy komponent powinien mieć z góry ustalone trzy wymiary zmienności: stan (default, hover, focus, active, disabled, loading), wariant (np. solid, outline, ghost, tonal) i rozmiar (sm, md, lg). Zamiast mnożyć „nowe typy”, trzymaj tę samą siatkę decyzji — ułatwia to zarówno projektowanie, jak i kod. W kartach i listach zdefiniuj „sloty” (media, tytuł, opis, akcje), żeby uniknąć dziesiątek podobnych wynalazków.
Tokeny to nazwy dla kolorów, odstępów, promieni, cieni, typografii i efektów. Dobrze nazwany token zdradza przeznaczenie i poziom: color.text.primary, space.200, radius.md, shadow.lg. Ustal konwencję kropkową (grupa.poddomena.poziom) i trzymaj spójność. Tokeny powiąż z komponentami — w grafice nie wpisuj wartości „na sztywno”, tylko przypinaj style oparte na tokenach. Dzięki temu zmiany „lecą” przez system jak fala, a nie jak ręczna korekta.
Nie projektuj dwóch oddzielnych światów. Ustal mapę semantyczną (np. surface/primary, text/secondary, border/muted) i zdefiniuj dla niej dwa zestawy wartości: light i dark. Komponenty nie muszą wiedzieć, jakie są konkretne HEX-y — odwołują się do tokenów semantycznych, a te „pod spodem” zmieniają wartości w zależności od motywu. W grafice utrzymuj oba motywy obok siebie i testuj kontrast dla kluczowych par.
Ruch nie jest dekoracją — komunikuje stan i hierarchię. Zdefiniuj prędkości i krzywe (np. ease-in dla wejścia, ease-out dla wyjścia, ease-in-out dla przejść), a także czasy (150–300 ms dla małych elementów, 300–500 ms dla większych). W specyfikacji komponentu pokaż: „skąd → dokąd”, „co się zmienia” (przezroczystość, przesunięcie, skala) oraz „jakie są stany pośrednie”. Unikaj ruchu o dużej amplitudzie w elementach informacyjnych — szybko męczy i obniża czytelność.
Utrzymuj jedną „prawdę” o komponentach: bibliotekę główną z wersjonowaniem (v1, v1.1 itd.) i changelogiem. Zablokuj edycje komponentów bezpośrednio w projektach produktowych — wprowadzaj zmiany w źródłowej bibliotece i publikuj nową wersję. Makiety konsumują komponenty przez instance swap; od razu widać, które ekrany są na starych komponentach. Dla prototypów eksperymentalnych utrzymuj osobny plik sandbox, ale nie mieszaj go z produkcyjną biblioteką.
Dobra karta komponentu zawiera: opis zastosowań (kiedy tak/nie), warianty, rozmiary, stany, ograniczenia treści (np. maksymalna liczba znaków), do/don’t z obrazkami, zasady dostępności (kontrast, hit area min. 24×24 px, zachowanie fokusu), mapę tokenów, przykładowe kompozycje (np. grupa przycisków, pasek akcji). Na końcu link do implementacji w repo front-endu lub pakietu UI.
Najczęstszy ból to rozjechane nazwy i wartości. Ustal wspólny source of truth dla tokenów (pliki JSON) i automatyczny eksport do różnych platform (web, iOS, Android). Nazwy w grafice = nazwy w kodzie. Dzięki temu zmiana color.brand.primary w jednym miejscu trafia do CSS zmiennych, SwiftUI i Jetpack Compose bez ręcznego przepisywania. W komponentach front-endowych używaj właśnie tych tokenów — nie wpisuj wartości na sztywno.
Ikony projektuj w spójnej siatce (np. 24×24), z tym samym kątem narożników i grubością linii. Przygotuj warianty „filled” i „outlined” tylko tam, gdzie to faktycznie buduje hierarchię. Unikaj unikalnych ikon dla pojedynczych przypadków — lepiej użyć metonimii z istniejącego zestawu. Ilustracje trzymaj w jednym stylu (kolor, grubość konturu, poziom szczegółowości), z wersjami responsywnymi (hero, moduł, miniatura). Wersje tła dla light/dark projektuj jako osobne zasoby, nie „przyciemniaj” na siłę.
Zdefiniuj proporcje (1:1, 4:3, 16:9), minimalne rozdzielczości, strefy bezpieczeństwa pod tekst i znaki wodne oraz reguły kadrowania dla różnych modułów (np. karta produktu vs. hero). Ustal profil edycyjny (sRGB), bazowe wyostrzenie i kompresję. Dzięki temu marketing i produkt „mówią tym samym językiem” i nie powstają dziesiątki sprzecznych wersji tego samego zdjęcia.
Dostępność nie jest dodatkiem po publikacji. Wpisz do systemu: minimalne kontrasty, minimalny rozmiar hit area, zachowanie fokusu, widoczność stanów i zasady błędów w formularzach. Dodaj gotowe wzorce (komunikaty błędów, wskazówki, etykiety, aria-atrybuty w specyfikacji). Im bardziej „wbetonujesz” te decyzje w komponenty i tokeny, tym mniej poprawek po wdrożeniu.
Wyznacz opiekuna (design lead) i radę zmian (designer + dev + PM). Każda zmiana ma ticket, opis potrzeby, propozycję i wpływ na istniejące ekrany. Co kwartał przegląd komponentów: które są rzadko używane, co się dubluje, co trzeba uprościć. Zmiany publikuj w wersjach i komunikuj zespołowi (notatka, krótkie wideo, przykłady zastosowań). Dla dużych modyfikacji przygotuj „most” kompatybilności (np. stary i nowy przycisk przez dwa sprinty).
Tydzień 1: porządek w kolorach i typografii: scala paletę do semantycznej, ustal 6–8 stylów tekstu, wdroż 8-pikselowy rytm. Wydziel 10 najczęściej używanych komponentów i opisz ich warianty, rozmiary, stany.
Tydzień 2: wprowadź tokeny dla kolorów, odstępów, promieni, cieni, typografii. Podłącz tokeny do komponentów w bibliotece i usuń „twarde” wartości. Zdefiniuj dwa motywy (light/dark) na mapie semantycznej.
Tydzień 3: przygotuj handoff: eksport tokenów do JSON i zmiennych CSS, mapa nazw 1:1 z repo UI. Opisz specyfikacje 10 komponentów (stany, a11y, ograniczenia treści). Ustal proces wersjonowania i changelog.
Tydzień 4: refaktor makiet produktowych: podmień instancje na nowe komponenty, usuń duplikaty. Zrób przegląd z devami, zaplanuj „dług” (co poprawić w kodzie). Opublikuj v1.0 i wyznacz rytm przeglądów co sprint.
Tokeny bez semantyki. Same wartości (np. „blue-500”) nie pomagają w redesignie. Nazwij funkcję: color.text.primary.
Komponenty „na sztywno”. Brak wariantów i stanów prowadzi do ręcznych przeróbek. Dodaj axis: wariant/rozmiar/stany.
Mnożenie ikon i stylów. Ustal siatkę, grubości, styl i bibliotekę; wyrzuć wyjątkowe wynalazki.
Brak mostu z kodem. Ręczne przepisywanie nazw powoduje dryf. Eksport tokenów + zgodność nazw rozwiązuje 80% kłopotów.
Dostępność „po fakcie”. Wbij a11y w komponenty (kontrast, fokus, hit area), a nie w check-listę na końcu.
Dobry design system łączy zasady (siatka, typografia, kolor), komponenty (warianty, stany, rozmiary) i tokeny (nazwane decyzje) w jeden, wspólny język dla grafików i programistów. Gdy nazwy są spójne, a wartości płyną z tokenów, zmiany nie bolą: redesign koloru nie oznacza przebudowy makiet, a tryb ciemny nie wymaga malowania każdego ekranu od nowa. Zacznij od 10 kluczowych komponentów, semantycznej palety i eksportu tokenów; reszta to konsekwencja i wersjonowanie.