Drawer
Herhangi bir kenardan kayarak gelen ve parmağınızı izleyen bir panel; yapışma noktaları, çalışan bir tutamaç ve üst üste binen iç içe çekmeceler içerir.
pnpm dlx shadcn@latest add https://hextaui.com/r/drawer.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 cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/drawer.tsx components/ui/sheet.tsx components/ui/button.tsx İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Yönler
Kenarı seçmek için <Drawer /> üzerinde swipeDirection ayarlayın. Drawer o kenardan açılır ve ona doğru kaydırılarak kapanır. Üst ve alt drawer'lar varsayılan olarak bir tutamak gösterir.
Snap noktaları
Alt bir drawer'ı hazır yüksekliklerde durdurmak için snapPoints geçin. 0 ile 1 arası sayılar görünüm alanının kesirleridir, daha büyük sayılar pikseldir ve dizeler px veya rem alır. Görünen kısım her zaman içeriğine sığar; böylece ekranın altında hiçbir şey gizlenmez.
Kaydırılabilir içerik
<DrawerBody /> kendi başına kayar; böylece üst ve alt bilgi yerinde kalır. Kaydırma, yalnızca gövde en üste geri kaydırıldığında başlar.
Formlar ve klavye
Alt bir drawer metin alanları içerdiğinde <DrawerContent /> bileşenini <DrawerVirtualKeyboardProvider /> içine sarın. Telefonlarda odaktaki alan, yazılım klavyesinin arkasında gizlenmek yerine onun üstünde görünüme kayar. Üst ve alt bilginin yerinde kalması için alanları <DrawerBody /> içinde tutun.
İç içe
Aynı kenardaki bir drawer'dan açılan drawer üste yığılır. Arkadakiler küçülür, üstünde görünür ve en üsttekini kaydırarak uzaklaştırırken parmağınızı izler.
Drawer'dan onay
Başka bir kenardaki diyaloglar, alert dialog'lar, sheet'ler ve drawer'lar yığılmak yerine üste katmanlanır. Drawer geri çekilir ve onu daha açık bir arka plan kaplar.
Duyarlı
Masaüstünde yan panel, telefonlarda alt sheet göstermek için swipeDirection değerini bir media query ile değiştirin.
Modal olmayan
modal={false} ile arka plan yoktur, sayfa kaymaya devam eder ve odak drawer'dan çıkabilir.
Kontrollü
Trigger olmadan her yerden açmak için open ve onOpenChange geçin.
Ayrık tetikleyiciler
Tek bir drawer'ı createDrawerHandle ile birkaç trigger arasında paylaşın. Her trigger, drawer'ın bir fonksiyon alt öğesi aracılığıyla render ettiği bir payload geçirir.
Sağdan sola
İçeriğini yansıtmak için <DrawerContent /> bileşenine dir="rtl" geçin. swipeDirection fiziksel bir kenarı adlandırır; bu yüzden "left" solda kalır ve tutamak iç kenarda kalır.
| Tuş | Action |
|---|---|
| EnterSpace | Trigger üzerinde, drawer'ı açar ve odağı içine taşır. |
| TabShift + Tab | Odaklanabilir öğeler arasında gezinir. Odak, modal bir drawer'ın içinde kalır. |
| Esc | En üstteki drawer'ı kapatır ve odağı trigger'ına geri verir. |
- Drawer bir diyalogdur.
<DrawerTitle />onu etiketler,<DrawerDescription />tanımlar; bu yüzden her zaman bir başlık ekleyin. - Kaydırmak asla tek çıkış yolu değildir: Escape, arka plan ve bir
<DrawerClose />düğmesi de drawer'ı kapatır. - Tutamak dekoratiftir ve yardımcı teknolojilerden gizlenir. Fareyle drawer içindeki metin, drawer'ı sürüklemeden seçilebilir.
- Azaltılmış hareket etkinken drawer kaymak yerine solarak girer ve çıkar. Sürükleme yine işaretçiyi izler.
Base UI drawer üzerine kuruludur. Her parça, sardığı primitive'in prop'larını kabul eder.
| Prop | Tür | Varsayılan |
|---|---|---|
swipeDirectionAçıldığı kenar ve onu kapatan yön. | "up" | "down" | "left" | "right" | "down" |
showSwipeHandleTutamağı gösterir. Varsayılan olarak yukarı ve aşağı için true, sol ve sağ için false. | boolean | – |
snapPointsDikey bir drawer'ın durabileceği yükseklikler. 0–1 görünüm alanının bir kesridir, >1 piksel demektir, dizeler px veya rem alır. | (number | string)[] | – |
snapPoint | number | string | null | – |
defaultSnapPoint | number | string | null | – |
onSnapPointChange | (snapPoint, details) => void | – |
defaultOpen | boolean | false |
open | boolean | – |
onOpenChange | (open: boolean, details) => void | – |
onOpenChangeCompleteAçma ya da kapatma animasyonu bittikten sonra çağrılır. | (open: boolean) => void | – |
modalArka plan yalnızca true olduğunda render edilir. | boolean | "trap-focus" | true |
disablePointerDismissalArka plana tıklandığında açık tutun. | boolean | false |
handle | DrawerHandle<Payload> | – |
children | ReactNode | ({ payload }) => ReactNode | – |
| Prop | Tür | Varsayılan |
|---|---|---|
handle | DrawerHandle<Payload> | – |
payload | Payload | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-trigger" | CSS'te tetikleyiciyi hedefleyin. |
data-popup-open | Drawer'ı açıkken bulunur. |
Portalı, arka planı, görünüm alanını ve popup'ı, ayrıca tutamağı render eder. Dikey drawer'lar içeriklerine, görünüm alanı yüksekliği eksi 4rem'e kadar sığar. Yan drawer'lar %75 genişliğindedir, sm breakpoint'inden itibaren en çok 24rem. h-* veya w-* ile geçersiz kılın ya da data-[swipe-axis=y]: ile tek bir eksene kapsamlayın.
| Prop | Tür | Varsayılan |
|---|---|---|
initialFocus | boolean | RefObject | (type) => HTMLElement | boolean | – |
finalFocus | boolean | RefObject | (type) => HTMLElement | boolean | – |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-popup" | Drawer paneli. |
data-slot="drawer-content" | Alt öğelerinizin etrafındaki iç sarmalayıcı. Başka hiçbir şey kaymadığında o kayar. |
data-swipe-direction | up, right, down veya left. |
data-swipe-axis | x veya y. |
data-open | Drawer açıkken bulunur. |
data-starting-style | Animasyonla belirirken bulunur. |
data-ending-style | Animasyonla kaybolurken bulunur. |
data-swiping | Sürüklenirken bulunur. |
data-snap-points | Drawer'ın snap noktaları olduğunda bulunur. |
data-expanded | Tam yükseklikli snap noktasında bulunur. |
data-nested-drawer-open | Üstte başka bir drawer açıkken bulunur. |
data-stack | Aynı kenardaki bir drawer üste yığılıyken bulunur. |
--drawer-inset | Drawer'ı görünüm alanı kenarlarından uzağa yüzdürür. Varsayılan 0px. |
--drawer-bleed-background | Kenarının ötesine sürüklendiğinde ortaya çıkan alanı doldurur. Varsayılan olarak popover rengidir. |
--drawer-swipe-movement-x | Yatay sürükleme mesafesi. Bir -y değişkeni de vardır. |
--drawer-snap-point-offset | Geçerli snap noktasının üstten ne kadar aşağıda durduğu. |
--nested-drawers | Üstte kaç drawer açık. |
modal true olduğunda <DrawerContent /> tarafından render edilir. Kaydırdıkça solar ve snap noktaları varsa en az yarı görünür kalır. Bir sheet'in veya başka bir kenardaki drawer'ın üstüne katmanlanan drawer daha açık bir arka plan alır.
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-overlay" | Arka plan. |
data-nested | Katmanlı drawer'ların daha açık arka planlarında bulunur. |
--drawer-overlay-min-opacity | Kaydırırken solarak ineceği en düşük opaklık. 0, snap noktalarıyla 0.5. |
showSwipeHandle açıkken <DrawerContent /> tarafından iç kenarda render edilir. Drawer'ın tamamı sürüklenebilir, bu yüzden tutamak görsel bir ipucudur.
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-swipe-handle" | Tutamak. |
Drawer'ı düzenleyen düz <div> öğeleri. Üst bilgi, küçük ekranlardaki dikey drawer'larda metnini ortalar, gövde kayar ve kalan alanı kaplar, alt bilgi ise eylemlerini üst üste dizer.
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-header" | Başlık ve açıklama. |
data-slot="drawer-body" | Kaydırılabilir içerik. |
data-slot="drawer-footer" | Eylemler. |
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <h2> |
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-title" | Drawer'ı etiketler. |
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <p> |
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-description" | Drawer'ı tanımlar. |
Hiçbir öğe render etmez. <Drawer /> içine, <DrawerContent /> çevresine yerleştirin. Yazılım klavyesi açıkken drawer'ın kaydırma kapsayıcısının altına yer ekler, odaktaki alanı görünüme kaydırır ve iOS'ta alanlara dokunmanın klavyeyi açmasını sağlar. Onsuz drawer'lar etkilenmez.
| Prop | Tür | Varsayılan |
|---|---|---|
children | ReactNode | – |
| Öznitelik | Açıklama |
|---|---|
--drawer-keyboard-inset | Klavye açıkken görünüm alanında ayarlanır: klavyenin sayfayla ne kadar çakıştığı. 0px yedeğiyle kullanın. |
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="drawer-close" | Basıldığında drawer'ı kapatır. |
createDrawerHandle<Payload>(), bir <Drawer /> öğesini başka bir yerde render edilen tetikleyicilere bağlayan bir tanıtıcı döndürür. Bileşeninizin dışında, yalnızca bir kez oluşturun.
- 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.
- Alert dialogYıkıcı ya da önemli eylemler için, asenkron işin bitmesini bekleyen ve telefonlarda alt sayfaya dönüşen bir onay iletişim kutusu.
- CommandSatır içi ya da ⌘K paleti olarak eylemlerin aranabilir listesi; sayfalar, kısayollar ve vurgulanmış eşleşmeler içerir.
- Context menuSağ tık ya da uzun basışla açılan eylem menüsü; alt menüler, onay kutusu ve radyo öğeleri ile dokunmatik ekranda basılı tutma geri bildirimi içerir.
- DialogFormlar ve odaklı görevler için sayfanın üzerinde bir pencere; sabit üst bilgi ve alt bilgi, iç içe geçme ve telefonlarda kaydırılabilir bir alt sayfa içerir.
- Dropdown menuBir düğmenin ardındaki eylem ve seçenek menüsü; gruplar, alt menüler, onay kutusu ve radyo öğeleri ile kısayollar içerir.
Kullanıldığı bloklar
Drawer üzerine kurulan bloklar.