Design System ve UI/UX Mimarisi
Yazılım ekiplerinde Design System (Tasarım Sistemi) ve Atomic Design nedir? Design Token yapısı, Figma-Kod senkronizasyonu, Storybook ve WCAG erişilebilirlik.
Yozel
13 dakika

İçindekiler (15)
Dijital ürün geliştiren yazılım organizasyonları büyüdükçe, farklı ürün takımlarının birbirinden bağımsız olarak geliştirdiği ekranlarda kaçınılmaz bir görsel ve davranışsal parçalanma (UI fragmentation) baş gösterir. Bir modülde kullanılan birincil eylem butonunun köşe yuvarlaklığı 6 piksel iken diğerinde 8 piksel olması, otuz farklı mavi tonunun CSS dosyalarına dağılması veya her geliştiricinin açılır menü (dropdown) ile modal pencereleri sıfırdan kendi yöntemiyle kodlaması hem kullanıcı deneyimini zedeler hem de önyüz (frontend) mühendislik hızını dramatik biçimde düşürür. İşte bu kaosu ortadan kaldıran, tasarım ile kod arasındaki boşluğu mühendislik disipliniyle kapatan mimari yapıya Design System (Tasarım Sistemi) adı verilir. Modern uygulama ve yazılım mimarilerinde bir Design System, yalnızca Figma üzerinde hazırlanmış statik bir stil rehberi (style guide) veya UI kiti değil; versiyonlanan, otomatik test edilen, erişilebilirlik standartlarını barındıran ve tüm platformlara (Web, iOS, Android) tek bir doğruluk kaynağından (Single Source of Truth) dağıtılan canlı bir yazılım ürünüdür.
Bu kapsamlı mimari rehberde; Brad Frost'un literatüre kazandırdığı Atomic Design (Atomik Tasarım) metodolojisini, W3C standartlarındaki Design Token mimarisini ve çok katmanlı (Primitive, Semantic, Component) token hiyerarşisini, Figma'dan CI/CD boru hattına otomatik kod senkronizasyonunu, Headless UI (Radix UI, React Aria) primitifleriyle bileşen mühendisliğini, Storybook üzerinde görsel regresyon testlerini ve WCAG 2.2 AA erişilebilirlik uyumluluğunu tüm teknik derinliğiyle inceliyoruz.
1. Design System Nedir? Stil Rehberi ve UI Kitinden Farkı
Sektörde sıkça birbirinin yerine kullanılan Style Guide (Stil Rehberi), Pattern Library (Bileşen Kütüphanesi) ve Design System (Tasarım Sistemi) kavramları aslında farklı olgunluk katmanlarını temsil eder. Bir Stil Rehberi yalnızca tipografi ölçeklerini, marka renk paletini ve ikon kullanım kurallarını belgeleyen statik bir dokümandır. Bir UI Kiti, tasarımcıların Figma veya Sketch içinde sürükle-bırak yöntemiyle ekran tasarlarken kullandıkları görsel semboller bütünüdür. Design System ise görsel tasarım dilini, üretim kalitesindeki kod bileşenlerini (React, Vue, Swift, Kotlin), tasarım tokenlarını, etkileşim standartlarını, erişilebilirlik kurallarını ve yönetişim (governance) süreçlerini tek bir çatı altında birleştiren ekosistemdir.
Kurumsal bir Design System mimarisi kurulduğunda, mobil e-ticaret tasarımında UI/UX trendleri ve dönüşüm optimizasyonu (CRO) çalışmalarında hedeflenen mikro etkileşim tutarlılığı ve sayfa yükleme hızı doğrudan garanti altına alınır. Çünkü ürün ekipleri her yeni özellikte tekerleği yeniden icat etmek yerine, güvenlik, performans ve klavye navigasyonu testlerinden geçmiş hazır yapı taşlarını birleştirerek iş mantığına odaklanır.
2. Atomic Design (Atomik Tasarım) Metodolojisi ve Bileşen Hiyerarşisi
Kimyadaki elementlerin birleşerek molekülleri, moleküllerin de daha karmaşık organizmaları oluşturmasından ilham alan Atomic Design metodolojisi, kullanıcı arayüzlerini beş temel hiyerarşik katmana ayırır. Bu katmanlı mimari, hem tasarım araçlarında (Figma Variants & Auto Layout) hem de önyüz kod tabanında (Component Composition) birebir aynı zihinsel modeli kurmayı sağlar:
- Atomlar (Atoms): Kendi başına daha küçük işlevsel parçalara bölünemeyen en temel yapı taşlarıdır. Bir arayüzdeki
<Button>,<Input>,<Label>,<Badge>,<Avatar>,<Icon>ve tipografik<Text>bileşenleri birer atomdur. Atomlar iş mantığı (business logic) barındırmaz; tamamen tasarım tokenlarıyla stillendirilen saf (pure) bileşenlerdir. - Moleküller (Molecules): İki veya daha fazla atomun belirli bir mikro görevi yerine getirmek üzere bir araya gelmesiyle oluşan anlamlı gruplardır. Örneğin bir
<Label>, bir<Input>ve bir doğrulama hata mesajı<HelperText>atomunun birleşerek oluşturduğu<FormField>bileşeni veya bir arama kutusu ile arama butonunun oluşturduğu<SearchBar>klasik birer moleküldür. - Organizmalar (Organisms): Moleküllerin ve atomların birleşerek arayüzün kendi içinde bağımsız bir bölümünü oluşturduğu karmaşık bileşenlerdir. Üst gezinme çubuğu (
<Navbar>), ürün kartı (<ProductCard>), filtreleme özellikli veri tablosu (<DataTable>) veya ödeme formu (<CheckoutSummary>) organizma katmanında yer alır. - Şablonlar (Templates): Organizmaların sayfa üzerindeki ızgara sistemine (CSS Grid / Flexbox), boşluk (spacing) kurallarına ve duyarlı (responsive) kırılım noktalarına (breakpoints) göre yerleştirildiği iskelet yapılardır. Şablonlar gerçek içerik yerine yapısal yerleşimi (layout architecture) tanımlar.
- Sayfalar (Pages): Şablonların gerçek API verileri, dinamik içerikler, uzun metinler ve uç durum (edge-case) senaryolarıyla doldurulduğu son kullanıcı ekranlarıdır. Tasarım sisteminin gerçek dünya verileri altında nasıl davrandığı bu katmanda doğrulanır.
3. W3C Design Tokens Mimarisi ve Çoklu Platform Dönüşümü
Bir tasarım sisteminin kalbi bileşenler değil, o bileşenlere görsel kimliğini veren Design Token (Tasarım Jetonu) katmanıdır. Design Token'lar; renk kodları (HEX/OKLCH), yazı tipi boyutları, satır yükseklikleri, boşluk birimleri, gölge değerleri, animasyon süreleri (duration/easing) ve kenarlık yarıçapları gibi atomik tasarım kararlarının platformdan bağımsız JSON formatında saklanmasıdır.
Üç Katmanlı Token Hiyerarşisi (Primitive, Semantic, Component)
Ölçeklenebilir bir Design System'de ham renk kodlarını doğrudan bileşenlere atamak büyük bir mimari hatadır. Bunun yerine üç katmanlı bir soyutlama (abstraction) mimarisi uygulanır:
- 1. Katman: Primitive (Global / Core) Tokenlar: Sistemdeki tüm olası ham değerlerin bağlamdan bağımsız kataloğudur. Örneğin
color.blue.600: "#2563EB"veyaspace.4: "16px". Bu tokenlar bir rengin ne olduğunu söyler ancak nerede kullanılacağını söylemez. - 2. Katman: Semantic (Alias / Theme) Tokenlar: Primitive tokenlara kullanım amacı ve bağlam kazandıran katmandır. Örneğin
color.bg.brand.primary: "{color.blue.600}"veyacolor.text.danger: "{color.red.700}". Karanlık mod (Dark Mode) veya çoklu marka (Multi-brand / White-label) desteği tam olarak bu katmanda çözülür: Karanlık temaya geçildiğinde bileşen koduna hiç dokunulmaz, yalnızcacolor.surface.primarysemantik tokenının işaret ettiği primitive değer{color.neutral.50}yerine{color.neutral.900}olarak değiştirilir. - 3. Katman: Component (Scoped) Tokenlar: Belirli bir bileşenin özel durumlarını kontrol eden en spesifik katmandır. Örneğin
button.primary.bg.hover: "{color.bg.brand.primary.hover}". Büyük kurumsal sistemlerde istisnai özelleştirmeler gerektiğinde devreye girer.
// W3C Design Tokens Formatı ve Style Dictionary Dönüşüm Örneği (tokens.json)
{
"color": {
"primitive": {
"indigo": {
"600": { "$value": "#4F46E5", "$type": "color" },
"700": { "$value": "#4338CA", "$type": "color" }
}
},
"semantic": {
"action": {
"primary": {
"default": { "$value": "{color.primitive.indigo.600}", "$type": "color" },
"hover": { "$value": "{color.primitive.indigo.700}", "$type": "color" }
}
}
}
}
}
Figma Variables veya Tokens Studio üzerinde tanımlanan bu JSON dosyası, bir değişiklik yapıldığında Git deposuna otomatik bir Pull Request açar. CI/CD hattında çalışan Style Dictionary derleyicisi, bu tek JSON kaynağını okuyarak Web için CSS Custom Properties (--color-action-primary-default: #4F46E5;) ve Tailwind yapılandırması, iOS için Swift UIColor/Color sabitleri ve Android için Jetpack Compose / XML kaynak dosyalarını saniyeler içinde otomatik üretir.
4. Headless UI Primitifleri ve Bileşen API Mühendisliği
Modern önyüz mühendisliğinde bir <Select>, <Dialog>, <Popover> veya <Combobox> bileşenini sıfırdan yazmak göründüğünden çok daha zordur. Görsel stillendirme işin sadece %20'sidir; geriye kalan %80'lik kısım odak tuzakları (focus trapping), ekran okuyucu (ARIA) nitelikleri, klavye ok tuşlarıyla gezinme (roving tabindex), ekran dışına taşmayı önleyen çarpışma algılama (collision detection) ve dışarı tıklandığında kapanma mantığıdır.
Bu nedenle günümüzün en başarılı Design System mimarileri, davranış ile görselliği birbirinden ayıran Headless UI (Başsız Arayüz) kütüphaneleri (örneğin Radix Primitives, React Aria, Ark UI) üzerine inşa edilir. Headless UI katmanı hiçbir CSS stili dayatmadan tüm WAI-ARIA erişilebilirlik durum makinelerini (state machines) ve klavye etkileşimlerini sağlar; kurumun kendi Design System ekibi ise bu sağlam temel üzerine kendi Design Tokenlarını ve görsel tasarım dilini giydirir.
Compound Components (Bileşik Bileşen) API Deseni
Bileşen kütüphanelerinde onlarca boolean prop (örneğin <Modal hasHeader hasFooter showCloseButton isCentered footerButtons={[...]} />) kullanmak, zamanla bakımı imkansız bir "prop cehennemi" (prop explosion) yaratır. Bunun yerine esnek Compound Component deseni tercih edilmelidir:
// Anti-Pattern: Aşırı yüklenmiş (monolitik) Prop API
<Dialog title="Kaydı Sil" description="Emin misiniz?" confirmText="Sil" cancelText="İptal" showIcon />
// Best Practice: Esnek ve Okunabilir Compound Component API
<Dialog.Root>
<Dialog.Trigger asChild>
<Button variant="danger">Kaydı Sil</Button>
</Dialog.Trigger>
<Dialog.Content>
<Dialog.Header>
<Dialog.Title>Kaydı Silmek İstediğinize Emin Misiniz?</Dialog.Title>
<Dialog.Description>Bu işlem geri alınamaz ve bağlı tüm veriler kalıcı olarak silinir.</Dialog.Description>
</Dialog.Header>
<Dialog.Footer>
<Dialog.Close asChild><Button variant="ghost">İptal</Button></Dialog.Close>
<Button variant="danger" onClick={handleDelete}>Evet, Kalıcı Olarak Sil</Button>
</Dialog.Footer>
</Dialog.Content>
</Dialog.Root>
5. Storybook, Görsel Regresyon Testleri ve WCAG 2.2 AA Erişilebilirlik
Bir bileşen kütüphanesinin kurumsal ölçekte güvenle kullanılabilmesi için her bileşenin izole bir ortamda dokümante edilmesi ve otomatik testlerden geçirilmesi şarttır. Storybook, bileşenleri ana uygulamanın karmaşık iş mantığından ve API bağımlılıklarından tamamen bağımsız bir laboratuvar ortamında geliştirmeyi ve sergilemeyi sağlar.
- Görsel Regresyon Testleri (Visual Regression Testing): Bir geliştiricinin bir atom bileşenindeki
paddingdeğerinde yaptığı 2 piksellik değişiklik, 40 farklı ekranda kaymalara neden olabilir. Chromatic veya Playwright Visual Comparisons entegrasyonu sayesinde her Pull Request'te tüm Storybook hikayelerinin (stories) farklı ekran çözünürlüklerinde ve hem açık hem karanlık temada piksel-piksel ekran görüntüleri alınır; önceki sürümle aradaki en ufak görsel fark (visual diff) otomatik olarak raporlanır. - Etkileşim Testleri (Interaction Testing): Storybook
playfonksiyonları aracılığıyla kullanıcının bir açılır menüye tıklaması, form alanını doldurması ve klavye ile sekme (Tab) geçişi yapması gerçek bir tarayıcı motorunda simüle edilerek DOM durumları doğrulanır. - WCAG 2.2 AA Erişilebilirlik (Accessibility - a11y) Uyumluluğu: Erişilebilirlik yalnızca yasal bir zorunluluk (European Accessibility Act - EAA) değil, evrensel yazılım kalitesinin temel göstergesidir. Tasarım sisteminde normal metinler için en az 4.5:1, büyük metinler ve grafiksel arayüz bileşenleri için en az 3:1 renk kontrast oranı (APCA / WCAG kontrastı) token seviyesinde zorunlu kılınmalıdır. Ayrıca WCAG 2.2 ile gelen minimum dokunma/tıklama hedefi boyutu (en az 24x24 CSS pikseli), görünür odak halkaları (
:focus-visible) ve ekran okuyucu canlı bölge (aria-live) bildirimleri CI hattında çalışanaxe-coremotoruyla her derlemede otomatik denetlenmelidir.
6. UI Bileşen Mimarisi Yaklaşımları Karşılaştırma Tablosu
Önyüz ve mobil yazılım ekiplerinin ürün ölçeğine, özelleştirme ihtiyacına ve mühendislik kaynaklarına göre seçebileceği dört farklı UI mimari yaklaşımını aşağıdaki tabloda karşılaştırıyoruz:
| Mimari Kriter | Hazır Stil Kütüphaneleri (MUI, Ant Design, Bootstrap) | Headless UI + Özel Token (Radix / React Aria + Tailwind) | Kopyala-Sahip Ol Modeli (shadcn/ui Mimarisi) | Tamamen Sıfırdan Özel Kurumsal Design System |
|---|---|---|---|---|
| Pazara Çıkış Hızı (Time-to-Market) | Çok Yüksek (Zengin bileşen seti kutudan çıktığı gibi hazırdır) | Orta (Görsel katmanın kurumun tokenlarıyla giydirilmesi gerekir) | Yüksek (Hazır şablonlar doğrudan proje kaynak koduna eklenir) | Düşük (Aylar süren özel tasarım ve mühendislik yatırımı gerektirir) |
| Marka Özelleştirme Esnekliği | Düşük / Orta (Varsayılan stilleri ezmek CSS özgüllük savaşına yol açabilir) | Çok Yüksek (%100 kurumsal görsel kimlik ve sıfır stil çakışması) | Çok Yüksek (Bileşen kodu doğrudan sizin reponuzda olduğu için tam kontrol) | Tam Kontrol (Tüm API ve görsel dil kurumun ihtiyaçlarına göre yazılır) |
| Erişilebilirlik (WAI-ARIA & Klavye) | Yüksek (Kütüphane sağlayıcısı tarafından hazır sunulur) | Çok Yüksek (Başsız primitifler en güncel WCAG standartlarını uygular) | Çok Yüksek (Altyapısında Radix/Aria primitiflerini kullanır) | Riskli (Ekibin derin a11y uzmanlığı yoksa ciddi eksikler oluşabilir) |
| Paket Boyutu (Bundle Size) ve Performans | Ağır (Çalışma zamanı CSS-in-JS motorları nedeniyle yüksek JS yükü) | Çok Hafif (Sıfır çalışma zamanı CSS maliyeti ve tam tree-shaking) | Çok Hafif (Yalnızca projede kullanılan bileşenler derlemeye dahil edilir) | Optimize Edilebilir (Mimari tercihe göre sıfır bağımlılıkla kurulabilir) |
| Çoklu Proje Dağıtımı ve Güncelleme | npm paket güncellemesi ile kolay ancak kırıcı değişiklik (breaking change) riski | İç npm paketi (@company/ui) olarak merkezi versiyonlama |
Çoklu repoda senkronizasyon zordur (Merkezi monorepo paketi yapılmalıdır) | Semantik versiyonlama (SemVer) ve otomatik codemod göç betikleriyle yönetilir |
7. Yönetişim (Governance), Versiyonlama ve Ekipler Arası Benimseme
Teknik olarak kusursuz kodlanmış bir Design System bile, eğer ürün ekipleri tarafından benimsenmiyorsa veya bir bileşene yeni bir özellik eklemek haftalar süren bürokratik onaylara takılıyorsa başarısızlığa mahkumdur. Başarılı kurumsal tasarım sistemleri Federe Yönetişim Modeli (Federated Governance Model) ile yönetilir: Merkezi bir çekirdek ekip (Core Design System Team) altyapıyı, token mimarisini ve kalite standartlarını korurken; farklı ürün takımlarındaki tasarımcı ve geliştiriciler de yeni bileşen veya iyileştirme katkısında (InnerSource contribution) bulunabilir.
Ayrıca kurumsal yazılım entegrasyonlarında veri tutarlılığını koruyan versiyonlama stratejileri gibi, tasarım sistemi paketleri de katı bir Semantik Versiyonlama (SemVer - Major.Minor.Patch) disipliniyle yayınlanmalıdır. Örneğin Changesets aracı kullanılarak her Pull Request'te yapılan değişikliğin kapsamı kaydedilir, sürüm notları (Changelog) otomatik oluşturulur ve eğer bir bileşen API'sinde geriye dönük uyumsuz (breaking change) bir değişiklik yapıldıysa, tüketici projelerin kodlarını otomatik güncelleyen AST tabanlı Codemod betikleri sürümle birlikte dağıtılır. Günümüzde gelişmiş yapay zeka modelleri ve kodlama ajanları da MCP (Model Context Protocol) üzerinden kurumun Storybook dokümantasyonuna bağlanarak yeni ekranları doğrudan bu özel Design System bileşenleriyle hatasız şekilde üretebilmektedir.
Sıkça Sorulan Sorular (SSS)
1. Küçük veya orta ölçekli bir yazılım ekibi ne zaman kendi Design System'ini kurmalıdır?
Tek bir ürünü olan ve henüz ürün-pazar uyumunu (Product-Market Fit) arayan erken aşama girişimlerin sıfırdan özel bir Design System inşa etmesi mühendislik kaynaklarının yanlış kullanılmasına yol açar. Bu aşamadaki ekipler için shadcn/ui veya Radix + Tailwind CSS gibi hazır erişilebilir primitifleri alıp üzerine temel renk ve tipografi tokenlarını tanımlamak en doğru yaklaşımdır. Ancak birden fazla web/mobil uygulama geliştiren, 10'dan fazla önyüz geliştiricisi bulunan veya çoklu marka (white-label) mimarisine sahip şirketlerde merkezi bir Design System yatırımı 3 ila 6 ay içinde kendini amorti eder.
2. Figma'daki bileşenler ile React/Vue kodundaki bileşenlerin birbirinden kopmasını (Design Drift) nasıl engelleriz?
Tasarım kaymasını (Design Drift) önlemenin ilk adımı, isimlendirme sözlüğünü (ubiquitous language) eşitlemektir: Figma'daki bir bileşenin adı, varyant özellikleri (prop names) ve token isimleri koddaki React/Vue bileşeninin TypeScript arayüzüyle (interface) %100 aynı olmalıdır. İkinci adım ise Figma Code Connect ve otomatik token senkronizasyon boru hatlarını kullanarak Figma'daki bir değişken değiştiğinde doğrudan GitHub/GitLab üzerinde otomatik bir Pull Request tetiklemektir.
3. Design Token'larda neden HEX veya RGB yerine OKLCH renk uzayı tercih edilmeye başlandı?
Geleneksel HSL veya RGB renk uzayları insan gözünün parlaklık algısıyla uyumlu değildir; örneğin HSL'de %50 parlaklığa (lightness) sahip bir sarı ile %50 parlaklığa sahip bir mavi insan gözüne tamamen farklı kontrastlarda görünür. OKLCH (Oklab Lightness, Chroma, Hue) ise algısal olarak tekdüze (perceptually uniform) bir renk uzayıdır. OKLCH kullanıldığında, sadece Hue (Renk Tonu) açısını değiştirerek tüm renk paletlerinde matematiksel olarak birebir aynı erişilebilirlik kontrastına (WCAG) sahip ton ölçekleri (50'den 950'ye) otomatik üretilebilir.
4. Bir bileşenin Design System kütüphanesine mi yoksa sadece ilgili ürün sayfasına mı ait olduğuna nasıl karar verilir?
Endüstride kabul gören en pratik ölçüt "Üçler Kuralı" (Rule of Three) prensibidir. Eğer bir UI bileşeni yalnızca tek bir ekranda veya tek bir iş akışında kullanılıyorsa ve yoğun alan (domain) mantığı içeriyorsa, o bileşen yerel proje dizininde kalmalıdır. Ancak aynı görsel ve etkileşimsel örüntü en az üç farklı ürün modülünde veya projede ihtiyaç haline geldiyse, iş mantığından arındırılarak (generic hale getirilerek) merkezi Design System kütüphanesine yükseltilir (promoted).
5. CSS-in-JS (styled-components, Emotion) kütüphaneleri Design System mimarilerinde neden terk ediliyor?
Geleneksel çalışma zamanı (runtime) CSS-in-JS kütüphaneleri, stil kurallarını tarayıcıda JavaScript çalışırken dinamik olarak hesaplayıp DOM'a enjekte eder. Bu yaklaşım hem JavaScript paket boyutunu büyütür, hem ana iş parçacığında (main thread) ekstra CPU yükü oluşturarak Core Web Vitals (özellikle INP ve LCP) metriklerini düşürür, hem de React Server Components (RSC) gibi modern sunucu taraflı mimarilerle uyumsuzluk yaratır. Bu nedenle modern tasarım sistemleri CSS Custom Variables, Tailwind CSS, Vanilla Extract veya Panda CSS gibi Sıfır Çalışma Zamanı (Zero-Runtime) derleme zamanı çözümlerine geçiş yapmaktadır.
Yozel
Codex haberleri en az iki bağımsız kaynakla doğrulanır; düzeltmeler yazının altında tarih ve saatle belirtilir. Yayın ilkelerimiz