ChatInput
ChatInput은 AI 채팅 인터페이스를 위해 설계된 복합 텍스트 입력 컴포넌트입니다. 자동 리사이즈, 전송/중지 버튼, 로딩 상태를 하나의 단위로 관리합니다.
Playground
<ChatInput onSubmit={(value) => console.log(value)}>
<ChatInputField placeholder="Ask me anything..." />
<ChatInputSubmit />
</ChatInput>Variants
Sizes
smdefaultlg| Size | 버튼 | 폰트 | 패딩 | 미리보기 | |
|---|---|---|---|---|---|
sm | 28px | 14px | 10px / 12px | ||
default | 32px | 14px | 12px / 16px | ||
lg | 36px | 16px | 16px / 20px | ||
Features
Auto Resize
입력 내용에 따라 텍스트 영역의 높이가 자동으로 조정됩니다. maxRows로 최대 줄 수를 제한할 수 있습니다.
<ChatInput onSubmit={(value) => console.log(value)}>
<ChatInputField
placeholder="Type multiple lines (Shift+Enter for newline)..."
maxRows={5}
/>
<ChatInputSubmit />
</ChatInput>Character Count
showCount와 maxLength를 함께 사용하면 우측 하단에 실시간 문자 수 카운터가 표시됩니다.
<ChatInput onSubmit={(value) => console.log(value)}>
<ChatInputField
placeholder="Ask me anything..."
showCount
maxLength={500}
/>
<ChatInputSubmit />
</ChatInput>Loading State
loading=true로 설정하면 버튼이 중지 아이콘으로 전환됩니다. 버튼은 활성 상태를 유지해 사용자가 중단할 수 있습니다.
<ChatInput onSubmit={(value) => console.log(value)}>
<ChatInputField placeholder="Response generating..." />
<ChatInputSubmit loading onStop={() => console.log('stopped')} />
</ChatInput>Filled Variant
variant="filled"는 배경색 스타일로, 입력창이 배경에 묻히는 채팅 화면에 적합합니다.
<ChatInput variant="filled" onSubmit={(value) => console.log(value)}>
<ChatInputField placeholder="Ask me anything..." />
<ChatInputSubmit />
</ChatInput>Disabled
disabled=true로 입력과 전송을 동시에 비활성화합니다. 불투명도 감소로 상태를 시각적으로 전달합니다.
<ChatInput disabled onSubmit={(value) => console.log(value)}>
<ChatInputField placeholder="Currently unavailable..." />
<ChatInputSubmit />
</ChatInput>Customization
ChatInputSubmit의 children prop으로 기본 전송 아이콘을 자유롭게 교체할 수 있습니다.
커스텀 아이콘
<ChatInputSubmit>
<ArrowUp className="icon-xs" />
</ChatInputSubmit>보이스 입력 스타일
<ChatInputSubmit>
<Mic className="icon-xs" />
</ChatInputSubmit>API
Component Structure
ChatInput— Compound · Pure ReactChatInput컨텍스트 프로바이더 + 컨테이너ChatInputField자동 리사이즈 텍스트 영역ChatInputSubmit전송 / 중지 버튼서브컴포넌트 구성. ChatInput(루트), ChatInputField(텍스트 영역), ChatInputSubmit(전송 버튼)으로 구성됩니다.
Props
ChatInput
variant"outline""outline" | "filled"시각 스타일. outline(테두리), filled(배경색)
size"default""sm" | "default" | "lg"사이즈 스케일. sm, default, lg
radius"xl""sm" | "md" | "lg" | "xl" | "2xl" | "full"컨테이너 모서리 둥글기
color"default""default" | "primary"전송 버튼 색상. default(어두운 색), primary(브랜드 색상)
layout"default""default" | "inline"레이아웃 방향. default(세로 배치), inline(입력 필드와 버튼 가로 배치)
disabledfalseboolean입력과 전송을 동시에 비활성화합니다
onSubmitundefined(value: string) => void전송 콜백. 현재 텍스트 값을 인수로 받습니다.
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
variant | "outline" | "filled" | "outline" | 시각 스타일. outline(테두리), filled(배경색) |
size | "sm" | "default" | "lg" | "default" | 사이즈 스케일. sm, default, lg |
radius | "sm" | "md" | "lg" | "xl" | "2xl" | "full" | "xl" | 컨테이너 모서리 둥글기 |
color | "default" | "primary" | "default" | 전송 버튼 색상. default(어두운 색), primary(브랜드 색상) |
layout | "default" | "inline" | "default" | 레이아웃 방향. default(세로 배치), inline(입력 필드와 버튼 가로 배치) |
disabled | boolean | false | 입력과 전송을 동시에 비활성화합니다 |
onSubmit | (value: string) => void | undefined | 전송 콜백. 현재 텍스트 값을 인수로 받습니다. |
className | string | undefined | 추가 CSS 클래스 |
ChatInputField
maxRows8number최대 표시 줄 수 (초과 시 스크롤)
showCountfalseboolean문자 수 카운터 표시. maxLength 필수.
maxLengthundefinednumber최대 입력 문자 수
placeholderundefinedstring빈 상태에서 표시되는 힌트 텍스트
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
maxRows | number | 8 | 최대 표시 줄 수 (초과 시 스크롤) |
showCount | boolean | false | 문자 수 카운터 표시. maxLength 필수. |
maxLength | number | undefined | 최대 입력 문자 수 |
placeholder | string | undefined | 빈 상태에서 표시되는 힌트 텍스트 |
className | string | undefined | 추가 CSS 클래스 |
ChatInputSubmit
loadingfalseboolean중지 아이콘으로 전환. 버튼은 활성 상태 유지.
onStopundefined() => void로딩 상태에서 클릭 시 호출되는 콜백
buttonRadiusundefined"sm" | "md" | "lg" | "xl" | "2xl" | "full"버튼 모서리 둥글기 직접 지정 (미지정 시 컨테이너 radius에서 자동 산출)
childrenundefinedReactNode커스텀 아이콘. 기본값은 전송 아이콘.
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
loading | boolean | false | 중지 아이콘으로 전환. 버튼은 활성 상태 유지. |
onStop | () => void | undefined | 로딩 상태에서 클릭 시 호출되는 콜백 |
buttonRadius | "sm" | "md" | "lg" | "xl" | "2xl" | "full" | undefined | 버튼 모서리 둥글기 직접 지정 (미지정 시 컨테이너 radius에서 자동 산출) |
children | ReactNode | undefined | 커스텀 아이콘. 기본값은 전송 아이콘. |
className | string | undefined | 추가 CSS 클래스 |
Anatomy
Best Practices
권장
- ✓비동기 전송 시 onSubmit에서 로딩 상태를 관리합니다
- ✓maxRows로 높이 증가를 제한합니다
- ✓명확한 placeholder로 용도를 안내합니다
지양
- ✗uncontrolled 모드에서 onSubmit 외부에서 값을 변경하지 않습니다
- ✗loading과 disabled를 함께 사용하지 않습니다
- ✗일반 폼에는 사용하지 않습니다. Textarea를 대신 사용하세요
Accessibility
키보드 조작
ARIA / WCAG
- textarea 요소. 스크린 리더가 정확히 읽어냅니다.
- 전송 버튼에 aria-label 자동 설정 (전송 / 중지)
- disabled 상태를 시각적으로 구별 (불투명도 감소)