Takip et

Web Bileşenleri Dünyasında Yeni Bir Soluk: CSS-Only Custom Elements Nedir?

Modern web geliştirme dünyasında, yeniden kullanılabilir ve kapsüllenmiş kullanıcı arayüzü (UI) bileşenleri oluşturmak, uygulamaların hızla geliştirilmesi ve sürdürülebilirliği açısından hayati önem taşır.

Web Bileşenleri Dünyasında Yeni Bir Soluk: CSS-Only Custom Elements Nedir?

Modern web geliştirme dünyasında, yeniden kullanılabilir ve kapsüllenmiş kullanıcı arayüzü (UI) bileşenleri oluşturmak, uygulamaların hızla geliştirilmesi ve sürdürülebilirliği açısından hayati önem taşır. Geleneksel olarak, bu tür “özel elementler” oluşturmak için React, Vue, Angular gibi JavaScript framework’lerine veya Web Components API’sine başvurulur. Ancak, her senaryo için tam teşekküllü bir JavaScript çözümü gerekli midir? Ya da daha hafif, daha performanslı ve daha basit bir yol var mıdır? İşte tam bu noktada CSS-Only Custom Elements kavramı devreye giriyor. Bu makalede, JavaScript’e bağımlı kalmadan, yalnızca HTML ve CSS’in gücüyle nasıl özel bileşenler oluşturabileceğimizi, bu yaklaşımın avantajlarını, temel prensiplerini ve gerçek dünya uygulamalarını adım adım inceleyeceğiz. Amacımız, hem yeni başlayanların konuya hakim olmasını sağlamak hem de deneyimli geliştiricilere ilham verecek ileri düzey teknikler sunmaktır.

CSS-Only Custom Elements, adından da anlaşılacağı gibi, JavaScript kullanmadan, sadece CSS ve HTML’in yerel yetenekleriyle tasarlanmış, kendi içinde kapsüllenmiş ve yeniden kullanılabilir UI parçacıklarıdır. Bunlar, gerçek bir Web Component (web bileşeni) değildirler çünkü customElements.define() gibi JavaScript API’lerini kullanmazlar. Bunun yerine, HTML’in semantik yapısını, CSS’in güçlü seçicilerini, pseudo-elementlerini, CSS değişkenlerini ve yeni nesil düzen özelliklerini (Flexbox, Grid) akıllıca birleştirerek, bir özel bileşen hissi yaratırlar. Bu yaklaşım, özellikle basit etkileşimlere sahip veya tamamen görsel tabanlı bileşenler için idealdir. Örneğin, bir kart bileşeni, bir uyarı mesajı, basit bir sekme menüsü veya bir düğme grubu gibi öğeler, bu yöntemle şaşırtıcı derecede güçlü ve esnek bir şekilde oluşturulabilir. Bu teknik, web sitenizin yükleme süresini kısaltabilir, JavaScript bağımlılığını azaltabilir ve projelerinizin bakımını kolaylaştırabilir. Peki, bu “yalnızca CSS” felsefesiyle neler başarabiliriz ve bu bize ne gibi kapılar açar?

Neden CSS-Only Yaklaşımı Tercih Edilmeli? Avantajları ve Kullanım Senaryoları Nelerdir?

Günümüz web geliştirme dünyasında hız ve performans, kullanıcı deneyiminin temel taşlarıdır. Her eklenen JavaScript kodu, sayfanın yüklenme süresini artırabilir, tarayıcıda daha fazla işlem gücü tüketebilir ve dolayısıyla kullanıcıya daha yavaş bir deneyim sunabilir. CSS-Only Custom Elements yaklaşımı, bu noktada önemli avantajlar sunarak, geliştiricilere daha hafif, daha hızlı ve daha sürdürülebilir çözümler üretme imkanı tanır. Bu yaklaşımın sunduğu başlıca faydaları ve hangi senaryolarda tercih edilmesi gerektiğini derinlemesine inceleyelim.

Performans ve Yükleme Hızı

En belirgin avantajlardan biri, şüphesiz performanstır. JavaScript dosyalarının indirilmesi, ayrıştırılması ve yürütülmesi, özellikle mobil cihazlarda veya yavaş internet bağlantılarında önemli gecikmelere neden olabilir. CSS-Only bileşenler, neredeyse hiç JavaScript gerektirmediği için bu ek yükten tamamen kurtulur. Tarayıcı, sadece HTML yapısını ve CSS stil kurallarını işler ki bu, çoğu zaman JavaScript işleminden çok daha hızlıdır. Bu durum, özellikle ilk sayfa yüklemesinde (First Contentful Paint, FCP) ve etkileşime hazır olma süresinde (Time to Interactive, TTI) gözle görülür iyileşmeler sağlar. Daha hızlı yüklenen sayfalar, kullanıcıların sitenizde daha uzun süre kalmasını teşvik eder ve arama motoru optimizasyonu (SEO) açısından da pozitif bir etki yaratır.

Geliştirme Kolaylığı ve Hız

JavaScript framework’leri güçlü araçlar olsa da, öğrenme eğrileri ve yapılandırma karmaşıklıkları olabilir. CSS-Only yaklaşımı, temel HTML ve CSS bilgisi olan herkesin hızla özel bileşenler oluşturabilmesini sağlar. Karmaşık bir build süreci (derleme süreci) veya özel bir tooling (araç takımı) gerektirmez. Bu, özellikle küçük ve orta ölçekli projelerde veya prototipleme aşamalarında geliştirme sürecini önemli ölçüde hızlandırabilir. Geliştiriciler, doğrudan tarayıcıda çalışabilen, anlaşılması ve üzerinde değişiklik yapılması kolay kodlar yazabilirler.

Bakım Maliyetlerinin Düşüklüğü

Daha az JavaScript kodu, genellikle daha az hata ve daha kolay hata ayıklama anlamına gelir. CSS kuralları, genellikle JavaScript mantığından daha deterministiktir (belirleyicidir) ve öngörülebilirdir. Bir bileşenin stilini değiştirmek veya küçük bir düzenleme yapmak, yalnızca CSS dosyasında ilgili kuralı bulup düzenlemek kadar basittir. Bu, uzun vadede projenin bakım maliyetlerini düşürür ve yeni ekip üyelerinin projeye adaptasyonunu kolaylaştırır. Ayrıca, framework bağımlılığı olmadığı için, framework güncellemeleri veya değişiklikleri nedeniyle bileşenlerin yeniden yazılması gibi durumlar yaşanmaz.

