Merhaba arkadaşlar, bugün başımı çok ağrıtan bir sorunu ve nasıl temiz bir çözüm bulduğumu anlatacağım. Tailwind CSS ile responsive font-size'ları ayarlamak harika, ama bir süre sonra fark ettim ki, font boyutu küçülüp büyüdükçe line-height değerleri de ona uyum sağlamazsa, tipografi berbat görünüyordu. Her breakpoint için ayrı ayrı line-height yazmak da işin tadını kaçırıyordu. İşte benim kullandığım en temiz çözüm.
Sorun Neydi?
Projemde, başlıkların mobilde `text-xl`, masaüstünde ise `text-4xl` olmasını istiyordum. Tailwind'de bunu `text-xl md:text-4xl` yaparak hallettim. Ancak, `text-xl` için varsayılan line-height 1.75rem iken, `text-4xl` için 2.25rem. Bu geçişte, satır yüksekliği oransal olarak font boyutuna göre ayarlanmadığı için, büyük ekranda metin blokları arasında devasa, orantısız boşluklar oluşuyordu. Her breakpoint için `leading-[deger]` yazmak sürdürülebilir değildi.
Çözüm: Özel Plugin ile Dinamik Leading
Tailwind'in en güçlü yanlarından biri, konfigürasyon ve plugin yazma esnekliği. Çözüm olarak, font-size utility'sini genişleten ve ona uygun bir line-height hesaplayıp atayan özel bir plugin yazdım. Plugin, temel olarak `text-{size}` class'ı oluşturulurken, ona `leading-[calculated-value]` class'ını da ekliyor.
Bu plugin, `text-lg` gibi bir class oluşturulduğunda, ona otomatik olarak `line-height: calc(1.5 font-size)` değerini atıyor. Artık `text-xl md:text-4xl` yazdığınızda, line-height da font boyutuyla birlikte orantılı olarak büyüyecek.
Daha İnce Ayar: Çarpanı Kontrol Edelim
Yukarıdaki örnek sabit 1.5 çarpanını kullanıyor. Ancak başlıklar ve paragraflar için farklı çarpanlar isteyebilirsiniz. Bunu theme extend ile yönetmek daha iyi. Örneğin, `theme` kısmına `lineHeightMultipliers` adında bir özellik ekleyip, plugin'de ona göre hareket edebilirsiniz.
Sonuç ve Kapanış
Bu sistemi kurduktan sonra, responsive tipografi ile uğraşmak bir zevk haline geldi. Sadece font boyutuna odaklanıyorum, line-height arkadan sessizce onu takip ediyor. Elbette, çok özel durumlar için yine `leading-none` veya `leading-[3]` gibi utility'leri kullanmaya devam edebilirsiniz. Bu sistem, %80-90'lık kullanım senaryosunu kapsıyor.
Siz Tailwind'de tipografi için nasıl bir sistem kullanıyorsunuz? Benim gibi line-height ile boğuşan oldu mu? Ya da bu plugin'i geliştirmek için aklınıza gelen daha şık bir yöntem var mı? Yorumlarda buluşalım!
Projemde, başlıkların mobilde `text-xl`, masaüstünde ise `text-4xl` olmasını istiyordum. Tailwind'de bunu `text-xl md:text-4xl` yaparak hallettim. Ancak, `text-xl` için varsayılan line-height 1.75rem iken, `text-4xl` için 2.25rem. Bu geçişte, satır yüksekliği oransal olarak font boyutuna göre ayarlanmadığı için, büyük ekranda metin blokları arasında devasa, orantısız boşluklar oluşuyordu. Her breakpoint için `leading-[deger]` yazmak sürdürülebilir değildi.
Tailwind'in en güçlü yanlarından biri, konfigürasyon ve plugin yazma esnekliği. Çözüm olarak, font-size utility'sini genişleten ve ona uygun bir line-height hesaplayıp atayan özel bir plugin yazdım. Plugin, temel olarak `text-{size}` class'ı oluşturulurken, ona `leading-[calculated-value]` class'ını da ekliyor.
JavaScript:
// tailwind.config.js
const plugin = require('tailwindcss/plugin');
module.exports = {
theme: {
// ... diğer theme ayarları
},
plugins: [
plugin(function({ addUtilities, theme, e }) {
const fontSizes = theme('fontSize');
const newUtilities = {};
Object.entries(fontSizes).forEach(([key, value]) => {
// fontSize değeri array ise (örn: ['2rem', { lineHeight: '2.5rem' }])
if (Array.isArray(value)) {
const [fontSize, options] = value;
// Eğer options'ta lineHeight zaten tanımlı değilse, biz hesaplayalım.
if (!options.lineHeight) {
const fontSizeNum = parseFloat(fontSize);
const fontSizeUnit = fontSize.replace(/[0-9.]/g, '');
// Temel bir çarpan belirleyelim. (Örnek: font-size 1.5)
// Bu çarpanı ihtiyaca göre (başlık, paragraf) theme'den alabilirsiniz.
const lineHeightMultiplier = 1.5;
const calculatedLineHeight = `${fontSizeNum lineHeightMultiplier}${fontSizeUnit}`;
// Yeni utility'yi oluştur.
newUtilities[`.${e(`text-${key}`)}`] = {
'font-size': fontSize,
'line-height': calculatedLineHeight,
};
}
}
// fontSize değeri string ise (örn: '1rem')
else if (typeof value === 'string') {
const fontSizeNum = parseFloat(value);
const fontSizeUnit = value.replace(/[0-9.]/g, '');
const lineHeightMultiplier = 1.5;
const calculatedLineHeight = `${fontSizeNum lineHeightMultiplier}${fontSizeUnit}`;
newUtilities[`.${e(`text-${key}`)}`] = {
'font-size': value,
'line-height': calculatedLineHeight,
};
}
});
addUtilities(newUtilities, ['responsive']);
}),
],
};
Bu plugin, `text-lg` gibi bir class oluşturulduğunda, ona otomatik olarak `line-height: calc(1.5 font-size)` değerini atıyor. Artık `text-xl md:text-4xl` yazdığınızda, line-height da font boyutuyla birlikte orantılı olarak büyüyecek.
Yukarıdaki örnek sabit 1.5 çarpanını kullanıyor. Ancak başlıklar ve paragraflar için farklı çarpanlar isteyebilirsiniz. Bunu theme extend ile yönetmek daha iyi. Örneğin, `theme` kısmına `lineHeightMultipliers` adında bir özellik ekleyip, plugin'de ona göre hareket edebilirsiniz.
JavaScript:
// tailwind.config.js - Theme kısmı
theme: {
extend: {
lineHeightMultipliers: {
heading: 1.2,
body: 1.6,
},
fontSize: {
'display': ['4rem', { fontWeight: 'bold' }], // lineHeight otomatik eklenecek
'lead': ['1.25rem'], // lineHeight otomatik eklenecek
}
}
},
// Plugin içinde, key'e göre multiplier seç (basit bir eşleme yapabilirsin)
// Örn: 'display' ve 'h1', 'h2' gibi key'ler için 'heading' çarpanını, diğerleri için 'body' çarpanını kullan.
Bu sistemi kurduktan sonra, responsive tipografi ile uğraşmak bir zevk haline geldi. Sadece font boyutuna odaklanıyorum, line-height arkadan sessizce onu takip ediyor. Elbette, çok özel durumlar için yine `leading-none` veya `leading-[3]` gibi utility'leri kullanmaya devam edebilirsiniz. Bu sistem, %80-90'lık kullanım senaryosunu kapsıyor.
Siz Tailwind'de tipografi için nasıl bir sistem kullanıyorsunuz? Benim gibi line-height ile boğuşan oldu mu? Ya da bu plugin'i geliştirmek için aklınıza gelen daha şık bir yöntem var mı? Yorumlarda buluşalım!