Hover card
Bir bağlantının üzerine gelindiğinde ya da odaklanıldığında açılan, görme engeli olmayan kullanıcıların göz atabileceği içerikler için bir önizleme kartı.
pnpm dlx shadcn@latest add https://hextaui.com/r/hover-card.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 cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/hover-card.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Bir hover card bir önizlemedir; menü veya diyalog değildir. Trigger normal bir bağlantı olarak kalır; bu yüzden karttaki her şey bağlantının gittiği sayfada da bulunmalıdır.
Taraf
<HoverCardContent /> üzerinde side ve align ayarlayın. inline-end gibi mantıksal taraflar okuma yönünü izler ve kart ekrandan çıkacağında ters döner veya kayar.
Gecikme
Trigger üzerindeki delay ve closeDelay, işaretçinin kart açılmadan önce ne kadar durması gerektiğini ve ayrıldıktan sonra ne kadar kalacağını belirler. 600ms varsayılanı, işaretçi bir sayfayı geçerken kartların yanıp sönerek açılmasını önler.
Satır içi bağlantı
Trigger'ı, bir cümlenin içindekiler dahil herhangi bir bağlantı yapmak için render kullanın. Bir bağlantı iki satıra sardığında kart, üzerine geldiğiniz satıra sabitlenir.
Etkileşimli içerik
İşaretçiyi bağlantıdan karta taşıyın; kart açık kalır, böylece içindeki bağlantılara ve düğmelere tıklanabilir. Aralarındaki yol hoşgörülüdür; bu yüzden çapraz bir hareket kartı kapatmaz.
Paylaşılan kart
Tek bir kart birçok bağlantıya hizmet eder. createHoverCardHandle ile bir handle oluşturun, her trigger'a bir payload verin ve kartta okuyun. Adlar arasında hareket etmek, kartı kapatıp yeniden açmak yerine yeni bağlantıya kaydırır. Eski içerik hareket ettiğiniz yöne doğru kayarak çıkar, yeni içerik kayarak girer ve yükseklik ikisi arasında yumuşakça değişir.
Ok
arrow kartın kenarlığına dikişsiz birleşen bir işaretçi ekler. Taraf ofseti ona yer açmak için büyür ve kart ters döndüğünde onu izler.
İçerik yükleniyor
onOpenChange içinde veri çekmeye başlayın ve veri gelene kadar bir skeleton gösterin. İçerik değiştiğinde kart zıplamak yerine yeni yüksekliğine yumuşakça geçer.
Kontrollü
open ve onOpenChange geçin. İkinci argüman, trigger-hover, trigger-focus veya escape-key gibi değişimin nedenini söyler.
Uzun içerik
Kırılmayan metin kartın içinde sarar ve trigger'ın yanındaki alandan uzun bir kart ekrandan çıkmak yerine kayar.
Sağdan sola
Kart trigger'ın yönünü okur; bu yüzden mantıksal taraflar ve hizalama ters döner ve ölçek animasyonu doğru köşeden büyür.
| Tuş | Action |
|---|---|
| Tab | Trigger'a odaklanmak, üzerine gelmeyle aynı gecikmeden sonra kartı açar. Odağı başka yere taşımak kartı kapatır. |
| Enter | Diğer bağlantılar gibi bağlantıyı izler. |
| Esc | Kartı kapatır. |
- Kart, gören fare ve klavye kullanıcıları için görsel bir ektir. Ekran okuyucular yalnızca bağlantıyı duyar; böylece geçtikleri her bağlantıda bir önizlemeden geçmeye zorlanmazlar.
- Üzerine gelmenin olmadığı dokunmatik ekranlarda hiçbir şey açılmaz. Bir dokunuş bağlantıyı izler; bu yüzden hedefin aynı bilgiyi içermesi gerekir.
- Odak asla kartın içine geçmez. Klavyeyle erişilebilir olması gereken kontroller gerekiyorsa bunun yerine bir popover kullanın.
- Azaltılmış hareket açıkken kart ölçeklenmeden solar ve paylaşılan kart bağlantılar arasında kaymak yerine atlar.
Base UI preview card üzerine kuruludur. Her parça, sardığı primitive'in prop'larını kabul eder.
| Prop | Tür | Varsayılan |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChangedetails.reason, trigger-hover, trigger-focus, trigger-press, outside-press, escape-key, imperative-action veya none olur. | (open: boolean, details) => void | – |
onOpenChangeCompleteAçma ya da kapatma animasyonu bittikten sonra çağrılır. | (open: boolean) => void | – |
handleKökün dışında render edilen trigger'ları bağlar. | HoverCardHandle<Payload> | – |
childrenKartı açan trigger'ın payload'unu okumak için fonksiyon biçimini kullanın. | ReactNode | ({ payload }) => ReactNode | – |
actionsRef | RefObject<{ close, unmount }> | – |
| Prop | Tür | Varsayılan |
|---|---|---|
href | string | – |
delayÜzerine gelmenin veya odaklanmanın kartı açmasından önceki milisaniye. | number | 600 |
closeDelayAyrıldıktan sonra kartın açık kaldığı milisaniye. | number | 300 |
handle | HoverCardHandle<Payload> | – |
payloadBu trigger kartı açtığında karta geçirilir. | Payload | – |
render<Button variant="link" /> veya bir router bağlantısı gibi kendi bağlantınızı render edin. | ReactElement | (props, state) => ReactElement | <a> |
| Öznitelik | Açıklama |
|---|---|
data-slot="hover-card-trigger" | CSS'te tetikleyiciyi hedefleyin. |
data-popup-open | Bu trigger'ın kartı açıkken bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "center" |
arrowTrigger'a doğru bir işaretçi gösterin. | boolean | false |
sideOffset | number | OffsetFunction | 6, or 10 with arrow |
alignOffset | number | OffsetFunction | 0 |
collisionPaddingKart ile görünüm alanı kenarı arasında bırakılan boşluk. | number | Rect | 8 |
collisionAvoidanceKartın çarpışmada ters dönüp dönmediği, kayıp kaymadığı veya hiçbir şey yapıp yapmadığı. | CollisionAvoidance | – |
sticky | boolean | false |
anchorTrigger dışında bir şeye göre konumlandırın. | Element | RefObject | VirtualElement | – |
positionMethod | "absolute" | "fixed" | "absolute" |
disableAnchorTracking | boolean | false |
portalPropscontainer gibi portal prop'ları. | HoverCardPortalProps | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="hover-card-content" | CSS'te kartı hedefleyin. |
data-open | Kart açıkken bulunur. |
data-starting-style | Kart açılma animasyonu sırasında bulunur. |
data-ending-style | Kart kapanma animasyonu sırasında bulunur. |
data-instant | Kartı klavye odağı açtığında focus, Escape veya dış bir basış kapattığında dismiss. Ayarlıyken çıkış animasyonu atlanır. |
data-side | Çarpışmalardan sonra kartın yerleştiği taraf. |
data-align | Yerleştiği hizalama. |
--transform-origin | Ölçek animasyonunun büyüdüğü, trigger'ın yanındaki nokta. |
--available-width | Trigger'ın yanında kalan yer. Kart asla bunu aşmaz. |
--available-height | Üstte veya altta kalan yer. Daha uzun içerik kayar. |
| Positioner niteliği | Açıklama |
|---|---|
data-slot="hover-card-positioner" | Hareket eden öğe. Paylaşılan bir kart bağlantı değiştirdiğinde kayar. |
data-anchor-hidden | Trigger görünümden çıktığında bulunur. |
| İç parçalar | Açıklama |
|---|---|
data-slot="hover-card-viewport" | İçeriği sarar. Paylaşılan bir kart bağlantı değiştirirken data-activation-direction taşır. |
data-slot="hover-card-body" | İçeriğiniz. Değiştiğinde yüksekliği yumuşakça değişir. |
data-slot="hover-card-arrow" | Kenarı için data-side içeren işaretçi. |
--popup-height | Bağlantılar arasında yeniden boyutlanırken kartta ayarlanır. |
| Prop | Tür | Varsayılan |
|---|---|---|
container | HTMLElement | ShadowRoot | RefObject | null | document.body |
keepMounted | boolean | false |
Ayrılmış trigger'lar için bir handle döndürür. open(triggerId) ve close() yöntemleri kartı olay işleyicilerinden kontrol eder, isOpen state'ini okur. Payload'u tiplendirmek için bir tür argümanı geçin.
- MotionHer bileşenin kullandığı yumuşatma eğrileri, süreler ve azaltılmış hareket denetimi; ayrıca boyut dönüşümleri ve kayan vurgular için hook'lar.
- 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.
- DrawerHerhangi 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.
Kullanıldığı bloklar
Hover card ü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.
- ThinkingBir modelin çalışırken ne yaptığını gösterin. Bir shader küresi ve her adımı izleyen canlı bir etiket, aramaların, kaynak çiplerinin ve akıl yürütmenin daraltılabilir bir izi, ardından desteklediği iddiaların hemen yanında alıntılar içeren bir yanıt.