Episode ini membahas design tokens: menyimpannya di tailwind.config.js, mengekspos sebagai CSS variables, dan menyinkronkannya dari Figma. Kalian juga belajar membangun library komponen yang konsisten dan dapat dipublikasikan sebagai paket npm.

Seiring project membesar, kebutuhan akan satu sumber kebenaran desain menjadi kritis. Di episode 10 kita membahas design tokens: menyimpannya di tailwind.config.js, mengekspos sebagai CSS variables, menyinkronkan dari Figma, dan membangun library komponen yang konsisten.
Design system yang baik membuat tim tidak lagi berdebat soal #3b82f6 versus #2563eb. Semua nilai hidup di satu tempat, dikelola bersama antara desain dan engineering, dan diakses lewat nama yang konsisten di mana pun.
Definisikan token sebagai CSS variables di root stylesheet:
:root {
--color-brand: #3b82f6;
--color-surface: #ffffff;
--space-card: 1rem;
--radius-card: 0.5rem;
}Lalu hubungkan ke config:
theme: {
extend: {
colors: {
brand: "var(--color-brand)",
surface: "var(--color-surface)",
},
spacing: {
card: "var(--space-card)",
},
borderRadius: {
card: "var(--radius-card)",
},
},
},Kombinasi ini memberi dua keuntungan: utility seperti bg-brand dan p-card terbentuk, sekaligus nilai dasarnya bisa diubah saat runtime lewat CSS. Pola colors: { brand: "var(--color-brand)" } inilah jembatan antara static config dan dynamic theming.
Figma dan Tailwind tidak saling bicara secara otomatis. Alur yang umum dipakai:
Contoh token JSON sederhana:
{
"color": {
"brand": "#3b82f6",
"surface": "#ffffff"
},
"spacing": {
"card": "1rem"
}
}Tools seperti Style Dictionary bisa mengubah token JSON menjadi berbagai output — termasuk :root CSS variables atau potongan config Tailwind. Alur ini menjadikan Figma sebagai source of truth, dan config Tailwind sebagai turunannya.
Info
Kunci keberhasilan sinkronisasi adalah satu arah alur: Figma ke kode, bukan bolak-balik. Jika desain berubah, perbarui token di Figma, ekspor, lalu commit. Jangan mengubah nilai token langsung di repo tanpa kembali memperbarui Figma, atau keduanya akan menyimpang.
Library komponen dimulai dari keputusan kecil yang konsisten. Pertama, standarkan pattern dengan @apply di layer components:
@layer components {
.btn {
@apply inline-flex items-center justify-center rounded-card bg-brand px-4 py-2 font-medium text-white;
}
.card {
@apply rounded-card border border-gray-200 bg-surface p-card shadow-sm;
}
}Lalu bungkus dengan API komponen di framework — misalnya komponen Button di React atau Svelte — yang menyediakan variants dan slot class. Untuk dipublikasikan sebagai paket, ikuti langkah ini:
npm init -y
npx tsc --initStruktur paket yang umum: folder src berisi komponen, styles berisi CSS yang menyertakan @tailwind dan @layer components, serta tailwind-preset.js yang mengekspor token. Konsumen cukup menginstall dan mendaftarkan preset di config mereka:
module.exports = {
content: ["./node_modules/@org/ui/**/*.{js,jsx}"],
presets: [require("@org/ui/tailwind-preset")],
};Pola presets: [require("@org/ui/tailwind-preset")] inilah yang membuat satu design language menyebar ke banyak aplikasi.
Episode 10 membawa kalian ke level design system: menyimpan token di config, mengeksposnya sebagai CSS variables, menyinkronkan dari Figma, dan membangun library komponen yang bisa dipublikasikan dan dipakai lintas project.
Inti yang harus dibawa pulang:
var(...).@apply dan @layer components.Di episode 11 selanjutnya kita akan membahas handling dynamic content & security — risiko kelas dinamis dari input pengguna, validasi dan safelist patterns, menghindari injection via class names, serta strategi content scanning untuk environment multi-tenant.