shadcn/ui Sidebar içinde menü kurmak için SidebarContent içine bir ya da daha fazla SidebarGroup koyar, her grubun içinde SidebarMenu, SidebarMenuItem ve SidebarMenuButton parçalarını iç içe kullanırsınız. Ek düğme için SidebarMenuAction, alt menü için SidebarMenuSub, sayaç için SidebarMenuBadge, yükleme durumu için SidebarMenuSkeleton vardır. Grupları ve menüleri açılır kapanır yapmak için onları Collapsible ile sararsınız.
Bu yazı, Sidebar kurulumu ve yapısı yazısının devamıdır. Orada SidebarProvider, Sidebar özellikleri ve useSidebar kancası anlatıldı; burada kenar çubuğunun içini dolduran parçaları, veri çekme örneklerini, kontrollü kullanımı, tema değişkenlerini ve duruma göre stil verme ipuçlarını görüyorsunuz. Seri haritası için shadcn/ui öğrenme rehberi sayfasına bakabilirsiniz.
Veri çekme: Server Components ve Suspense
Belgenin veri çekme bölümü üç parçalı bir örnek verir: iskeleti gösteren bir bileşen, veriyi await ile çeken bir sunucu bileşeni ve ikisini React.Suspense ile birleştiren kenar çubuğu. fetchProjects belgede de bir yer tutucudur; kendi veri katmanınızla değiştirirsiniz.
function NavProjectsSkeleton() {
return (
<SidebarMenu>
{Array.from({ length: 5 }).map((_, index) => (
<SidebarMenuItem key={index}>
<SidebarMenuSkeleton showIcon />
</SidebarMenuItem>
))}
</SidebarMenu>
)
}
async function NavProjects() {
const projects = await fetchProjects()
return (
<SidebarMenu>
{projects.map((project) => (
<SidebarMenuItem key={project.name}>
<SidebarMenuButton asChild>
<a href={project.url}>
<project.icon />
<span>{project.name}</span>
</a>
</SidebarMenuButton>
</SidebarMenuItem>
))}
</SidebarMenu>
)
}
function AppSidebar() {
return (
<Sidebar>
<SidebarContent>
<SidebarGroup>
<SidebarGroupLabel>Projeler</SidebarGroupLabel>
<SidebarGroupContent>
<React.Suspense fallback={<NavProjectsSkeleton />}>
<NavProjects />
</React.Suspense>
</SidebarGroupContent>
</SidebarGroup>
</SidebarContent>
</Sidebar>
)
}Aynı yaklaşımı SWR ya da react-query ile de kurabilirsiniz. Belgedeki istemci tarafı örneklerinde kanca data ve isLoading döndürür; isLoading doğruyken aynı iskelet listesi, veri gelince menü render edilir. Sunucu bileşenleri ve Suspense kavramları için Next.js App Router ve React ile modern web uygulaması yazılarına bakabilirsiniz.
Tema değişkenleri ve duruma göre stil
Belge kenar çubuğu için uygulamanın geri kalanından bilinçli olarak ayrı CSS değişkenleri kullandığını söyler; amaç, örneğin ana sayfadan daha koyu tonda bir kenar çubuğunu kolayca yapabilmektir. Değişkenler arka plan, ön plan, birincil renk, vurgu rengi, kenarlık ve odak halkası için açık ve koyu temada ayrı ayrı tanımlanır. Belgenin Theming bölümündeki örnek hâlâ eski HSL biçimini ve --sidebar-background adını gösterir; kurulum adımı ve genel tema sayfası ise oklch değerleri ve --sidebar adını kullanır. Yeni bir projede kurulum adımındaki listeyi izlemek daha tutarlıdır.
Duruma göre stil vermek için belge iki ipucu verir. İlki, kenar çubuğu simge modundayken bir grubu gizlemektir: group-data-[collapsible=icon]:hidden sınıfı, sarmalayıcıdaki data-collapsible özniteliğine bakar. İkincisi, menü düğmesi etkinken eylem düğmesini görünür kılmaktır; burada peer-data-[active=true]/menu-button:opacity-100 sınıfı düğmenin data-active özniteliğini okur.
<Sidebar collapsible="icon">
<SidebarContent>
<SidebarGroup className="group-data-[collapsible=icon]:hidden" />
</SidebarContent>
</Sidebar>
<SidebarMenuItem>
<SidebarMenuButton />
<SidebarMenuAction className="peer-data-[active=true]/menu-button:opacity-100" />
</SidebarMenuItem>Bu sınıfların Tailwind tarafındaki genel sözdizimi (grup ve kardeş varyantları) Tailwind'in konusudur; Tailwind CSS rehberinde temelleri bulabilirsiniz. Kaynakta belgede ayrı bölümü olmayan bir SidebarInput bileşeni de dışa aktarılır; kenar çubuğu içinde arama kutusu gibi kullanılmak üzere Input bileşenini küçük bir yükseklikle sarar.
Sık yapılan hatalar

