Sidebar
Simgelere ya da ekran dışına daralan, header'ınızın altında sabit kalan ve telefonlarda kaydırılabilir bir sayfaya dönüşen bir uygulama kenar çubuğu.
pnpm dlx shadcn@latest add https://hextaui.com/r/sidebar.jsonBileşeni, HextaUI tema token'larını ve bileşenin bağımlı olduğu tüm HextaUI bileşenlerini ekler.
Henüz eklemediyseniz tema token'larını global CSS'inize ekleyin.
Bağımlılıkları yükleyin.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/sidebar.tsx components/ui/button.tsx components/ui/input.tsx components/ui/sheet.tsx components/ui/skeleton.tsx components/ui/tooltip.tsx hooks/use-composed-ref.ts lib/hotkey.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Düzeninizi <SidebarProvider /> ile sarın ve sayfayı kenar çubuğundan sonra <SidebarInset /> içine koyun.
SidebarProvideraçık durumu, klavye kısayolunu ve genişlikleri tutar.Sidebar, sayfa kayarken sabit kalan bir sütundur. 768px'in altında bir sheet'e dönüşür.SidebarHeaderveSidebarFooteryerinde kalır.SidebarContentikisinin arasında kayar.SidebarGroupisteğe bağlı bir etiketi ve eylemi olan bir bölümdür.SidebarMenubağlantıları tutar.SidebarInsetkenar çubuğunun yanındaki sayfadır.
Varyantlar
variant görünümü belirler: tam yükseklikte bir sidebar, bir floating panel ya da sayfanın kenar çubuğu renginde bir karta dönüştüğü inset. Düzenin animasyonunu görmek için aralarında geçiş yapın.
Collapsible
offcanvas kenar çubuğunu görünümden kaydırır, icon onu simgelerine küçültür ve her etiketi bir tooltip'te gösterir, none ise açık tutar. Üzerinde çalıştığınız kenar çubuğunu açıp kapatmak için ⌘B veya Ctrl+B tuşlarına basın.
Daraltılabilir gruplar ve alt menüler
Bir SidebarGroup veya SidebarMenuItem'ı bir Collapsible ile sarın, etiketi veya düğmeyi tetikleyici olarak işleyin ve içine bir SidebarMenuSub yerleştirin.
Sağ taraf
side="right" ayarlayın ve kenar çubuğunu SidebarInset'ten sonra yerleştirin. Rail ve mobil sheet tarafı izler.
Bir başlığın altında
Kenar çubuğu sticky'dir, bu yüzden üstündeki her şeyin altından başlar. Sticky bir başlıkla --sidebar-top değerini onun yüksekliğine ayarlayın; kenar çubuğu onun altına sabitlenir ve ekranın kalanına sığar.
Kontrollü
open ve onOpenChange verin. Tetikleyici, rail ve kısayolun hepsi onOpenChange üzerinden geçer.
Yükleniyor
SidebarMenuSkeleton yüklenirken bir menüyü doldurur. Genişlikler satıra göre değişir ve sunucu ile istemci arasında eşleşir.
Sağdan sola
dir="rtl" ve side="right" ayarlayın. Boşluk, alt menü çizgileri, tooltip'ler ve tetikleyici simgesi yansıtılır.
Kenar çubuğu 16rem genişliğindedir; telefonlarda 18rem, simgelere daraltıldığında 3rem. Sağlayıcıda --sidebar-width, --sidebar-width-mobile ve --sidebar-width-icon değerlerini geçersiz kılın.
Kenar çubuğunun yan etkisi yoktur. Açık olup olmadığını hatırlamak için onOpenChange içinde kaydedin ve sunucuda işlerken defaultOpen olarak geri okuyun.
| Tuş | Action |
|---|---|
| ⌘ + BCtrl + B | Kenar çubuğunu açıp kapatır. Sayfada birden fazla kenar çubuğu varsa odağı tutan, yoksa ilki yanıt verir. Zengin metin düzenleyicide yazarken yok sayılır. |
| TabShift + Tab | Bağlantılar arasında gezinir. Daraltılmış tuval dışı kenar çubuğu atlanır. |
| EnterSpace | Odaktaki bağlantıyı, düğmeyi veya tetikleyiciyi etkinleştirir. |
| Esc | Telefonlarda kenar çubuğunu kapatır. |
SidebarTrigger“Toggle Sidebar” olarak etiketlenir vearia-expandedilearia-controlssunar.isActivearia-current="page"ayarlar.- Tuval dışına daraltmak içeriği klavyeden ve ekran okuyuculardan gizler. Odak içerideyse tetikleyiciye taşınır.
- Simgelere daraltıldığında etiketler her bağlantının erişilebilir adında kalır ve hover ile klavye odağında tooltip olarak görünür. Grup etiketleri, eylemler ve rozetler gizlenir.
- Telefonlarda kenar çubuğu modal bir sheet'tir: odak hapsedilir, kaydırmak veya Esc kapatır, bir bağlantıyı izlemek de kapatır. Yeni sekmede açan bağlantılar, indirmeler ve değiştirici tuşlu tıklamalar onu açık tutar.
- Azaltılmış hareket açıkken daralma anlıktır.
| Prop | Tür | Varsayılan |
|---|---|---|
defaultOpen | boolean | true |
open | boolean | – |
onOpenChange | (open: boolean) => void | – |
keyboardShortcutmod, Apple platformlarında ⌘, diğerlerinde Ctrl'dür. null kapatır. | string | null | "mod+b" |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-wrapper" | Düzen sarmalayıcısı. |
--sidebar-width | Genişletilmiş genişlik. Varsayılan 16rem. |
--sidebar-width-mobile | Telefon sheet'inin genişliği. Varsayılan 18rem. |
--sidebar-width-icon | Simgelere daraltıldığındaki genişlik. Varsayılan 3rem. |
--sidebar-top | Kaydırırken kenar çubuğunun sabitlendiği yer; örneğin sticky bir başlığın altı. Varsayılan 0px. |
className ve diğer prop'lar kenar çubuğu kapsayıcısına gider.
| Prop | Tür | Varsayılan |
|---|---|---|
side | "left" | "right" | "left" |
variantplain; sayfanın üzerinde duran bir kenar çubuğu için yüzeyi, kenar çizgisini, kaydırma çubuğunu ve menü öğeleri arasındaki boşluğu kaldırır. | "sidebar" | "floating" | "inset" | "plain" | "sidebar" |
collapsible | "offcanvas" | "icon" | "none" | "offcanvas" |
mobileTelefonlarda nasıl açıldığı: yandan bir sheet veya sohbet uygulamaları gibi ekranı doldurarak kayma. | "sheet" | "fullscreen" | "sheet" |
dirTelefon sheet'inin yönünü de belirler. | "ltr" | "rtl" | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar" | Kenar çubuğu veya telefonlarda sheet. |
data-state | "expanded" veya "collapsed". |
data-collapsible | Daraltılmışken daraltılabilir mod, aksi halde "". Alt öğeleri group-data-[collapsible=icon]: ile biçimlendirin. |
data-variant | Varyant. |
data-side | Taraf. |
data-mobile | Telefon sheet'inde bulunur. |
data-slot="sidebar-container" | Kayan ve yeniden boyutlanan panel. |
data-slot="sidebar-inner" | İçeriği tutan yüzey. |
toggleSidebar çağıran, ghost simgeli bir Button. Durdurmak için onClick içinde event.preventDefault() çağırın. Simgeyi değiştirmek için alt öğe verin.
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-trigger" | Tetikleyici. |
aria-expanded | Kenar çubuğunun açık olup olmadığı. |
Kenar çubuğunun kenarında, tıklayınca onu açıp kapatan ince bir tıklama alanı. Tetikleyici ve kısayol klavye kullanıcılarını kapsadığı için sekme sırasının dışında bırakılır. Kenar çubuğu tuvalin dışındayken rail ekran kenarında kalır.
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-rail" | Rail. |
Kalan genişliği alan bir <main>. Bir inset kenar çubuğunun yanında yuvarlak köşeli bir karta dönüşür.
| Prop | Tür | Varsayılan |
|---|---|---|
renderFarklı bir öğe işler. Sayfada zaten bir <main> landmark'ı varsa <div /> verin. | React.ReactElement | (props) => React.ReactElement | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-inset" | Sayfa alanı. |
Düz <div> öğeleri. İçerik ince bir kaydırma çubuğu ve yumuşak kenar solmalarıyla kayar.
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-header" | Üst bölüm. |
data-slot="sidebar-content" | Kayan orta bölüm. |
data-slot="sidebar-footer" | Alt bölüm. |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-group" | Kenar çubuğunun bir bölümü. |
data-slot="sidebar-group-content" | Grubun içeriği. |
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-group-label" | Simgelere daraltıldığında yukarı kayar ve solar. |
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-group-action" | Erişilebilir bir etiket gerekir. |
Bir <ul> ve <li> öğeleri. Satırların bitişik durduğu sohbet geçmişi gibi yoğun listeler için gap="none" ayarlayın.
| Prop | Tür | Varsayılan |
|---|---|---|
gapÖğeler arası boşluk. SidebarMenuSub üzerinde de. | "default" | "none" | "default" |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-menu" | Liste. |
data-slot="sidebar-menu-item" | Bir öğe. Hover stilleri için group/menu-item. |
| Prop | Tür | Varsayılan |
|---|---|---|
isActiveVurgular ve aria-current="page" ayarlar. | boolean | false |
variant | "default" | "outline" | "default" |
size | "default" | "sm" | "lg" | "default" |
tooltipSimgelere daraltıldığında gösterilir. Menüde ilerledikçe içerik öğeler arasında kayar. | ReactNode | TooltipContentProps | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-menu-button" | Kardeş stilleri için peer/menu-button. |
data-active | isActive iken bulunur. |
data-size | Boyut. |
| Prop | Tür | Varsayılan |
|---|---|---|
showOnHoverYalnızca öğe hover veya odaktayken ya da menüsü açıkken gösterir. Dokunmatik ekranlarda her zaman görünür. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-menu-action" | Erişilebilir bir etiket gerekir. |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-menu-badge" | Öğenin sonunda bir sayı. |
| Prop | Tür | Varsayılan |
|---|---|---|
showIcon | boolean | false |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-menu-skeleton" | Yardımcı teknolojilerden gizlidir. |
Ön kenarında çizgi bulunan iç içe bir liste. Kenar çubuğu simgelere daraldığında katlanır.
| Prop | Tür | Varsayılan |
|---|---|---|
isActiveSidebarMenuSubButton üzerinde. | boolean | false |
sizeSidebarMenuSubButton üzerinde. | "sm" | "md" | "md" |
renderSidebarMenuSubButton üzerinde. | ReactElement | (props, state) => ReactElement | <a> |
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-menu-sub" | İç içe liste. |
data-slot="sidebar-menu-sub-button" | İç içe bir bağlantı. |
data-active | isActive iken bulunur. |
Sayfa arka planı üzerinde küçük bir Input ve ince bir ayırıcı.
| Öznitelik | Açıklama |
|---|---|
data-slot="sidebar-input" | Girdi. |
data-slot="sidebar-separator" | Ayırıcı. |
En yakın kenar çubuğunu okur ve denetler. SidebarProvider dışında hata fırlatır.
| Prop | Tür | Varsayılan |
|---|---|---|
state | "expanded" | "collapsed" | – |
open | boolean | – |
setOpen | (open: boolean) => void | – |
openMobile | boolean | – |
setOpenMobile | (open: boolean) => void | – |
isMobile | boolean | – |
toggleSidebarTelefonlarda sheet'i, aksi halde kenar çubuğunu açıp kapatır. | () => void | – |
- ButtonHer varyant ve boyutta düğmeler; hızlı istekler için spinner'ı atlayan yerleşik yükleme, başarı ve hata akışı.
- HotkeyKlavye kısayollarını ayrıştırır, etiketler, duyurur ve eşleştirir; Apple platformlarında ⌘, diğer her yerde Ctrl kullanır.
- InputÜç boyutlu, geçersiz ve salt okunur durumları, yerel doğrulama stilleri ve telefonların asla yakınlaştırmaması için 16px dokunmatik yazı tipi olan bir metin girişi.
- SheetHerhangi bir kenardan kayarak gelen bir panel; kaydırarak kapatma, kaydırma kilidi ve üst üste iç içe geçme desteği vardır.
- SkeletonGöstermeden önce 150ms bekleyen, sardıkları içeriğin tam boyutunu alan ve hiçbir şeyi kaydırmadan içeriği yumuşakça görünür kılan yer tutucular.
- TooltipHover ya da klavye odağında, kısa bir bekleyişten sonra açılan, komşular arasında anında geçen ve kısayolları gösteren kısa bir ipucu.
Kullanıldığı bloklar
Sidebar üzerine kurulan bloklar.
- Chat SidebarBir sohbet uygulaması için kenar çubuğu. Üstte logo, arama ve Yeni sohbet, altında kendi bağlantılarınız, sabitlenmiş sohbetler, sohbetlerini göstermek için genişleyen projeler, güne göre gruplanmış son sohbetler ve hover ile sağ tık menüleri, satır içi yeniden adlandırma, geri alınabilir silme ve canlı yanıt durumları olan satırlar.
- HextaAITüm HextaUI yapay zeka bloklarından oluşturulmuş eksiksiz bir yapay zeka sohbet uygulaması. Kenar çubuğunda sohbetler, kaynaklı düşünme, fark ve onaylı araç çağrıları, ajan çalışmadan önce gözden geçirdiğiniz bir plan, akışla gelen Markdown ve kod, ve sessiz ses modu; hepsi AI SDK mesaj parçalarıyla yönetilir.