Message scroller
Ein Chat-Scrollbereich, der neuen Nachrichten folgt, beim Zurücklesen deine Position hält und auf dem Sprung-Button zählt, was du verpasst hast.
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.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @shadcn/react @tabler/icons-react cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/message-scroller.tsx components/ui/button.tsx lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Gib jedem Item eine stabile messageId. Der Scroller nutzt sie, um neuen Nachrichten zu folgen, deine Position zu halten und zu zählen, was du noch nicht gesehen hast. Kombiniere es mit <Message /> und <Bubble /> für die Zeilen.
Gruppenchat
Anker müssen keine Nachrichten sein. Hier startet ein <Marker /> für einen Beitretenden den Turn. Scrolle nach oben, empfange Nachrichten, und der Sprung-Button zählt, was in deiner Abwesenheit eingetroffen ist.
Kontext bewahren
scrollPreviousItemPeek lässt einen Ausschnitt des vorherigen Turns über einem neu verankerten stehen, damit sich der Thread weiter zusammenhängend anfühlt. Probiere jeden Wert aus und stelle dann die nächste Frage.
Gespeicherte Threads öffnen
defaultScrollPosition="last-anchor" öffnet eine Unterhaltung wieder bei ihrer letzten Frage mit der Antwort darunter, statt den Leser mitten in der Antwort ganz unten abzusetzen.
Frühere Nachrichten laden
Oben hinzugefügte ältere Nachrichten lassen das, was du liest, an Ort und Stelle (preserveScrollOnPrepend, standardmäßig an).
Zu Nachrichten springen
useMessageScroller steuert den Thread von außen, und useMessageScrollerVisibility meldet den aktuellen Turn, sodass die Gliederung hervorhebt, wo du bist.
Innerhalb des Providers lassen diese Hooks deine eigenen Steuerelemente den Thread scrollen und auf das Sichtbare reagieren.
| Taste | Aktion |
|---|---|
| Tab | Fokussiert die Unterhaltung. Der Sprung-Button gehört nur zur Tab-Reihenfolge, solange er angezeigt wird. |
| ↑↓ | Scrollt die Unterhaltung. |
| Page UpPage Down | Scrollt um einen Bildschirm. |
| HomeEnd | Springt zur ersten oder letzten Nachricht. |
- Der Viewport ist ein beschrifteter, fokussierbarer Bereich und der Inhalt ein
role="log", sodass Screenreader neue Nachrichten beim Eintreffen ansagen. Gib dem Viewport einaria-label. - Das Label des Sprung-Buttons sagt, wie viele Nachrichten neu sind, sodass „3 neue Nachrichten“ vorgelesen wird und nicht nur ein Pfeil.
- Neuen Nachrichten zu folgen verschiebt dich nie, während du zurücklesen. Es setzt erst wieder ein, wenn du erneut unten bist.
| Prop | Typ | Standard |
|---|---|---|
autoScrollFolge neuen Nachrichten, solange der Leser ganz unten ist. | boolean | false |
defaultScrollPositionWo der Thread geöffnet wird. | "start" | "end" | "last-anchor" | "end" |
scrollPreviousItemPeekWie viel des vorherigen Items über einem neuen Anker sichtbar bleibt. | number | 64 |
scrollEdgeThresholdPixel von einem Rand, die noch als am Rand gelten. | number | – |
scrollMarginPlatz, der über in die Ansicht gescrollten Nachrichten bleibt. | number | – |
| Prop | Typ | Standard |
|---|---|---|
preserveScrollOnPrependBehalte die Leseposition, wenn oben Nachrichten hinzukommen. | boolean | false |
aria-labelBenennt den Unterhaltungsbereich. | string | – |
| Attribut | Beschreibung |
|---|---|
data-scrollable="start end" | An welchen Rändern es noch etwas zu scrollen gibt. Steuert die Rand-Fades. |
data-autoscrolling | Vorhanden, solange neuen Nachrichten gefolgt wird. Die Scrollleiste wird ausgeblendet. |
--scroller-fade-start / --scroller-fade-end | Größe der Rand-Fades. Sie werden ein- und ausgeblendet. |
| Prop | Typ | Standard |
|---|---|---|
messageIdStabile id für Folgen, Anker und Zähler. | string | – |
scrollAnchorScrolle dieses Item nach oben, wenn es eintrifft, mit defaultScrollPosition="last-anchor". | boolean | false |
| Prop | Typ | Standard |
|---|---|---|
direction | "start" | "end" | "end" |
showUnseenWächst zu einer Pille, die Nachrichten zählt, die eintrafen, während du nach oben gescrollt warst. | boolean | true |
unseenLabel | (count: number) => ReactNode | "3 new messages" |
variant | Button variant | "outline" |
behavior | ScrollBehavior | "smooth" |
| Attribut | Beschreibung |
|---|---|
data-slot="message-scroller-button" | Den Button per CSS ansprechen. |
data-active | "true", solange es ein Sprungziel gibt. |
data-unseen | Die Zahl ungesehener Nachrichten, solange sie über null liegt. |
- ButtonButtons in allen Varianten und Größen, mit eingebautem Lade-, Erfolgs- und Fehlerablauf, der den Spinner bei schnellen Anfragen überspringt.
- MotionDie Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
- MessageEine Chat-Nachrichtenzeile mit Avatar, Name, Bubbles und Status, in der neue Nachrichten von der Seite des Absenders hereinsteigen.
- AttachmentDatei- und Bildkarten für Uploads, mit Fortschritt, Zuständen, Aktionen, einem Trigger über die ganze Karte und Namen, die ihre Dateiendung behalten.
- BubbleChat-Nachrichten-Bubbles mit Varianten, gruppierten Ecken, Reaktionen und Platz für interaktive Inhalte.
- MarkerLeise Hinweise zwischen Inhalten, etwa Datumstrenner und Systemereignisse, mit Sticky-Datums- und Zeitangaben, die als Heute oder Gestern gelesen werden.
In Blocks verwendet
Blocks, die auf Message scroller aufbauen.
- Prompt InputEin Chat-Composer, der als ruhige einzelne Zeile beginnt, beim Schreiben zu einer Karte wächst und nach unten wandert, sobald die Unterhaltung beginnt. Enter sendet, sicher bei japanischer und chinesischer Eingabe. Dateien per Einfügen, Ablegen oder Auswählen hinzufügen, mit Vorschau, Fortschritt und Wiederholen. @ fügt Dateien hinzu und / führt Befehle aus einem Menü an der Einfügemarke aus. Ein Modellwähler mit Zifferntasten, ein Effort-Slider, der bei Max lebendig wird, ein Kontextring, Diktat mit Live-Wellenform, Tool-Chips, eine Warteschlange für Nachrichten, die während einer streamenden Antwort getippt werden, und Entwürfe, die einen Reload überstehen.
- Agent TodosZeige den Plan eines Agenten, während er arbeitet. Jeder Schritt wandert von Backlog über To do und In Arbeit zu Erledigt, mit Live-Zeiten, Fehlern und den dahinterliegenden Tool-Aufrufen. Eine Status-Pille für über dem Composer, sichtbare Planänderungen und ein Review-Schritt, um den Plan vor der Ausführung zu bearbeiten.
- Chat ThreadDie ganze Unterhaltung rund um den Composer. Deine Frage bleibt oben angeheftet, während die Antwort streamt, Checkpoints an der Seite springen zwischen Nachrichten, und jede Antwort lässt sich kopieren, bearbeiten, wiederholen, bewerten und zwischen Versionen umschalten. Antworten rendern Markdown mit Codeblöcken, Tabellen und Zitaten, und Thinking, Tool-Aufrufe und Prompt Input lassen sich direkt einsetzen.
- Code BlockCodeblöcke für KI-Antworten. Syntaxhervorhebung, die mit dem Streaming Schritt hält, Kopieren, Herunterladen und Umbrechen, Zeilennummern und hervorgehobene Zeilen, Diffs mit Annehmen und Ablehnen sowie ein Terminal für Befehle.