Erişilebilirlik (Accessibility) Faydaları

Doğru bir şekilde uygulandığında, CSS-Only Custom Elements, mükemmel erişilebilirlik sağlayabilir. Bunun temel nedeni, genellikle semantik (anlamsal) HTML yapısına dayanmalarıdır. Örneğin, bir sekme menüsü oluştururken, JavaScript ile dinamik olarak div‘ler oluşturmak yerine, input type="radio" ve label elementlerini kullanmak, ekran okuyucular için doğal bir navigasyon ve etkileşim deneyimi sunar. Bu, web sitenizin daha geniş bir kitle tarafından kullanılabilir olmasını sağlar ve yasal erişilebilirlik standartlarına uyumu kolaylaştırır. JavaScript’in varlığı, bazen erişilebilirlik katmanını karmaşıklaştırabilirken, CSS-Only çözümler genellikle tarayıcının yerleşik erişilebilirlik özelliklerinden faydalanır.

Gerçek Dünya Kullanım Senaryoları

Peki, bu yaklaşım hangi durumlarda parlayabilir? İşte bazı pratik örnekler:

  • Basit UI Bileşenleri: Düğmeler, kartlar, uyarı mesajları, rozetler (badges), yükleme göstergeleri (spinners), araç ipuçları (tooltips) gibi statik veya basit etkileşimli bileşenler için idealdir. Örneğin, bir ürün kartı, sadece resim, başlık, açıklama ve fiyat içeriyorsa, tamamen CSS ile oluşturulabilir.
  • Form Elemanları: Özel radyo düğmeleri, onay kutuları (checkboxes), seçici kutular (select boxes) veya anahtarlar (toggles) gibi form elemanlarının görsel stilizasyonu, JavaScript’e ihtiyaç duymadan yapılabilir. :checked veya :focus gibi CSS pseudo-sınıfları, bu elemanların durumlarına göre stil değiştirmesine olanak tanır.
  • Navigasyon ve Sekme Menüleri: Basit açılır menüler (dropdown menus) veya sekme menüleri (tabbed interfaces), :hover, :focus-within veya gizli radyo düğmeleriyle kontrol edilebilir. Bu sayede, kullanıcılar JavaScript olmadan farklı içerik panelleri arasında geçiş yapabilir.
  • Görsel Efektler ve Animasyonlar: Geçişler (transitions), animasyonlar ve transformasyonlar (transformations) tamamen CSS ile yönetilebildiği için, görsel olarak zengin bileşenler oluşturmak mümkündür. Örneğin, bir modülün açılıp kapanması veya bir öğenin görünürlüğünün değiştirilmesi, CSS animasyonlarıyla gerçekleştirilebilir.

Özetle, CSS-Only Custom Elements, web geliştiricilerine daha performanslı, daha basit ve daha yönetilebilir UI bileşenleri oluşturma konusunda güçlü bir alternatif sunar. Her ne kadar karmaşık etkileşimler için JavaScript’in yerini tutmasa da, birçok yaygın senaryoda mükemmel bir çözüm olabilir ve web uygulamalarınızın genel kalitesini artırabilir.

Temel Taşlar: CSS-Only Custom Elements Nasıl Mümkün Olur?

CSS-Only Custom Elements yaklaşımının temelinde, HTML ve CSS’in belirli özelliklerinin akıllıca kullanılması yatar. Bu özellikler, JavaScript’in sağladığı kapsülleme, yeniden kullanılabilirlik ve dinamiklik hissini, tarayıcının yerleşik yetenekleriyle taklit etmemizi sağlar. Bu bölümde, bu yaklaşımın yapı taşlarını oluşturan anahtar CSS özelliklerini ve kavramlarını detaylıca inceleyeceğiz. Bu özellikler, her ne kadar ayrı ayrı biliniyor olsa da, bir araya geldiklerinde gerçekten dönüştürücü bir güç oluştururlar.

display: contents Özelliği: DOM Yapısını Etkilemeden Görsel Düzenleme

display: contents, CSS-Only Custom Elements için belki de en kritik özelliklerden biridir. Bu özellik, bir elemanın kutu modelini (box model) ortadan kaldırır, ancak çocuk elemanlarının DOM ağacındaki yerini korur. Yani, elemanın kendisi görsel olarak yok olur, ancak çocukları, ebeveynlerinin doğrudan çocukları gibi davranır. Bu ne anlama geliyor? Bir kapsayıcı div‘iniz olduğunu ve bu div‘in içinde üç tane daha div olduğunu düşünün. Eğer dıştaki div‘e display: contents verirseniz, bu dıştaki div‘in kenarlıkları, dolgusu veya arka planı görünmez olur; ancak içindeki üç div, dıştaki div‘in ebeveyninin doğrudan çocuklarıymış gibi düzenlenir. Bu, özellikle Flexbox veya Grid gibi düzen sistemleriyle çalışırken çok güçlüdür. Bir bileşenin iç yapısını korurken, dışarıdan uygulanan düzen kurallarına uyum sağlamasını mümkün kılar. Örneğin, bir “kart” bileşeni oluşturdunuz ve bu kartın içinde başlık, resim ve açıklama gibi farklı kısımlar var. Kartın ana kapsayıcısına display: contents uygulayarak, kartın iç elemanlarını, kartın yerleştirildiği bir Flexbox veya Grid konteynerinin doğrudan elemanları gibi düzenleyebilirsiniz. Bu, bileşenin dışarıdan esnek bir şekilde konumlandırılmasını sağlarken, iç yapısının bütünlüğünü korur.

CSS Değişkenleri (Custom Properties): Dinamik Stil Yönetimi ve Özelleştirilebilirlik

