Design tokens w praktyce: jak połączyć Figma, kod i dostępność, żeby projekt był spójny na każdym ekranie

Mariusz Siwko
26.10.2025

Jeszcze niedawno „spójność” oznaczała zestaw plików .sketch lub .fig z dopasowanymi kolorami i typografią. Dziś to za mało. Produkty żyją jednocześnie na webie, w iOS/Android, w e-mailach transakcyjnych, a nawet w materiałach drukowanych, które muszą nawiązywać do interfejsu. W takim ekosystemie design tokens stają się językiem wspólnym dla projektantów i developerów: to znormalizowane zmienne opisujące wizualne decyzje (kolor, odstępy, typografia, promienie, cienie, ruch), które można automatycznie eksportować z narzędzia projektowego do kodu. Ten artykuł pokazuje, jak zbudować praktyczny system tokenów: od architektury i nazewnictwa, przez integrację Figma → repozytorium → biblioteki front-end, aż po dostępność, dark mode i scenariusze multi-brand. Bez mitycznych „transformacji jedną linijką”, za to z procesem, który działa w zespołach MŚP i w większych organizacjach.

Po co tokens, skoro mamy „style” w Figma?

Style w narzędziu projektowym porządkują wygląd makiet, ale najczęściej kończą życie na eksporcie SVG/PNG albo w ręcznych notatkach dla developerów. Tokeny wprowadzają mechanizm, który łączy projekt i implementację. Zamiast opisywać kolor przycisku jako „ciemny niebieski #0D47A1”, odnosimy się do semanticznej zmiennej, np. color.button.primary.bg. Dzięki temu:

— projekt i kod używają tych samych nazw; — zmiana palety lub kontrastu nie wymaga przepisywania tysiąca miejsc; — te same wartości mogą być przekształcane na różne platformy (CSS, iOS, Android, e-mail HTML); — kontrolujemy warianty (dark mode, high contrast, świąteczna tematyka) bez duplikacji komponentów.

Architektura: warstwa „raw”, „alias” i „semantic”

Najczęstszy błąd przy wdrażaniu tokenów to mieszanie nazw użytku z konkretną wartością. Dobrze zorganizowany system dzieli się na trzy warstwy. Po pierwsze, raw (foundation): nazwane wartości bazowe, np. color.blue.600 albo space.16 (gdzie 16 oznacza 16 px). Po drugie, alias: wiązania wygodne dla platformy, np. radius.lg = 12px, font.size.sm = 14px. Po trzecie, semantic: nazwy odpowiadające użyciu w interfejsie, np. color.text.muted, color.button.primary.bg, shadow.card.default. Taka kaskada pozwala zmieniać paletę lub gęstość siatki bez naruszania semantyki komponentów. W praktyce front-end korzysta głównie z warstwy semantic, a foundation rzadko „przecieka” poza design system.

Nazewnictwo, które skaluje się z zespołem

Gdy tokenów przybywa, najcenniejsza jest przewidywalność. Dlatego nazwy powinny być krótkie, ale jednoznaczne, czytane od ogółu do szczegółu: color.text.primary, color.text.inverted, space.24, radius.sm. Dla stanów interakcji dodajemy sufiksy: color.button.primary.bg.hover, color.input.border.error.focus. Przygotuj krótką specyfikację z przykładami i antyprzykładami. Dopisz zasady pluralizacji i wersjonowania (np. deprecacja color.brand.500 w wersji 2.1 i wskazanie następcy). Taki „słownik” eliminuje spory semantyczne i przyspiesza code review.

Figma Variables i biblioteki: jak połączyć narzędzie z repozytorium

Współczesna Figma pozwala tworzyć Variables w trybach (modes), np. „light/dark”, „brand A/brand B”, „B2C/B2B”. Właśnie tam przechowujemy warstwę foundation i alias. Do pracy projektowej wystarczy jedna biblioteka „Design Tokens”, z której korzystają wszystkie pliki. Klucz tkwi w eksporcie: mapujemy figmowe Variables do formatów technicznych (JSON, SCSS, iOS .swift, Android .xml). Najwygodniejszy jest automat, który przy commitcie aktualizuje pakiet @company/tokens w prywatnym rejestrze. Projektant zmienia wartość w Figma, uruchamia wersjonowanie, a deweloper wciąga nową wersję paczki jak każdą inną zależność. Znika ręczne przepisywanie i znikają „rozjazdy” między makietą a kodem.

Pipeline: od edycji w Figma do publikacji paczki

Proces warto rozpisać jak linię produkcyjną. Zaczynamy od aktualizacji wartości w Figma i opisania zmiany w changelogu. Następnie pre-commit sprawdza spójność nazw i trybów (np. czy color.button.primary.bg istnieje w light i dark). Potem wywoływany jest skrypt eksportujący Variables do czystego JSON (bez specyficznych dla narzędzia metadanych). Kolejna faza to transformacje do docelowych formatów: CSS Custom Properties dla webu, pliki platformowe dla natywnych aplikacji, mapy dla frameworków e-mailowych. Na końcu pipeline publikuje nową wersję paczki w rejestrze i generuje dokumentację „diff” z podglądem kolorów/typografii. Dzięki temu każda zmiana jest przejrzysta i szybko dostępna na wszystkich platformach.

