Jeden kod, 5 marek. Jak wdrożyliśmy Multi Design System i automatyzację Design Tokens

Jak ujednoliciliśmy UI dla 5 marek bez utraty ich tożsamości? Stworzyliśmy wspólny foundation layer — komponenty, zasady i tokeny projektowe — który zapewnił spójność doświadczenia, jednocześnie pozostawiając przestrzeń na indywidualny charakter każdej marki.

pageHeader--bg
Silky Coders

Wraz ze skalowaniem produktu i rozwojem brandów pojawiła się potrzeba ujednolicenia sposobu budowania interfejsów przy jednoczesnym zachowaniu indywidualnego wyglądu każdej marki. Odpowiedzią na to wyzwanie było wdrożenie architektury Multi Design System, opartej o współdzielone komponenty UI oraz dynamicznie sterowane zmienne designowe. 

Celem rozwiązania było osiągnięcie: 

  • jednego wspólnego kodu komponentów,  
  • wsparcia dla wielu brandów,  
  • centralnego zarządzania designem,  
  • automatyzacji synchronizacji designu z kodem,  
  • szybszego developmentu i utrzymania aplikacji. 

Architektura Multi Brand

System został zaprojektowany w taki sposób, aby logika komponentów była współdzielona, natomiast warstwa wizualna zależna od konfiguracji konkretnego brandu. To właśnie Figma stała się pojedynczym źródłem prawdy dla parametrów przechowywanych w aplikacji. Zmiana dokonana przez designera w Figma może zostać automatycznie zsynchronizowana z kodem aplikacji. 

Aktualnie rozwiązanie obsługuje 5 niezależnych brandów, gdzie każdy może posiadać własne: 

  • kolory,  
  • typografia,  
  • zaokrąglenia, 
  • rozmiar 
  • przezroczystość 
  • odstępy 
  • obramowanie 
  • grafiki (lottie/obrazki),  
  • motywy light/dark.  

Kluczowym założeniem było oddzielenie logiki UI od warstwy wizualnej. 

Komponenty sterowane zmiennymi

Każdy komponent w systemie został zbudowany w oparciu o zestaw zmiennych (Design Tokens), które definiują jego wygląd. 

Przykładowo komponent Button nie posiada na sztywno zdefiniowanych wartości kolorów czy paddingów. Zamiast tego korzysta z tokenów:


Button(
    backgroundColor = BrandTheme.designTokens.backgroundInteractiveRest,
    textColor = BrandTheme.designTokens.textInteractiveRest,
    cornerRadius = BrandTheme.radius.interactiveLarge,
)

Dzięki temu: 

  • komponent pozostaje współdzielony,  
  • zmienia się wyłącznie konfiguracja brandu,  
  • nowy wygląd nie wymaga modyfikacji logiki komponentu.  

Każdy brand dostarcza własny zestaw wartości dla tych samych tokenów.

Architektura motywów — Light/Dark i gotowość na kolejne warianty

Obecnie system wspiera dwa główne motywy: 

  • Light Theme  
  • Dark Theme  

Architektura została jednak zaprojektowana w sposób całkowicie rozszerzalny, dzięki czemu dodanie kolejnych wariantów motywów nie wymaga przebudowy komponentów ani zmian w logice aplikacji. 

Każdy komponent korzysta wyłącznie z abstrakcyjnej warstwy tokenów:

interface DesignTokens {
    val backgroundInteractiveRest: Color
    val textInteractiveRest: Color
}

Ostateczne wartości są dostarczane przez aktywny motyw oraz konfigurację konkretnego brandu.  

val brandDarkDesignTokens = object : DesignTokens {
    override val backgroundInteractiveRest = brandDarkColors.neutralBlack
    override val textInteractiveRest = brandDarkColors.neutralWhite
}
val brandLightDesignTokens = object : DesignTokens {
    override val backgroundInteractiveRest = brandLightColors.neutralBlack
    override val textInteractiveRest = brandLightColors.neutralWhite
}

Dzięki temu możliwe jest bezproblemowe rozszerzenie systemu o dodatkowe warianty, takie jak: 

  • High Contrast Theme,  
  • Seasonal Theme,  
  • Accessibility Theme,  
  • White Label Theme,  
  • Event / Campaign Theme,  
  • AMOLED Theme. 