CSS değişkenleri, modern CSS’in en güçlü özelliklerinden biridir ve CSS-Only Custom Elements’in dinamik ve özelleştirilebilir olmasını sağlar. Geleneksel olarak, bir bileşenin rengini, boyutunu veya yazı tipini değiştirmek istediğinizde, doğrudan CSS dosyasında ilgili kuralı bulup düzenlemeniz gerekirdi. Ancak CSS değişkenleri (--degisken-adi: deger; şeklinde tanımlanır ve var(--degisken-adi) ile kullanılır), bu süreci çok daha esnek hale getirir. Bir bileşenin stil özelliklerini, HTML üzerinden veya JavaScript ile (ancak bu senaryoda JavaScript’i minimumda tutuyoruz) kolayca değiştirebilirsiniz. Örneğin, bir bileşenin ana rengini --ana-renk: #3498db; olarak tanımlayıp kullanabilir, daha sonra bu rengi farklı bir yerde --ana-renk: #e74c3c; olarak geçersiz kılarak bileşenin görünümünü değiştirebilirsiniz. Bu, bileşenlerin farklı temalar veya durumlar için kolayca özelleştirilebilmesini sağlar ve daha modüler bir stil mimarisi oluşturur. Ayrıca, bir bileşenin kullanıcının tercihine göre (örneğin, koyu/açık mod) stilini dinamik olarak değiştirmesi için de temel oluşturur.

Pseudo-elementler (::before, ::after): Ek Görsel Öğeler Ekleme

::before ve ::after pseudo-elementleri, bir elemanın içeriğinden bağımsız olarak ek görsel öğeler eklememizi sağlar. Bu öğeler, DOM’da gerçek bir eleman olarak yer almazlar, ancak CSS ile stilize edilebilirler. Bu, özellikle bir bileşene ek simgeler, dekoratif çizgiler, oklar veya kapatma düğmeleri eklemek istediğimizde çok kullanışlıdır. Örneğin, bir uyarı mesajı bileşenine bir “kapat” simgesi eklemek için, ana kapsayıcının ::after pseudo-elementini kullanabilir ve ona bir çarpı işareti veya bir simge fontu atayabilirsiniz. Bu, HTML’i gereksiz div‘lerden arındırarak daha temiz ve daha semantik kalmasını sağlar. Ayrıca, bu pseudo-elementler, bir bileşenin çeşitli durumlarını (örneğin, aktif/pasif) görsel olarak belirtmek için de kullanılabilir.

Gelişmiş Seçiciler (:has(), :focus-within, Kardeş Seçiciler): Duruma Göre Stil Uygulama

CSS’in güçlü seçici mekanizması, bileşenlerin farklı durumlara (state) göre stil değiştirmesini sağlar. Bu, JavaScript’in genellikle üstlendiği bir görevi CSS’e aktarır:

  • :has() Seçicisi: Bu yeni ve güçlü seçici (henüz tüm tarayıcılarda tam desteklenmese de), bir elemanın belirli bir alt elemanı içerip içermediğine göre stil uygulamanızı sağlar. Örneğin, div:has(p) seçicisi, içinde bir paragraf (p) elemanı olan tüm div‘leri seçer. Bu, bir bileşenin içindeki içeriğe göre dış görünümünü değiştirmek için inanılmaz derecede esnek bir yol sunar.
  • :focus-within Seçicisi: Bir eleman veya onun herhangi bir alt elemanı odaklandığında stil uygulamanızı sağlar. Bu, özellikle form elemanları veya açılır menüler gibi etkileşimli bileşenlerde erişilebilirliği ve kullanıcı deneyimini artırmak için çok önemlidir. Örneğin, bir form grubunun içine odaklanıldığında, tüm grubun kenarlığını vurgulayabilirsiniz.
  • Kardeş Seçiciler (Adjacent Sibling Selector + ve General Sibling Selector ~): Bu seçiciler, aynı ebeveynin çocukları olan elemanlar arasında ilişki kurmanızı sağlar. Örneğin, input:checked + label seçicisi, işaretlenmiş bir input elemanının hemen ardından gelen label elemanını seçer. Bu, özellikle radyo düğmeleri veya onay kutuları gibi form elemanlarını özelleştirirken ve JavaScript olmadan etkileşimli bileşenler oluştururken kritik öneme sahiptir. Sekme menüleri veya akordiyonlar (accordions) gibi karmaşık etkileşimler, bu seçiciler ve gizli input elemanları kullanılarak tamamen CSS ile yönetilebilir.

Bu temel taşlar bir araya geldiğinde, CSS-Only Custom Elements, JavaScript’in karmaşıklığı olmadan, etkileşimli, özelleştirilebilir ve performanslı UI bileşenleri oluşturmak için güçlü bir temel sunar. Her bir özelliğin derinlemesine anlaşılması, bu yaklaşımın potansiyelini tam olarak kullanmak için anahtardır.

Adım Adım Uygulama: Basit Bir Uyarı Mesajı Bileşeni Oluşturma

Şimdiye kadar CSS-Only Custom Elements’in teorik altyapısını ve temel prensiplerini inceledik. Artık öğrendiklerimizi pratik bir örnek üzerinde uygulayarak, bu yaklaşımın gücünü somutlaştıralım. Basit, ancak yaygın olarak kullanılan bir “uyarı mesajı” (alert message) bileşeni oluşturacağız. Bu bileşen, bir mesajı görüntüleyecek ve bir kapatma düğmesi içerecektir. JavaScript olmadan bu etkileşimi nasıl sağlayacağımızı göreceğiz.

HTML Yapısı: Semantik ve Modüler Bir Yaklaşım

Bir uyarı mesajı için ihtiyacımız olan temel elemanlar: bir kapsayıcı, mesajın kendisi ve bir kapatma düğmesi. Erişilebilirlik ve semantik önem taşıdığı için, mümkün olduğunca anlamlı HTML etiketleri kullanmaya özen göstereceğiz. Kapatma işlevi için, gizli bir onay kutusu (checkbox) kullanacağız. Bu, CSS’in :checked pseudo-sınıfını kullanarak uyarıyı gizlememizi sağlayacak.


<div class="uyari-mesaji-kapsayici">
  <input type="checkbox" id="uyari-kapat" class="uyari-kapat-input" hidden>
  <div class="uyari-mesaji">
    <p>Bu, sadece CSS ile oluşturulmuş harika bir uyarı mesajıdır!</p>
    <label for="uyari-kapat" class="uyari-kapat-dugmesi">X</label>
  </div>
</div>
      