Dark mode i tryby dostępności bez duplikowania komponentów

Tryby kolorystyczne bywają źródłem chaosu, gdy projektujemy oddzielne zestawy komponentów. Tokeny upraszczają sprawę. Wystarczy, że semantyczny token color.surface.default ma różne wartości w trybach „light” i „dark”. To samo dotyczy stanów: color.text.link, color.text.link.hover czy color.border.focus. Dołącz tryb „high-contrast” – nie tylko jako ciemniejszy wariant, ale jako osobny zestaw wartości spełniających podniesione progi kontrastu. Komponenty nie zmieniają API, po prostu „piją” z innego kubełka wartości. To podejście pozwala też tworzyć sezonowe skórki lub edycje partnerskie bez przepisywania kodu.

Dostępność: kontrast, fokus i typografia jako tokeny, nie „opinie”

Najszybciej traci się spójność na detalach: delikatny szary tekst, nieczytelny fokus, zbyt „lekka” czcionka. Zamiast dyskutować ad hoc, zamknij te decyzje w tokenach i regułach. Zdefiniuj minimalne kontrasty dla par semantycznych (np. tekst podstawowy do tła, link do tła, tekst na powierzchniach brandowych), a następnie przypnij do nich tokeny. Stany fokusa opisz jako zestaw: focus.outline.color, focus.outline.width, focus.outline.offset. W typografii wprowadź skalę (np. 12–14–16–20–24–32) i mapę semantyczną: font.size.body, font.size.subtitle, font.size.h1. Dzięki temu każdy komponent jest dostępny „z pudełka”, a testy kontrastu i focusów można zautomatyzować w CI. Ważna praktyka: utrzymuj tokeny treści pomocniczych (np. color.text.placeholder) powyżej rozsądnego progu – zbyt jasny placeholder to częsta bariera dla osób z osłabionym wzrokiem.

Spacing, siatka i promienie: mała geometra, wielki porządek

Estetyka interfejsu to nie tylko kolor i font. „Czystość” wynika z powtarzalnych odstępów, promieni i cieni. Wprowadź rytm spacingu (np. skala 4 px: 4, 8, 12, 16, 24, 32, 48…), ale pozwól na „elastyczne” aliasy: space.xs, space.sm, space.md. Promienie i cienie zamknij w krótkich mapach: radius.sm, radius.lg, shadow.sm, shadow.hover. W parze z tym idzie siatka kompozycyjna: kolumny, rynny i marginesy mogą również być wyrażone w tokenach, co ułatwia spójność między webem i aplikacjami natywnymi. Dzięki takiemu słownikowi komponenty „składają się” w przewidywalny rytm, a mikrodecyzje nie rozjeżdżają się przy presji czasu.

Motion tokens: kiedy animacja jest częścią języka

Ruch bywa niedoceniany w systemach projektowych, a przecież zasady easingów, czasów i odległości w animacjach wpływają na postrzeganą płynność. Zdefiniuj tokeny ruchu: motion.duration.fast (120 ms), motion.duration.base (200–250 ms), motion.easing.standard (np. cubic-bezier), motion.distance.sm (8 px). Z takim zestawem przyciski, karuzele i modale zachowują się podobnie na wszystkich ekranach. Pamiętaj o preferencjach systemowych: jeżeli użytkownik włącza „Reduce motion”, tokeny powinny przekształcać się w krótsze czasy i mniejszą amplitudę lub w fade bez przemieszczenia.

Multi-brand i white-label: jedna baza, wiele „twarzy”

W organizacjach z kilkoma markami łatwo popaść w duplikacje. Lepsza strategia to wspólny foundation (skala przestrzeni, typografia bazowa, ruch) oraz odrębne zestawy semantyczne per marka: @company/tokens-brand-a, @company/tokens-brand-b. Każdy zestaw korzysta z tej samej siatki spacingu i typografii, ale ma własne kolory brandowe i akcenty. Utrzymuj wspólny zestaw testów kontrastu oraz checklist dostępności, żeby żadna marka nie „wchodziła” poniżej standardu. Dla zespołów wdrożeniowych przygotuj instrukcję „jak podmienić skórkę” bez zmiany kodu komponentów – to realnie skraca czas go-live przy white-labelu.

Dokumentacja, governance i „dyktatura małych zmian”

Design system żyje, gdy jest używany. Dokumentacja powinna więc odpowiadać na dwa pytania: jak użyć i dlaczego tak. Strona tokenów niech pokazuje wartości, przykłady użycia i przeciwwskazania. Każda zmiana przechodzi przez RFC (krótkie zgłoszenie z uzasadnieniem) i trafia do changelogu: „dodano color.text.inverted”, „zdeprecjonowano shadow.deep”, „zaostrzono kontrast color.badge.info.bg o 0,5:1”. Ustal cykl przeglądu (np. co 6 tygodni) i rolę „gwardii design systemu” – niewielkiego zespołu pilnującego spójności, który pomaga, zamiast blokować. Największe efekty przynosi konsekwencja w drobnych korektach, a nie rewolucje raz na rok.