Przykładowa struktura: 


val brandHighContrastDesignTokens = object : DesignTokens { }
val brandWinterDesignTokens = object : DesignTokens { }
val brandHalloweenDesignTokens = object : DesignTokens { }

Warstwa UI Components 

Istotnym elementem rozwiązania jest moduł ui-components, który pełni rolę katalogu komponentów oraz środowiska preview. 

Pozwala on: 

  • renderować komponenty dla wszystkich brandów jednocześnie,  
  • testować różnice wizualne,  
  • walidować zgodność Design Systemu,  
  • przyspieszać development oraz QA.  

Przykładowo jeden komponent może zostać wyświetlony w 5 wariantach: 

  • Sinsay 
  • Reserved 
  • Mohito 
  • House 
  • Cropp 

bez konieczności uruchamiania osobnych aplikacji. 

Takie podejście znacząco uprościło: 

  • development nowych funkcjonalności,  
  • utrzymanie spójności UI,  
  • onboarding developerów,  
  • współpracę z designerami. 

 

Silky Coders

Plugin do synchronizacji Design Tokens

Aby wyeliminować ręczne przepisywanie wartości z Figmy do kodu, stworzyliśmy dedykowany plugin odpowiedzialny za pobieranie Design Tokens oraz generowanie kodu źródłowego. 

Plugin: 

  1. Pobiera zmienne z Figmy za pomocą API,  
  2. Mapuje je do struktury aplikacji,  
  3. Konwertuje tokeny do kodu Kotlin / Swift,  
  4. Generuje gotowe klasy i obiekty konfiguracyjne. Zmienne, w nawiązaniu do poprzedniego stanu są aktualizowane/dodawane/usuwane. 

Cały proces odbywa się automatycznie za pomocą jednej komendy. 

Aplikacja do porównywania komponentów między brandami

Dodatkowo w ramach rozwoju Multi Design System powstała dedykowana aplikacja developerska służąca do porównywania komponentów pomiędzy wszystkimi brandami. 

Narzędzie umożliwia renderowanie komponentów w różnych konfiguracjach brandowych oraz motywach w czasie rzeczywistym. 

Dzięki temu możliwe jest szybkie sprawdzenie: 

  • jak komponent wygląda dla każdego brandu,  
  • różnic wizualnych między motywami,  
  • poprawności mapowania Design Tokens,  
  • zgodności implementacji z projektem z Figmy,  
  • regresji wizualnych po zmianach w systemie. 

 

Silky Coders

Korzyści wdrożenia

Wdrożenie Multi Design System przyniosło szereg korzyści technicznych i organizacyjnych.

Skalowalność

Dodanie nowej funkcjonalności do kolejnych brandów nie wymaga budowania nowego UI od podstaw, a przynajmniej od strony komponentów. W większości przypadków wystarczy dostarczenie nowego zestawu tokenów.

Spójność

Wszystkie aplikacje korzystają z tych samych komponentów i zasad projektowych.

Automatyzacja

Eliminacja ręcznego przepisywania wartości z Figmy znacząco ograniczyła ryzyko błędów i przyspieszyła development.

Krótszy Time-To-Market

Zmiany wizualne mogą być wdrażane dużo szybciej, ponieważ nie wymagają ingerencji w logikę komponentów.

Lepsza współpraca Design ↔ Development

Design i kod są ze sobą bezpośrednio zsynchronizowane dzięki Design Tokens.

Podsumowanie

Wdrożenie architektury Multi Design System pozwoliło nam zbudować skalowalne środowisko wspierające wiele brandów przy zachowaniu jednego, współdzielonego kodu komponentów.

Połączenie:

  • komponentów sterowanych tokenami,
  • centralnego zarządzania designem,
  • automatycznej synchronizacji z Figmą,
  • oraz generowania kodu Kotlin / Swift

pozwoliło znacząco usprawnić rozwój aplikacji, utrzymanie UI oraz proces współpracy między zespołami designerskimi i developerskimi.

To podejście stało się fundamentem dalszego skalowania platformy i rozwoju kolejnych funkcjonalności.


