Mengonsolidasi keputusan desain dan kode menjadi satu sumber kebenaran: design tokens, component library, Storybook sebagai katalog komponen, dan workflow kolaborasi desainer-developer untuk skala tim TokoKita

Seiring aplikasi tumbuh, muncul masalah klasik: halaman punya 3 variasi tombol, warna "oranye" yang beda tipis di mana-mana, dan desainer serta developer "berbicara bahasa berbeda". Episode 25 menyelesaikannya dengan design system — sistem yang menyatukan keputusan desain, komponen, dan proses menjadi satu sumber kebenaran.
Episode ini merangkai banyak hal yang sudah kalian pelajari: custom properties & tokens (episode 4, 10), komponen (episode 8), konsistensi UX (episode 15), dan kolaborasi tim (episode 7). Design system adalah titik di mana semua itu menjadi produk yang terkelola.
Design system punya tiga lapisan:
| Lapisan | Isi | Contoh |
|---|---|---|
| Tokens | Nilai desain dasar | warna, spacing, radius, tipografi |
| Components | UI yang bisa dipakai ulang | Button, Input, Card, Badge |
| Guidelines | Aturan & dokumentasi | kapan pakai apa, do & don't |
Perbedaan pentingnya:
Kita mulai dengan tokens di episode 4 dan 10. Di design system, mereka dinormalisasi dengan nama yang berbasis peran, bukan nilai mentah:
:root {
/* Warna: semantik, bukan "oranye" */
--color-primary: #b45309;
--color-primary-contrast: #ffffff;
--color-danger: #dc2626;
--color-success: #16a34a;
/* Skala: konsisten di seluruh UI */
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-3: 0.75rem;
--space-4: 1rem;
/* Tipografi & radius */
--font-family-ui: "Inter", system-ui, sans-serif;
--radius-sm: 0.25rem;
--radius-md: 0.5rem;
--shadow-card: 0 1px 3px rgb(0 0 0 / 0.1);
}Prinsipnya: produk memakai --color-primary, bukan #b45309. Saat rebrand, kalian cukup mengubah satu nilai — bukan mencari-cari di 200 file.
Storybook adalah workshop pengembangan komponen: setiap komponen didokumentasikan, bisa dilihat dalam semua state (default, hover, error, loading), diuji visual, dan di-test aksesibilitasnya.
bunx storybook@latest initimport type { Meta, StoryObj } from "@storybook/react";
import { Button } from "./Button";
const meta = {
title: "UI/Button",
component: Button,
args: { children: "Tambah ke keranjang" },
} satisfies Meta<typeof Button>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Primary: Story = {
args: { variant: "primary" },
};
export const Disabled: Story = {
args: { disabled: true },
};
export const Loading: Story = {
args: { loading: true },
};Tip
Storybook bukan sekadar galeri — ia lingkungan pengembangan. Menulis cerita (stories) untuk setiap state memaksa kalian berpikir: "apa saja kondisi yang mungkin?" — praktik yang meningkatkan kualitas komponen dan memudahkan visual test (episode 13).
Kolaborasi desain-kode yang sehat punya pola jelas:
Praktik yang membuat alur ini berjalan:
color/primary, space/4). Token Figma dan token CSS harus 1:1.Langkah membangun dari nol (jangan langsung besar):
Button, Input, Badge dengan story lengkap + variant.src/ui/
├── tokens.css # sumber kebenaran nilai desain
├── Button.tsx
├── Button.stories.tsx
├── Button.test.tsx # jest-axe + behavior (episode 13/15)
├── Input.tsx
├── Input.stories.tsx
└── Badge.tsx| Kesalahan | Dampak | Perbaikan |
|---|---|---|
| Membangun dari nol sebelum ada kebutuhan | Design system tak dipakai | Adopsi bertahap dari kebutuhan nyata |
| Komponen tanpa variant/story | Tidak teruji & tidak terdokumentasi | Storybook lengkap |
| Token & Figma tidak sinkron | Konflik desain-kode | Auto-sync / kontrak token |
| Semua orang boleh menambah komponen | Design system membengkak | Governance & PR |
| Abaikan aksesibilitas komponen | Masalah menyebar ke seluruh produk | Test a11y di CI |
Inti yang harus dibawa pulang:
--color-primary) menjadi satu sumber kebenaran yang mudah diubah.Di episode 26 selanjutnya kita melihat gambaran besar: ekosistem & tren modern 2026 — React Compiler, RSC, TypeScript wajib, AI-native workflows, edge & WASM, dan micro-frontends yang matang. Sampai jumpa di episode 26!