Yukarıdaki HTML yapısında:

  • .uyari-mesaji-kapsayici: Tüm uyarı bileşenini saran ana kapsayıcıdır.
  • input type="checkbox": Bu, uyarıyı gizlemek için bir “anahtar” görevi görecek gizli bir onay kutusudur. id="uyari-kapat" ile bir etiketle ilişkilendirilecektir. hidden niteliği, bu input’un varsayılan olarak görünmemesini sağlar.
  • .uyari-mesaji: Asıl uyarı içeriğini ve kapatma düğmesini barındıran elemandır. Bu, görsel olarak şekillendireceğimiz kısımdır.
  • p: Uyarı mesajının metnini içerir.
  • label for="uyari-kapat": Bu etiket, gizli onay kutusunu tetiklemek için kullanılır. Kullanıcı bu etikete tıkladığında (ki bu bizim “kapatma düğmemiz” olacak), ilgili input elemanının checked durumu değişir. İçindeki “X” metni, kapatma düğmesinin görselini temsil eder.

CSS ile Görselleştirme ve Etkileşim

Şimdi, bu HTML yapısını kullanarak uyarı mesajımızı stilize edelim ve JavaScript olmadan kapatma işlevini ekleyelim. Unutmayın, burada doğrudan CSS kodu yazmıyoruz, ancak hangi CSS özelliklerinin kullanılacağını ve etkilerini açıklıyoruz.

Öncelikle, uyarı mesajının ana kapsayıcısına (.uyari-mesaji) temel stil özelliklerini uygulayacağız. Buna bir arka plan rengi, metin rengi, dolgu (padding) ve kenarlık (border) verebiliriz. CSS değişkenlerini kullanarak renkleri ve dolguları kolayca özelleştirilebilir hale getirebiliriz:

  • --uyari-arka-plan: #e0f7fa; (Açık mavi arka plan)
  • --uyari-metin-rengi: #006064; (Koyu metin rengi)
  • --uyari-kenarlik-rengi: #80deea; (Mavi kenarlık)
  • --uyari-dikey-dolgusu: 15px;
  • --uyari-yatay-dolgusu: 20px;
  • Bu değişkenleri background-color: var(--uyari-arka-plan); gibi kullanarak bileşeni şekillendiririz.
  • border: 1px solid var(--uyari-kenarlik-rengi); ve border-radius: 4px; ile görsel bir çerçeve oluştururuz.
  • padding: var(--uyari-dikey-dolgusu) var(--uyari-yatay-dolgusu); ile iç boşlukları ayarlarız.
  • display: flex; ve justify-content: space-between; ile mesaj ve kapatma düğmesini aynı hizaya getiririz.
  • align-items: center; ile dikey hizalamayı sağlarız.

Kapatma düğmesi (.uyari-kapat-dugmesi) için de benzer şekilde stil tanımlamaları yaparız:

  • cursor: pointer; ile üzerine gelindiğinde tıklanabilir olduğunu belirtiriz.
  • font-weight: bold; ve font-size: 1.2em; ile “X” işaretini belirginleştiririz.
  • color: var(--uyari-metin-rengi); ile metin rengini ayarlarız.
  • Üzerine gelindiğinde veya odaklandığında rengini değiştirmek için :hover ve :focus pseudo-sınıflarını kullanırız, örneğin rengini biraz koyulaştırırız.

Şimdi gelelim can alıcı noktaya: uyarıyı gizleme mekanizması. Burada gizli input type="checkbox" ve onun :checked pseudo-sınıfını kullanacağız. Kullanıcı kapatma düğmesine (label) tıkladığında, input#uyari-kapat elemanı :checked durumuna geçer. Bu durumu kullanarak, .uyari-mesaji elemanının görünürlüğünü değiştirebiliriz:

  • .uyari-kapat-input:checked ~ .uyari-mesaji seçicisi, işaretlenmiş input elemanının hemen ardından gelen .uyari-mesaji elemanını hedefler.
  • Bu seçiciye display: none; veya opacity: 0; visibility: hidden; transition: all 0.3s ease-in-out; gibi özellikler uygulayarak uyarı mesajını gizleyebiliriz. İkinci yöntem, daha yumuşak bir geçiş sağlar.

Bu basit örnek, JavaScript’e ihtiyaç duymadan nasıl etkileşimli bir UI bileşeni oluşturulabileceğini göstermektedir. Kullanıcı, kapatma düğmesine tıkladığında, tarayıcı sadece HTML ve CSS kurallarını işleyerek uyarı mesajını gizler. Bu, web uygulamanızın daha hızlı yüklenmesini sağlar ve JavaScript bağımlılığını azaltır.

Bu yöntemin temel avantajı, sadece HTML ve CSS kullanarak işlevsellik sağlamasıdır. Bileşen, JavaScript yüklenmeden önce bile doğru şekilde çalışır ve tarayıcının yerleşik mekanizmalarından faydalanır. Ayrıca, CSS değişkenleri sayesinde, farklı uyarı tipleri (başarılı, hata, bilgi) için kolayca farklı renk şemaları tanımlayabilirsiniz, sadece ilgili değişkenlerin değerlerini değiştirerek.

Daha Karmaşık Bileşenler: CSS-Only Sekme (Tab) Menüsü Nasıl Yapılır?

Basit bir uyarı mesajı örneği, CSS-Only Custom Elements’in temelini anlamak için iyi bir başlangıçtı. Şimdi, daha karmaşık bir etkileşim olan “sekme (tab) menüsü” bileşenini ele alarak, bu yaklaşımın sınırlarını nasıl genişletebileceğimizi görelim. Sekme menüleri, içeriği düzenli bir şekilde sunmak için yaygın olarak kullanılır ve genellikle JavaScript ile oluşturulur. Ancak, doğru HTML yapısı ve CSS seçicileriyle, bu işlevselliği tamamen CSS ile sağlayabiliriz.

HTML Yapısı: Radyo Düğmeleri ve Etiketlerin Gücü

Sekme menüsü için anahtar fikir, her sekme başlığını bir label elemanı ile ilişkilendirilmiş gizli bir input type="radio" elemanına bağlamaktır. Radyo düğmeleri, doğası gereği yalnızca bir tanesinin seçili olabileceği bir grup oluşturur. Bu özellik, sekme menüsünün “bir anda yalnızca bir sekme aktif olabilir” mantığına mükemmel bir şekilde uyar. Her sekme içeriği de, ilgili radyo düğmesinin durumuna göre görünür hale getirilecektir.


