Message scroller
Yeni mesajları takip eden, geriye doğru okurken yerinizi koruyan ve kaçırdıklarınızı atlama düğmesinde sayan bir sohbet kaydırma alanı.
New chat
How can I help you today?
The prompt is read only. Press send to play the next turn.
pnpm dlx shadcn@latest add https://hextaui.com/r/message-scroller.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 @shadcn/react @tabler/icons-react cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/message-scroller.tsx components/ui/button.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Her öğeye kararlı bir messageId verin. Kaydırıcı bunu yeni mesajları takip etmek, yerinizi korumak ve görmediklerinizi saymak için kullanır. Satırlar için <Message /> ve <Bubble /> ile birlikte kullanın.
Grup sohbeti
Çapalar mesaj olmak zorunda değildir. Burada birinin katılması için bir <Marker /> turu başlatır. Yukarı kaydırın, mesaj alın; atlama düğmesi siz yokken gelenleri sayar.
Bağlamı koruma
scrollPreviousItemPeek yeni çapalanan turun üstünde önceki turdan bir dilim tutar, böylece konuşma kesintisiz hissedilir. Her miktarı deneyin, sonra bir sonraki soruyu sorun.
Kaydedilmiş konuşmaları açma
defaultScrollPosition="last-anchor" bir konuşmayı, okuyucuyu cevabın ortasında en alta bırakmak yerine, son sorusunda ve cevabı altta olacak şekilde yeniden açar.
Önceki mesajları yükleme
Üste eklenen eski mesajlar okuduğunuz yeri yerinde tutar (preserveScrollOnPrepend, varsayılan olarak açık).
Mesajlara atlama
useMessageScroller konuşmayı dışarıdan yönetir, useMessageScrollerVisibility ise geçerli turu bildirir; böylece anahat nerede olduğunuzu vurgular.
Sağlayıcının içinde bu hook'lar kendi denetimlerinizin konuşmayı kaydırmasına ve ekrandakilere tepki vermesine olanak tanır.
| Tuş | Action |
|---|---|
| Tab | Konuşmaya odaklanır. Atlama düğmesi yalnızca görünürken sekme sırasına girer. |
| ↑↓ | Konuşmayı kaydırır. |
| Page UpPage Down | Bir ekran kadar kaydırır. |
| HomeEnd | İlk veya son mesaja atlar. |
- Viewport etiketli, odaklanabilir bir bölgedir ve içerik bir
role="log"'dur; böylece ekran okuyucular yeni mesajları geldikçe duyurur. Viewport'a biraria-labelverin. - Atlama düğmesinin etiketi kaç mesajın yeni olduğunu söyler; böylece yalnızca bir ok değil, "3 yeni mesaj" okunur.
- Yeni mesajları takip etmek, geriye doğru okurken sizi asla oynatmaz. Yalnızca yeniden en alta geldiğinizde devam eder.
| Prop | Tür | Varsayılan |
|---|---|---|
autoScrollOkuyucu en alttayken yeni mesajları takip eder. | boolean | false |
defaultScrollPositionKonuşmanın açıldığı yer. | "start" | "end" | "last-anchor" | "end" |
scrollPreviousItemPeekYeni bir çapanın üstünde önceki öğenin ne kadarının görünür kalacağı. | number | 64 |
scrollEdgeThresholdBir kenarda sayılacak, kenara olan piksel mesafesi. | number | – |
scrollMarginGörünüme kaydırılan mesajların üstünde bırakılan boşluk. | number | – |
| Prop | Tür | Varsayılan |
|---|---|---|
preserveScrollOnPrependMesajlar üste eklendiğinde okuma konumunu korur. | boolean | false |
aria-labelKonuşma bölgesini adlandırır. | string | – |
| Öznitelik | Açıklama |
|---|---|
data-scrollable="start end" | Hangi kenarlarda kaydırılacak daha fazla içerik olduğu. Kenar solmalarını yönetir. |
data-autoscrolling | Yeni mesajlar takip edilirken bulunur. Kaydırma çubuğu gizlenir. |
--scroller-fade-start / --scroller-fade-end | Kenar solmalarının boyutu. Giriş ve çıkışta animasyonludur. |
| Prop | Tür | Varsayılan |
|---|---|---|
messageIdTakip, çapalar ve sayımlar için kararlı id. | string | – |
scrollAnchordefaultScrollPosition="last-anchor" ile bu öğe geldiğinde onu üste kaydırır. | boolean | false |
| Prop | Tür | Varsayılan |
|---|---|---|
direction | "start" | "end" | "end" |
showUnseenYukarı kaydırılmışken gelen mesajları sayan bir hapa dönüşür. | boolean | true |
unseenLabel | (count: number) => ReactNode | "3 new messages" |
variant | Button variant | "outline" |
behavior | ScrollBehavior | "smooth" |
| Öznitelik | Açıklama |
|---|---|
data-slot="message-scroller-button" | CSS'te düğmeyi hedefler. |
data-active | Atlanacak bir yer olduğu sürece "true". |
data-unseen | Görülmeyenlerin sayısı; sıfırın üstündeyken. |
- ButtonHer varyant ve boyutta düğmeler; hızlı istekler için spinner'ı atlayan yerleşik yükleme, başarı ve hata akışı.
- 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.
- MessageAvatar, ad, balonlar ve durum içeren bir sohbet mesajı satırı; yeni mesajlar göndericinin tarafından yukarı doğru belirir.
- AttachmentYüklemeler için dosya ve görsel kartları; ilerleme, durumlar, eylemler, tüm kartı kaplayan bir tetikleyici ve uzantısını koruyan adlar içerir.
- BubbleVaryantlı, köşeleri gruplanmış, tepkileri olan ve etkileşimli içeriğe yer açan sohbet mesajı balonları.
- Markerİçerik arasında tarih ayırıcıları ve sistem olayları gibi sessiz notlar; Bugün ya da Dün olarak okunan yapışkan tarih ve saatler içerir.
Kullanıldığı bloklar
Message scroller üzerine kurulan bloklar.
- Prompt InputTek sakin bir satır olarak başlayan, yazdıkça karta dönüşen ve konuşma başladığında aşağı inen bir sohbet yazma alanı. Enter gönderir; Japonca ve Çince girişle de güvenle çalışır. Dosyaları yapıştırın, bırakın ya da seçin; önizleme, ilerleme ve yeniden deneme desteği vardır. @ dosya ekler, / ise imleçte açılan bir menüden komut çalıştırır. Sayı tuşlarıyla çalışan bir model seçici, Max'ta canlanan bir efor kaydırıcısı, bir bağlam halkası, canlı dalga biçimli dikte, araç çipleri, yanıt akarken yazılan mesajlar için bir kuyruk ve yeniden yüklemeden sağ çıkan taslaklar.
- Agent TodosBir ajanın planını çalışırken gösterin. Her adım backlog'dan yapılacak, devam eden ve tamamlanana ilerler; canlı süreler, başarısızlıklar ve arkasındaki araç çağrıları ile birlikte. Yazma alanının üstü için bir durum hapı, görebildiğiniz plan değişiklikleri ve çalışmadan önce planı düzenlemek için bir gözden geçirme adımı.
- Chat ThreadYazma alanının çevresindeki tüm konuşma. Yanıt akarken sorunuz üstte sabitlenir, yandaki kontrol noktaları mesajlar arasında atlar ve her yanıt kopyalanabilir, düzenlenebilir, yeniden denenebilir, puanlanabilir ve sürümler arasında değiştirilebilir. Yanıtlar kod blokları, tablolar ve alıntılarla Markdown olarak render edilir; düşünme, araç çağrıları ve Prompt Input doğrudan yerine oturur.
- Code BlockYapay zeka yanıtları için geliştirilmiş kod blokları. Akışa ayak uyduran sözdizimi vurgulama, kopyalama, indirme ve satır kaydırma, satır numaraları ve vurgulanmış satırlar, kabul ve reddetme seçenekli fark görünümleri ve komutlar için bir terminal.