ComponentsP3 본문

ChatThread

GPT-5식 대화 스레드 컨테이너 — ChatMessage를 세로로 쌓는 스크롤 로그. role=log·aria-live로 새 메시지를 알리고, 내용 변화 시 자동 하단 스크롤(포커스 이동 없음). busy면 aria-busy.

마지막 업데이트 2026-06-25

한눈에#

ChatMessage들을 세로로 쌓는 스크롤 로그입니다. role="log" + aria-live="polite"로 새 메시지를 보조기술에 알리고, 내용이 바뀌면 최신(하단)으로 자동 스크롤합니다(포커스는 옮기지 않고 시각 추적만). 생성 중이면 busyaria-busy를 부여합니다.

나: 디자인 시스템을 새 앱에 어떻게 도입하나요?
어시스턴트: 토큰 패키지를 설치하고 루트에 테마 속성을 주입한 뒤, @wds/ui-web 컴포넌트를 가져다 씁니다.
  • ChatMessage 세로 스택
  • role=log + aria-live=polite
  • 내용 변화 시 자동 하단 스크롤
  • busy → aria-busy

메시지를 추가하면 자동으로 하단까지 스크롤합니다 — 포커스는 이동하지 않습니다

사용 시점#

AI 대화의 메시지 묶음을 담는 컨테이너 — ChatMessage를 자식으로 넣습니다. 단발 메시지 하나면 컨테이너 없이 ChatMessage만으로 충분합니다.

권장 — 이렇게 쓰세요

지양 — 이러지 마세요

나: 디자인 시스템을 새 앱에 어떻게 도입하나요?
어시스턴트: 토큰 패키지를 설치하고 루트에 테마 속성을 주입한 뒤, @wds/ui-web 컴포넌트를 가져다 씁니다.

쓴다여러 턴의 대화 — 자동 스크롤·라이브 안내가 필요할 때

메시지 단위한 턴은 ChatMessage 단독으로

해부#

영역prop설명
메시지childrenChatMessage 노드들
생성 중busyaria-busy 부여(스트리밍 표시)

내용(children)이 바뀔 때마다 최신으로 스크롤합니다 — useEffectscrollTopscrollHeight로 맞춥니다(포커스 비이동). 오류·추천 칩 등은 라이브 이중 낭독을 피하려 이 컨테이너 밖의 형제로 두기를 권장합니다.

API#

Prop타입기본값설명
childrenReactNode메시지들 — ChatMessage 노드.
busybooleanfalse응답 생성 중 — aria-busy를 부여한다.
classNamestring추가 클래스.

접근성#

계약구현
메시지 로그role="log" + aria-live="polite" — 시간순 추가를 polite로 전달(assertive는 읽던 내용을 끊어 부적합)
생성 중busyaria-busy="true" — 스트리밍 중임을 보조기술에 전달
자동 스크롤시각 추적만 — 포커스를 옮기지 않아 키보드 사용자의 위치를 빼앗지 않음
이중 낭독 방지오류 alert·추천 칩은 로그 밖 형제로 두기를 권장(라이브 영역 중복 낭독 회피)