<div class="sekme-kapsayici">
  <div class="sekme-basliklari">
    <input type="radio" name="sekme-grubu" id="sekme1" checked hidden>
    <label for="sekme1">Sekme 1</label>

    <input type="radio" name="sekme-grubu" id="sekme2" hidden>
    <label for="sekme2">Sekme 2</label>

    <input type="radio" name="sekme-grubu" id="sekme3" hidden>
    <label for="sekme3">Sekme 3</label>
  </div>

  <div class="sekme-icerikleri">
    <div class="sekme-icerik" id="icerik1">
      <h3>Sekme 1 İçeriği</h3>
      <p>Bu, Sekme 1'e ait bilgileri içeren bölümdür. CSS ile yönetiliyor!</p>
    </div>

    <div class="sekme-icerik" id="icerik2">
      <h3>Sekme 2 İçeriği</h3>
      <p>Sekme 2'nin detaylı içeriği burada yer alıyor. Performans odaklı bir çözüm.</p>
    </div>

    <div class="sekme-icerik" id="icerik3">
      <h3>Sekme 3 İçeriği</h3>
      <p>Son sekmemizin içeriği. JavaScript'e veda edin!</p>
    </div>
  </div>
</div>
      

Bu HTML yapısında dikkat edilmesi gerekenler:

  • .sekme-kapsayici: Tüm sekme bileşenini saran ana kapsayıcı.
  • .sekme-basliklari: Sekme başlıklarını (label elemanlarını) içeren bölüm.
  • input type="radio": Her sekme için bir tane olmak üzere gizli radyo düğmeleri.
    • Tüm radyo düğmelerinin name niteliği aynı olmalı (örneğin, sekme-grubu) ki sadece bir tanesi aynı anda seçili olabilsin.
    • Her birine benzersiz bir id (sekme1, sekme2 vb.) verilir.
    • checked niteliği, başlangıçta hangi sekmenin aktif olacağını belirler.
    • hidden niteliği, radyo düğmelerinin kendilerinin görünmemesini sağlar.
  • label for="sekmeX": Her radyo düğmesiyle ilişkilendirilmiş sekme başlığı. Kullanıcı bu etikete tıkladığında, ilgili radyo düğmesi seçili hale gelir.
  • .sekme-icerikleri: Tüm sekme içeriklerini barındıran kapsayıcı.
  • .sekme-icerik: Her bir sekmenin gerçek içeriğini barındıran bölüm. id nitelikleri, ilgili radyo düğmelerinin id‘leri ile eşleşecek şekilde ayarlanabilir (bu, CSS seçicilerinde yardımcı olabilir).

CSS ile Sekme Geçiş Mantığı ve Görsel Stilizasyon

Şimdi bu HTML yapısını stilize edelim ve sekme geçişlerini JavaScript olmadan nasıl yöneteceğimizi görelim. Yine, doğrudan CSS kodu yazmıyoruz, ancak hangi özelliklerin ve seçicilerin kullanılacağını açıklıyoruz.

İlk olarak, tüm sekme içeriklerini varsayılan olarak gizleyeceğiz:

  • .sekme-icerik { display: none; } veya visibility: hidden; opacity: 0; transition: all 0.3s ease-in-out; ile içerikleri gizleriz. Geçişli yöntem, daha yumuşak bir kullanıcı deneyimi sunar.

Ardından, radyo düğmelerinin :checked durumunu kullanarak hangi içeriğin gösterileceğini belirleyeceğiz. Burada genel kardeş seçici (~) kritik rol oynar:

  • #sekme1:checked ~ .sekme-icerikleri #icerik1 { display: block; } (veya visibility: visible; opacity: 1;) seçicisi, id="sekme1" radyo düğmesi işaretlendiğinde, onun kardeş elemanı olan .sekme-icerikleri içindeki id="icerik1" elemanını görünür hale getirir. Bu kuralı her sekme için tekrarlayarak, seçili radyo düğmesine karşılık gelen içeriği gösterebiliriz.