Testy wizualne i kontrastu w CI: automaty zamiast ręcznych polowań

Kiedy tokeny żyją w repozytorium, można je testować jak każdą inną zależność. Dołóż testy kontrastu dla par semantycznych i proste „zrzuty” komponentów, które wyłapują niezamierzone zmiany po aktualizacji palety. Warto także testować dostępność focusów i stanów błędów. Automaty nie zastąpią oka projektanta, ale eliminują wpadki, które pojawiają się najczęściej: zbyt jasny tekst na badge’u, zbyt subtelny border w polu formularza, znikający fokus w dark mode. Dzięki temu zespół frontendowy dostaje szybki feedback jeszcze przed scaleniem pull requestu.

Druk i marketing – jak spiąć „świat pikseli” z materiałami offline

Choć design tokens kojarzą się z UI, w praktyce pomagają też w materiałach drukowanych. Jeśli utrzymujesz paletę brandową jako foundation, łatwo przygotować mapę kolorów na CMYK i Pantone oraz dokument potwierdzający odpowiedniki. Ta sama skala typografii może zyskać warianty dla DTP (kerning, tracking, ligatury), ale nazewnictwo zostaje wspólne. Dzięki temu strona www, aplikacja i katalog produktowy wyglądają jak rodzeństwo, nie jak kuzyni po dalekiej linii.

Najczęstsze błędy przy wdrożeniu i jak ich uniknąć

Pierwszy błąd to traktowanie tokenów jak „ładnej tabelki”. Tokeny są wartościowe, gdy są jedynym źródłem prawdy i mają ścieżkę do kodu. Drugi problem to nadmiar poziomów: zbyt rozbudowane drzewo nazw utrudnia użycie i spowalnia projekt. Trzeci – brak semantyki: opieranie się wyłącznie na palecie brand.100–900 sprawia, że każdy komponent interpretuje kolor inaczej. Czwarty – ignorowanie dostępności w momencie definiowania wartości, a nie podczas kontroli jakości. Wreszcie piąty – „freeze” systemu: lęk przed zmianami, który prowadzi do rozjazdu między needs produktu a zamrożonym słownikiem. Recepta jest prosta: krótkie nazwy, trzy warstwy, semantyka pierwszej klasy, testy w CI i jasna ścieżka aktualizacji.

Plan wdrożenia 30/60/90 dni

W pierwszych 30 dniach zinwentaryzuj kolory, typografię, spacing i ruch. Zredukuj paletę do wartości rzeczywiście używanych i zbuduj foundation oraz aliasy. W Figma utwórz Variables i podłącz je do biblioteki komponentów. W tym czasie zdefiniuj minimalny zestaw semantyczny (tekst, tła, border, przyciski, linki, stany błędów i sukcesu). W dniach 31–60 skonfiguruj pipeline eksportu i paczkę @company/tokens, a także przebuduj 3–5 kluczowych komponentów (Button, Input, Card, Badge, Modal), żeby używały wyłącznie tokenów. Wprowadź testy kontrastu i wizualne w CI, przygotuj changelog i proces RFC. W dniach 61–90 rozciągnij semantykę na ciemny tryb i tryb zwiększonego kontrastu, dodaj motion tokens oraz pierwsze warianty multi-brand, jeśli ich potrzebujesz. Zamyka to pętlę, po której system zaczyna sam się utrzymywać: projektanci pracują na Variables, a deweloperzy aktualizują paczkę jak każdą zależność.

Podsumowanie

Design tokens to nie moda, tylko praktyczna odpowiedź na realia wieloplatformowego świata. Porządkują język wizualny, łączą Figma z kodem, chronią przed niespójnością i upraszczają dark mode, dostępność oraz warianty brandowe. Najważniejsze, że zmieniają kulturę pracy: zamiast „ustaleń na słowo” mamy jedną paczkę, która decyduje o wyglądzie produktów i którą wersjonujemy jak każdą inną część oprogramowania. Z takim podejściem zyskujemy szybkość zmian bez utraty jakości – a spójność marki przestaje być deklaracją, a staje się cechą mierzalną i powtarzalną.

Źródła

  • https://www.w3.org/WAI/standards-guidelines/wcag/ — Oficjalne wytyczne WCAG dotyczące dostępności treści web, w tym kryteria kontrastu i interakcji.
  • https://m3.material.io/foundations/design-tokens/overview — Dokumentacja Material Design na temat design tokens i ich roli w systemach projektowych.
  • https://help.figma.com/hc/en-us/articles/15264983760983-Variables-in-Figma — Przewodnik Figma o Variables i trybach (modes), przydatny do budowy warstw foundation/semantic.
  • https://www.smashingmagazine.com/2022/03/design-tokens-practical-guide/ — Smashing Magazine: praktyczne wprowadzenie do design tokens i strategii wdrażania.
  • https://developer.mozilla.org/en-US/docs/Web/CSS/--* — MDN Web Docs: CSS Custom Properties (zmienne), które są naturalnym nośnikiem tokenów w webie.
Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie