Componente
Message scroller
Um container de rolagem estilo chat que gruda na última mensagem. Conteúdo novo rola automaticamente enquanto fixado no fim, um botão de salto aparece ao rolar para cima, e a instância expõe métodos para rolar ao início, fim ou qualquer mensagem.
Auto-scroll e botão de salto
Autumn note #1 — leaves, weather, and city recorded.
Autumn note #2 — leaves, weather, and city recorded.
Autumn note #3 — leaves, weather, and city recorded.
Autumn note #4 — leaves, weather, and city recorded.
Autumn note #5 — leaves, weather, and city recorded.
Autumn note #6 — leaves, weather, and city recorded.
Autumn note #7 — leaves, weather, and city recorded.
Autumn note #8 — leaves, weather, and city recorded.
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
import { HbButtonComponent, HbMessageScrollerImports } from '@herbst/ui';
@Component({
selector: 'hb-demo-message-scroller-basic',
imports: [HbMessageScrollerImports, HbButtonComponent],
template: `
<div class="flex w-full max-w-md flex-col gap-2">
<hb-message-scroller hbAutoScroll class="h-64 rounded-md border border-border">
<hb-message-scroller-viewport>
<hb-message-scroller-content class="flex flex-col gap-2 p-3">
@for (line of lines(); track $index) {
<hb-message-scroller-item [hbMessageId]="'m-' + $index">
<div class="w-fit rounded-lg bg-muted px-3 py-2 text-sm">{{ line }}</div>
</hb-message-scroller-item>
}
</hb-message-scroller-content>
</hb-message-scroller-viewport>
<hb-message-scroller-button />
</hb-message-scroller>
<button hb-button hbSize="sm" class="self-start" (click)="send()">Send message</button>
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HbDemoMessageScrollerBasicComponent {
protected readonly lines = signal(
Array.from(
{ length: 8 },
(_, i) => `Autumn note #${i + 1} — leaves, weather, and city recorded.`,
),
);
protected send(): void {
this.lines.update((list) => [...list, `New note #${list.length + 1} just added.`]);
}
}
Controles programáticos e âncoras
Message #1
Message #2
Message #3
Message #4
Message #5
Message #6
Message #7
Message #8
Message #9
Message #10 · anchor
Message #11
Message #12
Message #13
Message #14
Message #15
Message #16
atBottom: true
Referência de API
hb-message-scroller
| Propriedade | Descrição | Tipo | Padrão |
|---|---|---|---|
| [hbAutoScroll] | Mantém a visão fixada no fim conforme chega conteúdo novo — até o usuário rolar para cima. | boolean | true |
| [hbDefaultScrollPosition] | Onde parar na primeira renderização: no fim, no início, ou no último item ancorado. | 'end' | 'start' | 'last-anchor' | 'end' |
| [hbScrollPreviousItemPeek] | Pixels do item anterior a deixar visíveis ao rolar para uma mensagem ou âncora. | number | 0 |
| exportAs "hbMessageScroller" | Referencie a instância para chamar scrollToEnd(), scrollToStart(), scrollToMessage(id), e ler os signals atBottom(), scrollableStart(), scrollableEnd(). | methods / signals | — |
Parts
| Propriedade | Descrição | Tipo | Padrão |
|---|---|---|---|
| hb-message-scroller-viewport | A região rolável. Deve envolver o conteúdo e conduz o rastreamento de rolagem. | component | — |
| hb-message-scroller-content | O wrapper interno cujo tamanho é observado para disparar o auto-scroll. | component | — |
| hb-message-scroller-item [hbMessageId] [hbScrollAnchor] | Envolve cada mensagem; o id é o alvo de scrollToMessage, e hbScrollAnchor marca-o para o posicionamento last-anchor. | string / boolean | '' / false |
| hb-message-scroller-button [hbIcon] | Um botão flutuante de ir-para-o-mais-recente, mostrado apenas quando há conteúdo abaixo. hbIcon define o nome do ícone. | string | 'phosphorCaretDown' |