SnippetUI

Katlanabilir Sidebar Menü

Bu, kontrol panellerinde vb. kullanılabilecek bir kenar çubuğu gezinmesidir ve yalnızca simge durumuna daraltılabilir.

ReactTailwind CSSlucide-react

Genellikle yönetim ekranlarında ve kontrol panellerinde görülen, metin içeren tam boyutlu ekran ile yalnızca simgelerin bulunduğu kompakt ekran arasında geçiş yapmanızı sağlayan bir kenar çubuğu navigasyonu. İçerik alanının görüntülenme alanını en üst düzeye çıkarmak istiyorsanız idealdir.

Önizleme

Dashboard Overview

Welcome back, Jane. Here is what’s happening today.

Total Revenue

$45,231

Active Users

2,410

New Orders

142

Recent Activity

Kullanım Durumları ve Özellikler

  • Kontrol Paneli ve Yönetici Ekranı: Gezinmeyi gerektiği gibi daraltarak kullanıcıların ana içeriğe (grafikler, veri tabloları vb.) odaklanmasına olanak tanımak için tasarlanmıştır.
  • Araç ipuçlarıyla tamamlama: Yalnızca simgelerle kompakt durumdayken bile, araç ipuçlarının fareyle üzerine gelindiğinde görüntülenmesiyle erişilebilirlik ve kullanım kolaylığı sağlanır.
  • Pürüzsüz animasyon: Genişlik, şeffaflık (“opaklık”) ve “maksimum genişlik”i birleştirerek metnin kaybolup düzgün bir şekilde göründüğü doğal bir hareket elde ederiz.

Tasarım ve UX’in önemli noktaları (Tasarım ve UX)

  • Metin taşması önleme: ‘max-w-0’ ve ‘overflow-hidden’ın birleştirilmesi, metnin yeni satırlara bölünmesini ve katlandığında düzeni bozmasını önler.
  • Etkin durumun görsel olarak vurgulanması: Şu anda seçili olan menü öğesi, geçerli konumu sezgisel olarak iletmek için mavi bir arka plana ve metin rengine sahiptir.
  • Gözü yönlendirme: Açma ve kapama için geçiş düğmesi, “hareket etmek için buraya basın” olanağını artırmak amacıyla kenar çubuğunun kenarına yerleştirildi.

Nasıl kişiselleştirilir (Özelleştirme Kılavuzu)

  • Kenar çubuğunun genişliğini değiştirin: Uygulama kodu tarafında “w-64” (genişletildiğinde) veya “w-20” (daraltıldığında) değerini değiştirerek istediğiniz boyuta ayarlayabilirsiniz.
  • Tema renklerini değiştirme: “bg-blue-600” ve “text-blue-700” yardımcı program sınıflarının tamamını tek seferde değiştirerek, bunları marka renklerinizle eşleşen tasarımlara uygulayabilirsiniz.

Uygulama kodu (Uygulama)

<div className="flex h-screen bg-slate-50 font-sans overflow-hidden">
    
    {/* Sidebar */}
    <aside 
      className={`bg-white border-r border-slate-200 flex flex-col transition-all duration-300 ease-in-out relative z-10 ${
        isCollapsed ? 'w-20' : 'w-64'
      }`}
    >
      {/* Header */}
      <div className="h-16 flex items-center px-4 border-b border-slate-100 shrink-0">
        <div className="flex items-center gap-3 overflow-hidden whitespace-nowrap">
          <div className="w-10 h-10 rounded-xl bg-blue-600 flex items-center justify-center shrink-0 shadow-sm shadow-blue-200">
            <Hexagon className="w-6 h-6 text-white" />
          </div>
          <span 
            className={`font-bold text-slate-800 text-xl transition-all duration-300 overflow-hidden ${
              isCollapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'
            }`}
          >
            DashUI
          </span>
        </div>
      </div>

      {/* Navigation */}
      <nav className="flex-1 py-6 px-3 space-y-2 overflow-y-auto overflow-x-hidden">
        {navItems.map((item, index) => (
          <a 
            key={index}
            href="#" 
            className={`flex items-center gap-3 px-3 py-3 rounded-xl transition-colors group relative ${
              item.active 
                ? 'text-blue-700 bg-blue-50 hover:bg-blue-100' 
                : 'text-slate-500 hover:bg-slate-100 hover:text-slate-900'
            }`}
          >
            <item.icon className="w-6 h-6 shrink-0" />
            
            <span 
              className={`font-semibold whitespace-nowrap transition-all duration-300 flex-1 text-sm overflow-hidden ${
                isCollapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'
              }`}
            >
              {item.label}
            </span>

            {/* Badge display (only when expanded) */}
            {!isCollapsed && item.badge && (
              <span className="bg-blue-100 text-blue-700 py-0.5 px-2 rounded-full text-xs font-bold whitespace-nowrap">
                {item.badge}
              </span>
            )}

            {/* Tooltip (displayed on hover only when collapsed) */}
            {isCollapsed && (
              <div className="absolute left-14 hidden group-hover:block bg-slate-800 text-white text-xs px-2.5 py-1.5 rounded-md shadow-lg z-20 whitespace-nowrap pointer-events-none opacity-0 transition-opacity duration-200 group-hover:opacity-100">
                {item.label}
              </div>
            )}
          </a>
        ))}
      </nav>

      {/* Footer Profile */}
      <div className="p-4 border-t border-slate-100 shrink-0">
        <a href="#" className="flex items-center gap-3 hover:bg-slate-50 p-2 -m-2 rounded-xl transition-colors">
          <img 
            src="https://i.pravatar.cc/150?u=a042581f4e29026704d" 
            alt="User Avatar" 
            className="w-10 h-10 rounded-full shrink-0 border border-slate-200 object-cover" 
          />
          <div 
            className={`flex-1 min-w-0 transition-all duration-300 overflow-hidden ${
              isCollapsed ? 'max-w-0 opacity-0' : 'max-w-[200px] opacity-100'
            }`}
          >
            <p className="text-sm font-semibold text-slate-900 truncate">Jane Doe</p>
            <p className="text-xs text-slate-500 truncate">Admin</p>
          </div>
        </a>
      </div>
    </aside>

    {/* Toggle Button */}
    <button 
      onClick={() => setIsCollapsed(!isCollapsed)}
      className={`absolute top-6 z-20 cursor-pointer bg-white border border-slate-200 text-slate-500 hover:text-blue-600 hover:bg-blue-50 rounded-full p-1.5 shadow-sm transition-all duration-300 ${
        isCollapsed ? 'left-[4.2rem]' : 'left-[15rem]'
      }`}
      aria-label={isCollapsed ? "Expand sidebar" : "Collapse sidebar"}
    >
      <ChevronLeft className={`w-4 h-4 transition-transform duration-300 ${isCollapsed ? 'rotate-180' : ''}`} />
    </button>

{/* Ana İçerik Alanı (Örnek) */}
    <main className="flex-1 p-8 overflow-y-auto">
      <h1 className="text-2xl font-bold text-slate-900">Kontrol Paneli</h1>
      <p className="text-slate-500 mt-1">Kenar çubuğundan bir öğe seçin.</p>
    </main>

</div>
);
}

Tarayıcı Desteği

  • Modern tarayıcıların (Chrome, Firefox, Safari, Edge) en son sürümleriyle iyi çalışır.
  • “transition-all” ve “max-w-0” animasyonları da tüm modern tarayıcılarda sorunsuz bir şekilde işlenir.