Thinking Indicator
AI가 답을 준비하는 동안 보여 주는 "생각 중" 애니메이션입니다.
AI가 답을 준비하는 동안 보여 주는 "생각 중" 표시입니다. 점으로 이루어진 구슬(Orb), 물결치는 점, 빛이 지나가는 글자 중에서 고를 수 있고, 문구는 "생각하는 중 → 자료를 찾는 중 → 답변을 정리하는 중"처럼 돌아가며 부드럽게 바뀝니다.
Preview
아래 버튼으로 모양, 크기, 구슬의 상태를 바꿔 보세요.
<ThinkingIndicator variant="orb" size="md" orbState="working" />Variants
구슬 orb
점으로 이루어진 구슬이 돌고, 문구 뒤에는 ...만 붙습니다. 가장 AI다운 표시
점 dots
문구 옆에서 점 세 개가 물결칩니다. 채팅 말풍선처럼 작은 자리에
반짝이는 글자 shimmer
글자 위로 빛이 지나갑니다. 아이콘 없이 문구만 쓰고 싶을 때
orb)에는 물결치는 점이 함께 나오지 않습니다. 구슬이 움직임을 맡고, 문구 뒤에는 정적인 ...만 붙습니다. 물결치는 점은 dots 모양에서만 쓰입니다.Orb states
구슬은 9가지 상태가 있고, 상태마다 움직임이 다릅니다. AI가 지금 무엇을 하는지에 맞춰 고르세요.
Sizes
| size | 구슬 크기 | 이럴 때 |
|---|---|---|
sm | 20px | 글줄 안, 버튼 옆처럼 작은 자리 |
md | 32px (기본) | 채팅 응답 자리 |
lg | 64px | 빈 화면 가운데, 아바타 크기의 큰 표시 |
Labels
labels에 문구를 여러 개 주면 정해진 간격(기본 2.6초)으로 돌아가며 바뀌고, 하나만 주면 고정됩니다. 서비스가 하는 일에 맞게 바꾸세요. 문구 뒤의 ...은 자동으로 붙으니 직접 쓰지 않아도 됩니다.
<ThinkingIndicator
labels={["문서를 읽는 중", "근거를 찾는 중", "답변을 작성하는 중"]}
orbState="searching"
interval={2000}
/>
<ThinkingIndicator labels={["잠시만요"]} variant="dots" /> // 고정With the prompt input
응답을 기다리는 동안 대화 영역 끝에 놓고, 답이 오면 지웁니다. AiPromptInput의 pending과 같은 값을 쓰면 됩니다.
{messages.map((m) => <Bubble key={m.id} message={m} />)}
{isPending && <ThinkingIndicator />}
<AiPromptInput onSubmit={ask} pending={isPending} onStop={stop} />ThinkingOrb on its own
구슬만 따로 쓸 수도 있습니다. 로딩 자리를 채우거나 AI의 아바타처럼 놓기에 알맞습니다.
import { ThinkingOrb } from "@/meerkit";
<ThinkingOrb state="searching" size={64} />
<ThinkingOrb state="composing" size={20} speed={1.5} />
<ThinkingOrb state="breathing" size={48} paused />Motion
- 구슬은 점 수십~수백 개를 3D 구 위에 고르게 놓고 상태별로 회전·숨쉬기·비틀림·물결·떨림을 줍니다. 앞쪽 점은 크고 진하게, 뒤쪽 점은 작고 흐리게 그려 입체감이 납니다.
- 점 색은 글자색을 따라가서, 구슬을 놓은 곳의
text-*클래스로 바꿀 수 있습니다 (예:text-brand). - 문구가 바뀔 때는 아래에서 살짝 떠오르며 나타납니다. Meerkit의 다른 움직임과 같은 곡선을 씁니다.
meerkit.config.ts의motion: false이거나 OS에서 "동작 줄이기"를 켰다면 모든 움직임이 멈추고 멈춘 모양과 문구만 보입니다.- 구슬은
canvas한 장에 그리고 화면에서 사라지면 정리되므로 가볍습니다.
Props
ThinkingIndicator
| Prop | Type | 설명 |
|---|---|---|
variant | "orb" | "dots" | "shimmer" | 모양. 기본 orb. |
orbState | OrbState | orb 모양일 때 구슬의 상태. 기본 working. |
labels | string[] | 표시할 문구. 둘 이상이면 돌아가며 바뀝니다. 기본은 "생각하는 중" 등 3개. |
interval | number | 문구가 바뀌는 간격(ms). 기본 2600. |
size | "sm" | "md" | "lg" | 크기. 기본 md. |
className | string | 추가 클래스. |
ThinkingOrb
| Prop | Type | 설명 |
|---|---|---|
state | "working" | "searching" | "solving" | "listening" | "connecting" | "weaving" | "composing" | "breathing" | "shaping" | 구슬의 상태(움직임). 기본 working. |
size | number | 한 변의 크기(px). 기본 32. 20쯤이면 글줄 안, 64쯤이면 채팅 아바타 크기. |
speed | number | 움직임 속도 배율. 기본 1. |
paused | boolean | true면 멈춘 모양으로 그립니다. |
className | string | 추가 클래스. 점 색은 text-* 클래스로 바꿉니다. |
Customization
- 상태별 움직임은
ai/ThinkingOrb.tsx의ORB_STATES값(회전 속도, 숨쉬기, 비틀림, 물결, 떨림 등)을 바꿔 조절합니다. - 기본 문구는
ai/ThinkingIndicator.tsx의DEFAULT_LABELS에서 바꿉니다. - 반짝이는 글자의 색은
muted-foreground와foreground토큰을 따릅니다.
Accessibility
role="status"와aria-live="polite"라서 스크린리더가 현재 문구를 읽어 줍니다. 구슬과 점은 장식이라 숨겨집니다.- 문구는 색과 움직임에만 의존하지 않고 글자로 상태를 알려 줍니다.
작업이 오래 걸리는 경우(수십 초 이상)에는 문구만 돌리지 말고, 어떤 단계인지 알려 주는 문구(예: "문서 3개를 읽는 중")를 서버에서 받아 labels로 넘기면 체감 시간이 줄어듭니다. 단계에 맞춰 orbState도 함께 바꿔 보세요(찾는 중 → searching, 작성 중 → composing).