Autor:
Miłosz Skalski
Technical Architect

blockOfferModule--bg
Silky Design – AI w projektowaniu mody

Silky Design – AI w projektowaniu mody

Silky Design to aplikacja AI wspierająca projektowanie mody w skali...

mySwiper-button

Multibrandowy Design System – jak w Silky Coders przyspieszamy rozwój marek LPP

Multibrandowy Design System – jak w Silky Coders przyspieszamy rozwój...

Multibrandowy design system łączący UX/UI i development, oparty na design...

mySwiper-button

Mój sklep | Omnichannel w retail – jak aplikacja mobilna łączy sprzedaż online i offline (case study)

Mój sklep | Omnichannel w retail – jak aplikacja mobilna...

Funkcje dostępne w aplikacjach mobilnych to efekt współpracy biznesu i...

mySwiper-button

System alokacji towarów – jak zwiększyć sprzedaż w retail dzięki AI

System alokacji towarów – jak zwiększyć sprzedaż w retail dzięki...

ALOKACJE to data-driven system Java opracowany przez Silky Coders, wykorzystujący...

mySwiper-button

Jak model Kottera pomógł nam wdrożyć AI do codziennej pracy nad rozwojem produktu.

Jak model Kottera pomógł nam wdrożyć AI do codziennej pracy...

Jak sprawić, by AI stało się realnym wsparciem zespołu produktowego,...

mySwiper-button

Nowoczesny magazyn zaczyna się od WMS

Nowoczesny magazyn zaczyna się od WMS

Nasze systemy WMS już dziś sterują największymi centrami dystrybucyjnymi produktów...

mySwiper-button

SPOT: Inteligentna mapa ekspansji. Jak wspieramy rozwój Sinsay dzięki AI

SPOT: Inteligentna mapa ekspansji. Jak wspieramy rozwój Sinsay dzięki AI

Wybór lokalizacji dla nowych salonów sprzedaży to dziś nie tylko...

mySwiper-button

HR Quick Peek 2.0. Silky Coders jako architekt cyfryzacji Kadr w LPP

HR Quick Peek 2.0. Silky Coders jako architekt cyfryzacji Kadr...

HR Quick Peek 2.0 to nie tylko projekt – to...

mySwiper-button

25 wdrożeń w jeden dzień – jak zespół HelpDesk wspiera ekspansję Sinsay

25 wdrożeń w jeden dzień – jak zespół HelpDesk wspiera...

Ekspansja sieci sklepów to nie tylko decyzje strategiczne i działania...

mySwiper-button

eKarty podarunkowe – cyfrowa odpowiedź na potrzeby współczesnego konsumenta

eKarty podarunkowe – cyfrowa odpowiedź na potrzeby współczesnego konsumenta

Przed wdrożeniem nowego rozwiązania, karty podarunkowe były dostępne wyłącznie w...

mySwiper-button

Sztuczna inteligencja w e-commerce – zastosowania AI w sprzedaży online (case study)

Sztuczna inteligencja w e-commerce – zastosowania AI w sprzedaży online...

Dzięki wdrożeniu rozwiązań AI w e-commerce usprawniamy tworzenie i prezentację...

mySwiper-button

AI w pracy UX Researcherów

AI w pracy UX Researcherów

Technologia wspiera badania, oszczędza czas i zasoby, a także podnosi...

mySwiper-button

Globalne wdrożenie systemu Mobile Device Management

Globalne wdrożenie systemu Mobile Device Management

Naszym sukcesem jest globalne wdrożenie systemu MDM (Mobile Device Management)...

mySwiper-button

System kas samoobsługowych w retail – wdrożenie dla Sinsay

System kas samoobsługowych w retail – wdrożenie dla Sinsay

W ramach współpracy z marką Sinsay stworzyliśmy system kas samoobsługowych,...

mySwiper-button

Droga do chmury

Droga do chmury

Migracja brandów należących do LPP do chmury przez nasze zespoły...

mySwiper-button

Mustang

Mustang

Mustang to jeden z największych projektów realizowanych wspólnie przez LPP...

mySwiper-button

Defrost

Defrost

Pandemia dała LPP impuls do wykorzystania nowych rozwiązań, dopasowanych do...

mySwiper-button