Get StartedFoundationsComponentsPatternsRulesDevelopAI & ToolsUpdates

Text Field

라벨, 설명, 에러 메시지, 글자 수와 함께 텍스트를 입력받는 컴포넌트예요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/text-field.json

Anatomy

Text Field는 Header, Input, Footer 세 영역으로 구성돼요.

  • Header: Label, Requirement Mark(필수 표시) 또는 Indicator Text(선택 표시), 필요하면 오른쪽 Suffix Slot에 보조 액션이 들어가요.
  • Input: 입력 필드와 이를 감싸는 Container로 구성되며, 앞뒤에 Prefix/Suffix Slot(텍스트 또는 아이콘)을 둘 수 있어요. 한 줄 입력은 TextFieldInput, 여러 줄 입력은 TextFieldTextarea 를 넣어요.
  • Footer: 왼쪽에 Helper Text(설명)와 Error Message, 오른쪽에 Character Count가 위치해요.
<TextField label="라벨" description="설명" maxGraphemeCount={20}>
  <TextFieldInput placeholder="플레이스홀더" />
</TextField>

Properties

Variant

Outline과 Underline 두 가지 스타일을 제공해요. 화면에 입력 필드가 하나뿐이라면 Underline 사용을 권장해요.

Size

Large(기본값)와 Medium 두 가지 크기를 제공해요. responsive 는 화면 너비에 따라 크기가 자동으로 바뀌어요. 1280px 미만에서는 Large, 1280px 이상에서는 Medium으로 보여서 여러 화면 너비를 함께 지원하는 서비스에 알맞아요.

State

Enabled, Focused, Error, Error Focused, Disabled, Read Only 상태를 가져요. 포커스되면 테두리가 진해지고, 에러 상태에서는 포커스와 관계없이 빨간 테두리를 보여줘요. Underline의 Read Only는 값을 흐린 색으로 보여줘요.

Prefix & Suffix

입력 영역 앞뒤에 단위나 아이콘을 붙일 수 있어요. prefix/suffix 에는 텍스트를, prefixIcon/suffixIcon 에는 아이콘을 넣어요.

아이콘만으로 맥락을 전달하지 않도록 주의해요. label 이나 description 에 아이콘의 의미를 텍스트로 적거나, 의미가 있는 아이콘에는 aria-label 을 지정해요.

Label은 Medium(기본값)과 Bold 두 가지 Weight를 제공해요. Label 텍스트는 명사형으로 쓰고 마침표를 붙이지 않으며, 한 줄로 표현하는 게 좋아요. 꼭 필요한 경우에만 두 줄까지 사용해요.

Label 오른쪽에 필수 입력 여부를 표시할 수 있어요. 필수 값은 showRequiredIndicator 로 Requirement Mark를, 선택 값은 indicator 로 텍스트를 보여줘요.

Footer 왼쪽에는 Helper Text와 Error Message가 위치해요. 두 메시지가 동시에 있으면 Error Message만 보여주고, Helper Text는 화면에서 숨긴 채 스크린 리더에만 남겨요. 메시지는 행동을 안내하는 문장으로 간결하게 써요. (예: "휴대폰 번호 10-11자리로 입력해 주세요.")

Character Count

maxGraphemeCount 를 지정하면 Footer 오른쪽에 글자 수를 보여줘요. 이모지나 조합 문자도 사람이 보는 한 글자로 세요. 값이 있으면 Neutral 색으로, 비어 있으면 흐린 색으로, 에러 상태에서는 Critical 색으로 표시돼요. 입력 길이에 제한이 있을 때만 사용해요.

기본적으로 최대 글자 수를 넘겨도 입력을 막지 않아요. 넘치는 입력을 자르려면 onValueChange 의 slicedValue 를 value 로 넘겨요.

Textarea

여러 줄의 텍스트는 TextFieldTextarea 로 입력받아요. 기본으로 입력한 만큼 높이가 자동으로 늘어나고, 최소 높이는 3줄 정도를 유지해요. 최대 높이는 기본적으로 제한이 없으며 필요하면 따로 지정할 수 있어요.

autoresize={false} 로 자동 높이 조절을 끄면 최대 높이를 꼭 지정해요. 내용이 최대 높이를 넘으면 입력 영역 안에서 스크롤돼요.

Textarea도 Large와 Medium 크기를 제공해요. Large는 최소 94px, Medium은 최소 82px 높이를 가져요.

Guidelines

Variant 선택

화면에 입력 필드가 하나뿐인 경우 Underline을 사용해요. 여러 필드가 모인 Form에서는 Outline을 사용해 각 필드의 영역을 명확하게 보여줘요.

동네 이름
Do· 단일 입력은 Underline

화면에 하나의 Input만 있으면 Underline Variant를 사용해요.

동네 이름
Don't· 단일 입력에 Outline

입력 필드가 하나뿐인 화면에서는 Outline이 불필요하게 무거워 보여요.

필수 입력 여부 표시하기

한 화면에서 필드의 2/3 이상이 필수 항목이면 선택 항목에만 '선택' 을 표시하고, 그렇지 않으면 필수 항목에만 Requirement Mark(*)를 표시해요. 한 Form 안에서 두 표기법을 섞어 쓰지 않아요.

이름 *연락처 *
Do· 한 가지 표기만

한 Form 안에서는 같은 표기법을 사용해요.

이름 *소개 선택
Don't· 표기법 혼용

Requirement Mark와 '선택' 텍스트를 함께 쓰면 헷갈려요.

형식이 정해진 값은 한 번에 입력받기

주민등록번호나 전화번호처럼 입력 형식이 정해진 값은 Input을 여러 개로 나누지 말고, 하나의 Input에서 값에 포맷을 자동으로 적용해 추가 인터랙션 없이 한 번에 입력할 수 있게 해요. 특수한 포맷이나 마스킹이 필요하면 onValueChange 에서 값을 가공해 value 로 넘겨요.

2열로 구성하기

한 화면에서 입력할 내용이 많으면 Text Field를 2열로 배치할 수 있어요. 라벨과 입력값이 짧을 때만 사용하고, 사용자가 실수로 옆 필드를 누르지 않도록 사이 간격을 충분히 확보해요.

검증(Validation)

검증은 두 가지 방식을 상황에 맞게 섞어 써요. 필수 값이나 글자 수처럼 단순한 검증은 인라인으로, 비즈니스 로직이나 서버 규칙은 제출할 때 검증해요. 보안이나 금융 정보처럼 잘못 입력할 위험이 큰 필드는 즉시 피드백을 주는 인라인 검증을 권장해요.

  • 제출 시 검증: Submit 버튼을 누르면 전체 필드를 검증해요. 기본으로 이 방식을 사용해요.
  • 인라인 검증: 포커스가 떠날 때(blur)나 값이 바뀔 때마다 필드 단위로 검증해요. 필드가 많아 오류가 쌓이는 것을 막아야 할 때 사용해요.

이탈 시 안내

작성·수정 화면에서 벗어나려 할 때는 입력한 값이 사라질 수 있다는 안내를 Alert Dialog 등으로 보여줘요. 값이 바뀌지 않았거나 자동 저장 기능이 있다면 안내를 생략해도 돼요.

Props

TextField

Prop

Type

TextFieldInput

<input> 의 속성을 그대로 받아요. value, disabled, readOnly 같은 상태는 TextField 에서 지정해요.

TextFieldTextarea

Prop

Type

On this page