- Etiketi span'a koymamak: Metni doğrudan
aiçine yazarsanız kısaltma stili çalışmaz ve uzun adlar taşar. - Simge modunda kaybolan öğelere şaşırmak: Kaynakta grup etiketi, grup eylemi, menü eylemi, rozet ve alt menü
collapsible="icon"daralmasında gizlenir. Daralmış hâlde bilgi vermek için menü düğmesinetooltipverin. - Simge düğmesinde erişilebilir ad bırakmamak:
SidebarGroupActionveSidebarMenuActionyalnızca simge gösterir; belgedeki gibisr-onlymetin ekleyin. Erişilebilir adlar için ARIA yazısına bakın. - Alt menü düğmesini button sanmak:
SidebarMenuSubButtonvarsayılan olarakaüretir; bir işlem çalıştıracaksanızasChildile kendibuttonöğenizi verin. - Kontrollü modda mobili unutmak:
openyalnızca masaüstü durumudur; mobil paneliuseSidebariçindekisetOpenMobileile yönetirsiniz. - Collapsible için grup adını vermemek: Ok simgesinin dönmesi
group/collapsiblesınıfına bağlıdır; sınıfıCollapsibleüzerine eklemeyi unutursanızgroup-data-[state=open]/collapsiblehiçbir şey yapmaz.
Sık Sorulan Sorular
Etkin menü öğesini nasıl işaretlerim?
SidebarMenuButton bileşenine isActive verin. Hangi öğenin etkin olduğunu belirlemek, yani geçerli adresle karşılaştırmak sizin yönlendirme kodunuzun işidir; bileşen yalnızca data-active özniteliğini ve stili uygular.
Next.js Link ile kullanabilir miyim?
Evet. asChild sayesinde SidebarMenuButton stilini içine koyduğunuz bileşene aktarır; belge bunun bir Link ya da a etiketi olabileceğini söyler.
Menü verisini sunucudan çekerken ne göstermeliyim?
Belgedeki gibi SidebarMenuSkeleton satırlarından oluşan bir iskelet bileşeni yazıp React.Suspense için fallback olarak verin ya da istemci tarafı kancanın isLoading değerine göre gösterin.
Rozet ile eylem düğmesini aynı öğede kullanabilir miyim?
Kaynakta ikisi de öğenin sağ tarafına mutlak konumla yerleşir. Belge ikisini birlikte gösteren bir örnek vermez; birlikte kullanacaksanız konumlarını kendi sınıflarınızla ayarlamanız gerekir.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: shadcn/ui öğrenme rehberi · Sidebar kurulumu ve yapısı · DropdownMenu ve ContextMenu · Tabs, Accordion ve Collapsible · Skeleton ve diğer geri bildirim bileşenleri · Tema ve CSS değişkenleri

