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

PropriedadeDescriçãoTipoPadrã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

PropriedadeDescriçãoTipoPadrã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'