Sekme başlıklarının (label) stilini de ayarlamamız gerekiyor. Seçili sekmeyi görsel olarak vurgulamak için yine :checked durumunu kullanabiliriz:

  • .sekme-basliklari label { cursor: pointer; padding: 10px 20px; border: 1px solid #ccc; border-bottom: none; } gibi temel stiller tanımlarız.
  • Aktif sekme başlığı için: #sekme1:checked + label { background-color: #fff; border-color: #3498db; color: #3498db; } gibi bir kural kullanırız. Burada bitişik kardeş seçici (+) kullanmak önemlidir, çünkü label elemanı, input elemanının hemen ardından gelir.
  • CSS değişkenleri (--aktif-sekme-rengi: #3498db;, --pasif-sekme-rengi: #ccc;) ile renkleri ve diğer özellikleri kolayca yönetebiliriz.
  • Flexbox veya Grid kullanarak .sekme-basliklari elemanının içindeki etiketleri yan yana düzenleyebiliriz.

Erişilebilirlik İpuçları

CSS-Only sekme menüsü oluştururken erişilebilirliği göz ardı etmemeliyiz:

  • Semantik HTML: Radyo düğmeleri ve etiketlerin kullanılması, ekran okuyucular için doğal bir yapı sağlar.
  • Klavye Navigasyonu: Radyo düğmeleri varsayılan olarak klavye ile gezilebilir olduğundan (Tab tuşu ile), kullanıcılar sekmeler arasında klavye ile geçiş yapabilir.
  • aria Nitelikleri: Gelişmiş erişilebilirlik için role="tablist", role="tab" ve role="tabpanel" gibi ARIA nitelikleri eklenebilir. Ancak, bu nitelikler HTML’e eklense bile, JavaScript olmadan dinamik aria-selected veya aria-controls güncellemeleri yapılamayacağını unutmamak gerekir. Bu nedenle, CSS-Only yaklaşımında temel semantik HTML’e güvenmek daha yaygındır.

Bu sekme menüsü örneği, CSS’in ne kadar güçlü olabileceğini ve JavaScript’in genellikle üstlendiği karmaşık etkileşimleri bile nasıl taklit edebileceğini göstermektedir. Bu teknik, özellikle içerik odaklı web sitelerinde veya statik dokümantasyon sayfalarında, performans ve basitlikten ödün vermeden zengin bir kullanıcı deneyimi sunmak için harika bir yoldur.

Erişilebilirlik ve Performans İpuçları: Daha İyi CSS-Only Bileşenleri İçin

CSS-Only Custom Elements yaklaşımının temelinde basitlik ve performans yatar. Ancak, bu bileşenleri tasarlarken ve uygularken, kullanıcı deneyiminin vazgeçilmez bir parçası olan erişilebilirliği ve uzun vadeli sürdürülebilirliği etkileyen performans faktörlerini göz ardı etmemeliyiz. Bu bölümde, daha iyi ve daha kapsayıcı CSS-Only bileşenleri oluşturmak için dikkat etmemiz gereken önemli ipuçlarını ve stratejileri ele alacağız.

Semantik HTML’in Önemi

CSS-Only yaklaşımının en büyük avantajlarından biri, genellikle JavaScript framework’lerinin getirdiği DOM manipülasyonu ve karmaşık iç içe geçmiş div yapılarından kaçınarak, daha temiz ve semantik HTML kullanmaya teşvik etmesidir. Semantik HTML, web içeriğinin anlamını tarayıcılara, arama motorlarına ve ekran okuyucularına doğru bir şekilde iletir. Örneğin:

  • Bir navigasyon menüsü için <nav> ve <ul><li> kullanmak, sadece bir dizi <div> kullanmaktan çok daha iyidir.
  • Bir düğme için <button> elemanı kullanmak, bir <div> veya <span> elemanına tıklama olayı atamaktan daha erişilebilirdir, çünkü <button> elemanı klavye etkileşimlerini ve ekran okuyucu rollerini doğal olarak destekler.
  • Form elemanları için <input> ve <label> elemanlarını doğru şekilde ilişkilendirmek, kullanıcılara ve ekran okuyucularına doğru bağlamı sağlar.

Semantik HTML kullanımı, bileşenlerinizin varsayılan olarak daha erişilebilir olmasını sağlar ve JavaScript olmadan bile temel etkileşimlerin (örneğin, klavye ile odaklanma) çalışmasına yardımcı olur.

Klavye Navigasyonu ve Odak Yönetimi

Web siteleri sadece fare ile değil, klavye ile de kullanılabilmelidir. Sekme (Tab) tuşu ile elemanlar arasında gezinebilme ve Enter/Space tuşları ile etkileşim kurabilme yeteneği, özellikle motor becerileri kısıtlı kullanıcılar veya güç kullanıcıları için çok önemlidir. CSS-Only bileşenler oluştururken:

  • Etkileşimli elemanlar için (düğmeler, bağlantılar, form elemanları) her zaman doğal olarak odaklanabilir HTML elemanlarını kullanın.
  • Özel etkileşimler için (örneğin, sekme menüsü), radyo düğmeleri gibi klavye ile gezilebilir elemanları kullanın.
  • :focus ve :focus-visible pseudo-sınıflarını kullanarak odaklanmış elemanları görsel olarak belirginleştirin. Bu, kullanıcıların o an hangi elemana odaklandıklarını anlamalarına yardımcı olur.
  • tabindex niteliğini dikkatli kullanın. Genellikle, tabindex="0" ile elemanları odaklanabilir yapmak veya tabindex="-1" ile programatik olarak odaklanabilir hale getirmek mümkündür, ancak varsayılan odaklanma sırasını bozmaktan kaçının.

Ekran Okuyucular İçin ARIA Nitelikleri

ARIA (Accessible Rich Internet Applications) nitelikleri, semantik HTML’in yetersiz kaldığı durumlarda, ekran okuyuculara daha fazla bilgi sağlamak için kullanılır. CSS-Only bileşenlerde JavaScript olmadığı için dinamik ARIA güncellemeleri yapamayız. Ancak, statik ARIA niteliklerini yine de kullanabiliriz:

  • Bir açılır menü için role="menu" ve role="menuitem" gibi nitelikler ekleyebiliriz.
  • Bir uyarı mesajı için role="alert" veya aria-live="polite" gibi nitelikler, ekran okuyucuların içeriği hemen veya uygun bir zamanda duyurmasını sağlayabilir.
  • Ancak, aria-expanded veya aria-selected gibi dinamik durumları yansıtan nitelikler, JavaScript olmadan güncellenemeyeceği için, bu tür bileşenlerde tam ARIA desteği sınırlı kalacaktır. Bu durumda, tasarımın basitliğine ve semantik HTML’in doğal erişilebilirliğine daha fazla güvenmek gerekir.

Performans: Gereksiz DOM Elemanlarından Kaçınma ve Minimal İşaretleme

Performans, CSS-Only yaklaşımının temel nedenlerinden biridir. Bu avantajı korumak için:

  • Minimal DOM Yapısı: Mümkün olduğunca az HTML elemanı kullanmaya çalışın. Her ek eleman, tarayıcının işleme süresini artırır. Pseudo-elementler (::before, ::after) bu konuda harika bir çözümdür, çünkü DOM’a gerçek eleman eklemeden görsel öğeler oluştururlar.
  • display: contents Akıllıca Kullanımı: Bu özellik, gereksiz kapsayıcı elemanların kutu modelini ortadan kaldırarak, düzen hesaplamalarını basitleştirebilir. Ancak, erişilebilirlik açısından bazı tarayıcılarda sorunlar yaşanabileceği için, kullanımını dikkatlice test etmek önemlidir.
  • CSS Değişkenlerinin Etkin Kullanımı: Tekrar eden değerlerden kaçınmak ve stil değişikliklerini merkezileştirmek için CSS değişkenlerini kullanın. Bu, CSS dosyasının boyutunu küçültebilir ve tarayıcının stil hesaplamalarını optimize edebilir.
  • CSS Seçicilerini Optimize Etme: Çok karmaşık veya aşırı genelleştirilmiş seçicilerden kaçının. Tarayıcıların stil eşleştirmesi için daha az iş yapması, performansı artırır.

Tarayıcı Uyumluluğu ve Fallback Stratejileri

Yeni CSS özellikleri (örneğin, :has() seçicisi veya bazı gelişmiş Grid özellikleri) henüz tüm tarayıcılarda tam olarak desteklenmeyebilir. Bu durumda:

  • Tarayıcı Uyumluluğunu Kontrol Edin: Can I use… gibi kaynakları kullanarak kullandığınız CSS özelliklerinin tarayıcı desteğini kontrol edin.
  • Fallback (Geriye Dönük Uyumluluk) Stratejileri: Kritik özellikler için daha geniş tarayıcı desteğine sahip alternatif stiller sağlayın. Örneğin, display: grid; desteklenmiyorsa, display: flex; veya eski düzen yöntemleriyle çalışan bir fallback stil sağlayabilirsiniz.
  • Progresif Geliştirme (Progressive Enhancement): Temel işlevselliği en temel tarayıcılarda bile çalışacak şekilde tasarlayın ve daha modern tarayıcılarda gelişmiş özellikler sunun. Bu, tüm kullanıcıların en azından temel deneyimi almasını sağlar.

Bu ipuçlarını uygulayarak, CSS-Only Custom Elements’lerinizin sadece performanslı değil, aynı zamanda erişilebilir, sürdürülebilir ve geniş bir kullanıcı kitlesi tarafından kullanılabilir olmasını sağlayabilirsiniz. Bu, modern web geliştirmenin temel prensiplerinden biridir.

Sınırlar ve Ne Zaman Kullanılmamalı?

CSS-Only Custom Elements yaklaşımı, web geliştirmede birçok avantaj sunsa da, her problem için evrensel bir çözüm değildir. Her araç gibi, bu yaklaşımın da kendi sınırları ve belirli senaryolarda tercih edilmemesi gereken durumları vardır. Bu bölümde, CSS-Only bileşenlerin ne zaman yetersiz kalacağını ve ne zaman gerçek JavaScript tabanlı çözümlere veya Web Components API’sine başvurmanın daha uygun olacağını inceleyeceğiz. Bu dengeyi anlamak, projeleriniz için doğru teknoloji seçimini yapmanız açısından kritik öneme sahiptir.

JavaScript’in Vazgeçilmez Olduğu Durumlar

CSS-Only yaklaşımı, belirli türdeki etkileşimleri taklit edebilirken, JavaScript’in sunduğu dinamik ve programatik yeteneklerin yerini tutamaz. Aşağıdaki senaryolarda JavaScript’e ihtiyaç duyulur:

  • Karmaşık Etkileşimler ve Durum Yönetimi: Kullanıcının birden fazla eylemine bağlı olarak değişen, karmaşık durum (state) yönetimi gerektiren bileşenler (örneğin, sürükle-bırak işlevselliği, çok adımlı formlar, gerçek zamanlı güncellemeler). CSS, genellikle sadece ikili (açık/kapalı, seçili/seçili değil) durumları yönetebilir.
  • DOM Manipülasyonu: Bileşenin içeriğini veya yapısını dinamik olarak değiştirmesi gereken durumlar (örneğin, bir liste elemanının eklenmesi/çıkarılması, bir resim galerisinde dinamik olarak resim yüklenmesi). CSS, mevcut elemanların stilini değiştirebilir, ancak yeni elemanlar oluşturamaz veya mevcut elemanları tamamen kaldıramaz.
  • Dış API Entegrasyonu: Sunucuyla iletişim kurması, veri çekmesi veya göndermesi gereken bileşenler (örneğin, hava durumu widget’ları, sosyal medya akışları, arama çubukları). Bu tür işlevsellikler için fetch API veya XMLHttpRequest gibi JavaScript API’leri gereklidir.
  • Kullanıcı Girişini Doğrulama: Form alanlarının karmaşık doğrulama kuralları (örneğin, e-posta formatı kontrolü, şifre gücü analizi) JavaScript olmadan etkili bir şekilde yapılamaz. HTML5 doğrulama yeterli olsa da, daha gelişmiş senaryolar için JavaScript şarttır.
  • Animasyon Kontrolü: Kullanıcı etkileşimlerine veya diğer olaylara bağlı olarak karmaşık, zamanlanmış veya duraklatılabilir/oynatılabilir animasyonlar. CSS animasyonları güçlüdür, ancak JavaScript, animasyonların yaşam döngüsü üzerinde daha fazla kontrol sağlar.
  • Erişilebilirlik için Dinamik ARIA Güncellemeleri: aria-expanded veya aria-selected gibi niteliklerin, bileşenin mevcut durumunu yansıtacak şekilde dinamik olarak güncellenmesi gerektiğinde JavaScript’e ihtiyaç duyulur. CSS-Only çözümlerde bu nitelikler statik kalır.

Tarayıcı Uyumluluğu Eksiklikleri

CSS dünyası sürekli gelişiyor ve yeni özellikler (örneğin, :has() seçicisi, Container Queries) tarayıcılarda farklı hızlarda destekleniyor. Eğer projenizin geniş bir tarayıcı yelpazesinde (özellikle eski tarayıcılarda) mükemmel uyumluluk sağlaması gerekiyorsa, CSS-Only yaklaşımı sınırlayıcı olabilir. Yeni CSS özelliklerine aşırı bağımlılık, daha eski tarayıcılarda bileşenlerin düzgün çalışmamasına neden olabilir. Bu durumda, ya fallback (geri dönüş) stratejileri geliştirmeli ya da daha geniş uyumluluğa sahip JavaScript tabanlı çözümlere yönelmelisiniz.

Bakım Zorlukları (Çok Karmaşık CSS Seçiciler)

CSS-Only bileşenler, basit oldukları sürece bakımı kolaydır. Ancak, JavaScript’in eksikliğini gidermek için aşırı karmaşık ve iç içe geçmiş CSS seçicileri kullanmaya başlarsanız, kodunuz hızla anlaşılmaz ve bakımı zor hale gelebilir. Uzun, spesifik seçiciler, stil çakışmalarına yol açabilir ve yeni geliştiricilerin bileşenin nasıl çalıştığını anlamasını zorlaştırabilir. Bu durum, “CSS-Only” yaklaşımının getirdiği basitlik avantajını ortadan kaldırabilir.

Ne Zaman Gerçek Web Components Tercih Edilmeli?

Eğer bir bileşenin gerçekten güçlü bir kapsüllemeye (Shadow DOM ile), yaşam döngüsü yönetimine (lifecycle callbacks) ve JavaScript tabanlı dinamik etkileşimlere ihtiyacı varsa, gerçek Web Components (Custom Elements, Shadow DOM, HTML Templates) en iyi çözümdür. Web Components, tarayıcı tarafından yerel olarak desteklenen standartlaştırılmış bir API seti sunar ve JavaScript framework’lerinden bağımsız, yeniden kullanılabilir bileşenler oluşturmak için tasarlanmıştır. Bu, özellikle büyük ölçekli uygulamalarda veya farklı projelerde tekrar tekrar kullanılacak karmaşık UI kütüphaneleri oluştururken tercih edilmelidir.

Özetle, CSS-Only Custom Elements, basit, statik veya temel etkileşimlere sahip UI bileşenleri için mükemmel bir seçimdir. Performansı artırır, geliştirme sürecini basitleştirir ve JavaScript bağımlılığını azaltır. Ancak, karmaşık etkileşimler, dinamik içerik manipülasyonu, dış veri entegrasyonu veya geniş tarayıcı desteği gerektiren senaryolarda, JavaScript tabanlı çözümlere veya Web Components API’sine başvurmak daha uygun ve verimli olacaktır. Doğru aracı doğru iş için kullanmak, başarılı bir web geliştirme projesinin anahtarıdır.

Sonuç: Geleceğin Web Geliştirme Yaklaşımlarına Bir Bakış

Bu makale boyunca, CSS-Only Custom Elements kavramını, temel prensiplerini, avantajlarını, uygulama örneklerini ve sınırlarını detaylı bir şekilde inceledik. Modern web geliştirmenin sürekli evrilen doğasında, performans, basitlik ve sürdürülebilirlik her zamankinden daha önemli hale gelmiştir. CSS-Only yaklaşımı, tam da bu ihtiyaçlara cevap veren, akıllıca ve yaratıcı bir çözüm sunmaktadır.

Gördüğümüz gibi, HTML’in semantik gücü ile CSS’in gelişmiş düzen, seçici ve değişken yeteneklerini bir araya getirerek, JavaScript’in karmaşıklığına girmeden etkileşimli ve yeniden kullanılabilir UI bileşenleri oluşturmak mümkündür. display: contents, CSS değişkenleri, pseudo-elementler ve gelişmiş seçiciler gibi özellikler, bu “yalnızca CSS” felsefesinin temel taşlarını oluşturur. Basit bir uyarı mesajından, daha karmaşık bir sekme menüsüne kadar birçok bileşeni bu yöntemle hayata geçirebildik. Bu, web sitelerimizin daha hızlı yüklenmesine, daha az JavaScript bağımlılığına sahip olmasına ve potansiyel olarak daha kolay bakımına olanak tanır.

Ancak, her aracın olduğu gibi, CSS-Only Custom Elements’in de sınırları vardır. Karmaşık etkileşimler, dinamik DOM manipülasyonu veya dış API entegrasyonu gibi senaryolarda JavaScript’in vazgeçilmez olduğunu unutmamak gerekir. Önemli olan, projenizin ihtiyaçlarına en uygun aracı seçebilmek ve teknolojileri bilinçli bir şekilde birleştirebilmektir. Bu yaklaşım, JavaScript’i tamamen ortadan kaldırmak yerine, onu gerçekten ihtiyaç duyulan yerlerde kullanmaya teşvik ederken, daha hafif ve performanslı alternatifler sunar.

Gelecekte, tarayıcıların CSS özelliklerine yönelik desteği arttıkça ve yeni CSS modülleri ortaya çıktıkça, CSS-Only Custom Elements’in potansiyeli daha da genişleyecektir. Geliştiriciler olarak, bu yeni yaklaşımları keşfetmek, denemek ve projelerimize entegre etmek, hem kendi becerilerimizi geliştirmemize hem de daha iyi, daha hızlı ve daha erişilebilir web deneyimleri sunmamıza yardımcı olacaktır. Web’in geleceği, akıllı teknoloji seçimi ve yaratıcı problem çözme yeteneğimizde yatıyor.

Sıkça Sorulan Sorular

  1. CSS-Only Custom Elements gerçek Web Component (web bileşeni) midir?

    Hayır, gerçek Web Components, customElements.define() gibi JavaScript API’lerini kullanarak tarayıcıya yeni bir HTML etiketi tanımlayan standartlaştırılmış bileşenlerdir. CSS-Only Custom Elements ise JavaScript kullanmadan, mevcut HTML ve CSS özelliklerini yaratıcı bir şekilde kullanarak Web Components benzeri bir kapsülleme ve yeniden kullanılabilirlik hissi yaratır. Bunlar tarayıcı tarafından yerel olarak bir “Custom Element” olarak tanınmazlar.

  2. Bu yaklaşımın en büyük avantajı nedir?

    En büyük avantajı, performanstır. JavaScript’e bağımlılığı ortadan kaldırdığı veya büyük ölçüde azalttığı için, sayfalar daha hızlı yüklenir, daha az kaynak tüketir ve genellikle daha akıcı bir kullanıcı deneyimi sunar. Ayrıca geliştirme kolaylığı ve bakım maliyetlerinin düşüklüğü de önemli avantajlardır.

  3. CSS-Only Custom Elements hangi durumlarda kullanılmamalıdır?

    Karmaşık etkileşimler, dinamik DOM manipülasyonu (eleman ekleme/çıkarma), dış API’lerle veri alışverişi, karmaşık form doğrulama veya dinamik erişilebilirlik (ARIA) güncellemeleri gerektiren durumlarda bu yaklaşım yetersiz kalır. Bu gibi senaryolarda JavaScript tabanlı çözümler veya gerçek Web Components tercih edilmelidir.

  4. display: contents özelliğinin erişilebilirlik üzerindeki etkisi nedir?

    display: contents, elemanın kendisinin kutu modelini ortadan kaldırdığı için, bazı tarayıcılarda ve ekran okuyucularda elemanın semantik anlamını veya odaklanabilirliğini etkileyebilir. Örneğin, bazı durumlarda elemanların klavye ile odaklanamamasına neden olabilir. Bu nedenle, bu özelliği kullanırken dikkatli olmak ve erişilebilirlik testleri yapmak önemlidir.

  5. CSS değişkenleri (Custom Properties) bu yaklaşımda neden önemlidir?

    CSS değişkenleri, bileşenlerin stilini dinamik ve kolayca özelleştirilebilir hale getirdiği için kritik öneme sahiptir. Renkler, boyutlar, fontlar gibi özellikleri merkezi bir yerden yönetmeyi ve farklı temalar veya durumlar için kolayca değiştirmeyi mümkün kılar. Bu, bileşenlerin daha modüler ve esnek olmasını sağlar.

#WebGeliştirme #CSSOnly #CustomElements #Frontend #PerformansOptimizasyonu

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık