Czym jest Atomic Design?
Atomic Design, stworzony przez Brada Frosta, dzieli interfejsy użytkownika na fundamentalne bloki budulcowe. Zainspirowany chemią, organizuje komponenty w hierarchię od najmniejszych elementów do pełnych stron.
Kluczowe zalety:
Spójność – komponenty wielokrotnego użytku zapewniają jednolity wygląd
Łatwość utrzymania – zmiany propagują się automatycznie w całym systemie
Skalowalność – łatwe rozszerzanie funkcjonalności bez łamania istniejących komponentów
Współpraca – przejrzysta struktura usprawnia pracę zespołową
Główna zasada: Brak logiki biznesowej
Komponenty Atomic Design nie powinny zawierać logiki biznesowej. Komponenty obsługują tylko funkcjonalność związaną z ich zachowaniem UI:
| ✅ Dozwolone | ❌ Niedozwolone |
|---|---|
| Walidacja wejścia (format, długość) | Zakodowane na stałe wywołania API |
| Animacje i przejścia | Bezpośrednie pobieranie danych |
| Lokalny stan komponentu | Mutacje store'a |
| Emitowanie zdarzeń | Zakodowane na stałe URL-e lub endpointy |
| Renderowanie na podstawie propsów | Sprawdzanie autoryzacji lub logika domenowa |
| Funkcje dostępności | Obliczenia specyficzne dla domeny |
| Konfigurowalne callbacki przez propsy | Sztywne reguły biznesowe |
| Generyczne handlery zdarzeń | Zakodowana na stałe konfiguracja |
Logika biznesowa należy do:
Store'ów (Pinia)
Composables
Serwisów
Rozszerzenia Nucleify
Nucleify rozszerza standardowy Atomic Design o moduły, w których logika biznesowa jest dozwolona:
| Moduł | Przeznaczenie |
|---|---|
nuc_templates |
Szablony komponentów wielokrotnego użytku (karty, formularze, modale) |
nuc_sections |
Sekcje strony z logiką layoutu, obsługą danych i zachowaniem specyficznym dla sekcji |
nuc_pages |
Pełne komponenty stron z wywołaniami API, dostępem do store'a i regułami biznesowymi |
Te moduły są oddzielone od nuxt/atomic/, aby utrzymać komponenty UI czystymi i wielokrotnego użytku.
Przegląd hierarchii
Nucleify wprowadza dodatkową warstwę Bosons dla typów i narzędzi.
Bosons → Interfejsy, funkcje pomocnicze, stałe (niewidoczna warstwa)
Atoms → Podstawowe elementy UI (Button, Input, Icon)
Molecules → Proste kombinacje atomów (FloatLabel, Tile)
Organisms → Złożone sekcje UI (DataTable, Dialog, Menu)
Templates → Szablony komponentów wielokrotnego użytku (nuc_templates)
Sections → Sekcje strony z logiką (nuc_sections)
Pages → Pełne strony z wywołaniami API i dostępem do store'a (nuc_pages)
Bosons – Niewidoczny fundament
Bosony to najmniejsze, niepodzielne jednostki logiki wielokrotnego użytku. Nie renderują niczego, ale stanowią fundament dla wszystkich komponentów:
// types/interfaces.ts
export interface ButtonInterface {
label?: string
variant?: 'primary' | 'secondary' | 'danger'
disabled?: boolean
}
// utils/format_date.ts
export function formatDate(date: Date): string {
return new Intl.DateTimeFormat('en-US').format(date)
}
// constants/breakpoints.ts
export const BREAKPOINTS = {
mobile: 768,
tablet: 1024,
desktop: 1440,
} as const
Atoms – Podstawowe elementy wizualne
Atomy to najmniejsze komponenty UI, których nie można dalej rozbić bez utraty znaczenia. Przykłady: Button, Input, Icon, Label, Badge, Checkbox, Avatar.
Dozwolona logika:
Obsługa zdarzeń click/focus/hover
Zarządzanie stanem wewnętrznym (np. wartość inputa)
Warunkowe stylowanie na podstawie propsów
Emitowanie zdarzeń do rodzica
<template>
<button :class="[$style['ad-button'], variant && $style[variant]]" :disabled="disabled" @click="$emit('click', $event)">
<slot />
</button>
</template>
<script setup lang="ts">
import type { ButtonInterface } from './types'
defineProps<ButtonInterface>()
defineEmits<{ click: [event: MouseEvent] }>()
</script>
Molecules – Proste kombinacje
Molekuły łączą atomy w funkcjonalne jednostki, zachowując prostotę. Przykłady: FloatLabel, Anchor, Tile.
Dozwolona logika:
Koordynacja stanów atomów potomnych
Proste wartości obliczane
Lokalna walidacja (tylko format, bez reguł biznesowych)
Organisms – Złożone sekcje
Organizmy składają się z molekuł, atomów lub innych organizmów. Nadal są czysto prezentacyjne. Przykłady: DataTable, Dialog, Menu, Card.
Dozwolona logika:
Renderowanie danych przekazanych przez propsy
Lokalne filtrowanie/sortowanie dostarczonych danych
Zarządzanie stanami otwórz/zamknij
Emitowanie zdarzeń interakcji użytkownika
Niedozwolone: wywołania API lub dostęp do store'a.
Templates, Sections i Pages
Templates (
nuc_templates) – szablony wielokrotnego użytku dla kart, formularzy, modali; logika biznesowa dozwolonaSections (
nuc_sections) – bloki strony łączące szablony i organizmy z logiką layoutu i danychPages (
nuc_pages) – pełne strony łączące komponenty UI ze store'ami i wywołaniami API
Najlepsze praktyki
Utrzymuj komponenty czyste – przewidywalne wyjścia, brak efektów ubocznych
Propsy w dół, zdarzenia w górę – rodzic obsługuje logikę biznesową
Pojedyncza odpowiedzialność – każdy komponent robi jedną rzecz dobrze
Używaj interfejsów TypeScript – propsy i dane bezpieczne typowo
Top comments (0)