Lekcja 42

Projekt 5: mini system komponentów CSS

W ostatnim projekcie łączysz całą roadmapę w mały, spójny system UI: tokeny, przyciski, karty, alerty, pola formularza, stany i dokumentację użycia. To finałowy test myślenia o CSS jako o systemie, a nie zbiorze pojedynczych deklaracji.

Cel projektu

Celem jest stworzenie mini biblioteki komponentów, którą można wykorzystać w małej aplikacji edukacyjnej albo portfolio. System ma być prosty, ale spójny i przewidywalny.

  • Tokeny definiują kolory, odstępy, promienie, cienie i fokus.
  • Komponenty mają bazę oraz warianty zamiast osobnych klas jednorazowych.
  • Stany hover, focus-visible, active, disabled, error i success są spójne.
  • Komponenty działają w układzie mobile-first.
  • Demo pokazuje realne użycie systemu, nie tylko pojedyncze elementy bez kontekstu.

Brief projektu

Zaprojektuj mini system komponentów dla „CSS Academy UI Kit”. System ma wystarczyć do zbudowania małej sekcji aplikacji: przyciski, karta kursu, alert statusu i pole formularza.

Założenie produktowe: to nie jest pełny design system. To celowo mały zestaw komponentów, który uczy granic: co warto ustandaryzować, a czego nie należy komplikować za wcześnie.

Kryteria sukcesu

Mini system komponentów jest dobry wtedy, gdy kilka różnych elementów wygląda jak część jednego produktu i da się je rozwijać bez walki ze specyficznością.

  • Tokeny semantyczne są nazwane rolą, nie kolorem technicznym.
  • Każdy komponent ma bazową klasę i ograniczony zestaw wariantów.
  • Selektory nie są głębsze niż wymaga tego komponent.
  • Warianty nie nadpisują przypadkowo stylów innych komponentów.
  • Stany interakcji są dostępne klawiaturą.
  • Kod można skopiować do innej strony bez przepisywania fundamentów.

Zakres systemu

Dobry mini system nie próbuje rozwiązać wszystkich problemów naraz. W tym projekcie zakres jest świadomie mały.

  • Tokens: kolory, powierzchnie, border, fokus, odstępy, promienie i cień.
  • Button: wariant primary, secondary, ghost i disabled.
  • Card: karta bazowa oraz karta wyróżniona.
  • Alert: success, warning i error.
  • Field: label, input, help text, error i success.

Struktura HTML

Komponenty powinny mieć czytelną strukturę i semantykę. System klas nie zastępuje poprawnego HTML.

<article class="ui-card ui-card--featured">
  <p class="ui-card__meta">Moduł CSS</p>
  <h3>Responsive Layout</h3>
  <p>Ćwiczenia z Grid, Flexbox i breakpointów.</p>
  <a class="ui-button ui-button--primary" href="#">Otwórz moduł</a>
</article>

Klasy opisują rolę komponentu, a HTML nadal odpowiada za strukturę treści.

Tokeny systemu

Tokeny to kontrakt między komponentami. Jeśli każdy komponent używa tych samych ról, cały interfejs zachowuje spójność.

.ui-system {
  --ui-bg: #f8fafc;
  --ui-surface: #ffffff;
  --ui-text: #0f172a;
  --ui-muted: #64748b;
  --ui-border: #dbe3ef;
  --ui-accent: #2563eb;
  --ui-success: #16a34a;
  --ui-warning: #d97706;
  --ui-error: #dc2626;
  --ui-radius: 12px;
}

Nie twórz tokenu dla każdej pojedynczej wartości. Token ma mieć sens jako decyzja systemowa.

Przyciski

Przycisk jest komponentem z największą liczbą stanów. Zacznij od bazy, potem dodaj warianty i stany.

.ui-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 2.75rem;
  border-radius: 999px;
  font-weight: 800;
  text-decoration: none;
}

.ui-button--primary {
  background: var(--ui-accent);
  color: #ffffff;
}

Wariant nie powinien powtarzać całej definicji przycisku. Wariant zmienia tylko to, co naprawdę różni dany przypadek.

Karty

Karta jest powierzchnią dla treści. System powinien określać jej padding, border, radius i rytm wewnętrzny.

.ui-card {
  display: grid;
  gap: .75rem;
  padding: 1rem;
  border: 1px solid var(--ui-border);
  border-radius: var(--ui-radius);
  background: var(--ui-surface);
}

.ui-card--featured {
  border-color: #93c5fd;
}

Karta nie powinna wiedzieć, w jakim layoucie się znajdzie. Layout należy do rodzica, komponent do własnej zawartości.

Alerty

Alerty komunikują status. Nie opieraj ich wyłącznie na kolorze; dodaj tytuł, tekst i jasną rolę wizualną.

.ui-alert {
  padding: .85rem 1rem;
  border: 1px solid var(--ui-border);
  border-radius: var(--ui-radius);
  background: var(--ui-surface);
}

.ui-alert--success {
  border-color: #bbf7d0;
  background: #f0fdf4;
}

Jeśli alert oznacza błąd krytyczny, powinien być blisko miejsca działania albo widoczny w podsumowaniu formularza.

Pola formularza

Pole formularza składa się z labelki, kontrolki, tekstu pomocniczego i opcjonalnego błędu. To naturalny kandydat na komponent.

.ui-field {
  display: grid;
  gap: .4rem;
}

.ui-field input {
  min-height: 2.75rem;
  border: 1px solid var(--ui-border);
  border-radius: var(--ui-radius);
  font: inherit;
}

Komponent pola powinien wspierać stany error i success bez zmiany struktury HTML.

Stany i warianty

Stany pokazują chwilowe zachowanie komponentu, a warianty opisują trwałą odmianę. Nie mieszaj tych dwóch pojęć.

.ui-button:hover {
  transform: translateY(-1px);
}

.ui-button:focus-visible {
  outline: 3px solid #bfdbfe;
  outline-offset: 3px;
}

.ui-button:disabled {
  cursor: not-allowed;
  opacity: .58;
}

Stan disabled nie jest wariantem wizualnym. To stan funkcjonalny, który musi komunikować brak dostępności.

Responsywność

System komponentów powinien działać w różnych kontenerach. Karta, alert i pole formularza nie mogą zakładać stałej szerokości strony.

.ui-system__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
  gap: 1rem;
}

Responsywność mini systemu polega na tym, że komponenty nie rozpychają rodzica i dobrze znoszą krótszy oraz dłuższy tekst.

Demo systemu

Poniżej znajduje się gotowy mini system komponentów: tokeny, przyciski, karty, alerty i pole formularza użyte w jednym małym widoku aplikacji.

CSS Academy UI Kit

Mini system komponentów

Mały zestaw elementów gotowy do panelu kursu, formularza i sekcji treści.

Accent Success Warning Error

Komponent

Karta bazowa

Ten sam rytm odstępów, obramowanie i promień działają w zwykłym oraz wyróżnionym wariancie.

Projekt zapisany Tokeny i komponenty są spójne.
Sprawdź kontrast Wariant ostrzeżenia wymaga testu czytelności.

Pole używa tych samych tokenów fokusu i obramowania.

Najczęstsze błędy początkujących

  • Budowanie „systemu” z jednorazowych klas, które działają tylko w jednym widoku.
  • Nazywanie tokenów technicznie, na przykład --blue, zamiast semantycznie, na przykład --color-accent.
  • Tworzenie zbyt wielu wariantów zanim powstanie realna potrzeba.
  • Powtarzanie pełnej definicji komponentu w każdym wariancie.
  • Brak spójnych stanów focus-visible i disabled.
  • Projektowanie komponentów, które zakładają stałą szerokość rodzica.

Zadanie projektowe

Zbuduj własny mini system komponentów CSS dla małej aplikacji, portfolio albo strony kursu.

  • Zdefiniuj tokeny dla tła, powierzchni, tekstu, obramowania, akcentu, sukcesu, ostrzeżenia, błędu, fokusu i promienia.
  • Utwórz komponent przycisku z wariantami primary, secondary, ghost i disabled.
  • Utwórz komponent karty z wariantem wyróżnionym.
  • Utwórz komponent alertu z wariantami success, warning i error.
  • Utwórz komponent pola formularza z labelką, help text i stanem błędu.
  • Dodaj widoczne stany hover, active i focus-visible.
  • Sprawdź system w układzie jednej kolumny i responsywnej siatki.
  • Udokumentuj krótko, kiedy używać każdego wariantu.

Checklista jakości

  • Tokeny są semantyczne i używane przez komponenty.
  • Komponenty mają bazę i ograniczoną liczbę wariantów.
  • Stany focus-visible są widoczne na przyciskach i polach.
  • Disabled wygląda i zachowuje się jak stan nieaktywny.
  • Alerty mają tekst, nie tylko kolor.
  • Karty nie zależą od konkretnego layoutu strony.
  • Na 390px nie ma poziomego overflow.
  • System da się wykorzystać w drugim widoku bez zmiany nazw klas.

Podsumowanie roadmapy

Mini system komponentów domyka całą ścieżkę CSS Academy. Po przejściu roadmapy masz fundamenty CSS, layout, responsywność, komponenty UI, formularze, dane, efekty, organizację arkusza, nowoczesne funkcje CSS i pięć praktycznych projektów portfolio.

Najlepszy następny krok to utrzymanie jakości: przegląd wspólnej nawigacji, wydzielenie listy lekcji jako źródła prawdy i ewentualne uporządkowanie CSS w sekcje lub pliki.

Wróć do pełnej ścieżki nauki