Input
Stable사용자가 텍스트를 입력하고 수정할 수 있는 필드입니다.
Overview
Input은 이름, 이메일, 검색어처럼 사용자가 직접 텍스트를 입력할 때 사용합니다. 레이블·도움말·오류 메시지를 함께 제공해 필요한 값과 현재 상태를 알려줍니다.
예약에 사용할 이름을 입력하세요.
현재 값: 없음
<label htmlFor="name">이름</label>
<Input id="name" size="md" placeholder="이름을 입력하세요" aria-describedby="name-help" />
<p id="name-help">예약에 사용할 이름을 입력하세요.</p>placeholder는 입력 예시입니다. 값이 입력되어도 남아 있는 별도 label을 반드시 제공합니다.
Anatomy
5. 도움말 또는 오류 메시지
| 번호 | 구성 요소 | 역할 |
|---|---|---|
| 1 | Label | 필드 이름. htmlFor와 id로 연결 |
| 2 | Container | 크기·경계·배경·포커스 영역 |
| 3 | Value / Placeholder | 입력 값 또는 입력 예시 |
| 4 | Icon · optional | 레이블이 아닌 장식용 보조 아이콘 |
| 5 | Description / Error | aria-describedby로 연결한 도움말·오류 메시지 |
번호는 구성 요소를 식별하며 배치 순서를 고정하지 않습니다. startIcon과 endIcon으로 아이콘을 입력 영역 앞이나 뒤에 둘 수 있습니다. 동작 버튼은 장식용 아이콘 슬롯에 넣지 않습니다.
Variants
원본 Input에는 별도의 시각적 variant prop이 없습니다. 기본형에 아이콘과 네이티브 type을 조합합니다.
Sizes
원본 공통 Component size 9개를 사용합니다. 기본 md는 40px입니다. 터치 영역이 필요한 화면에서는 lg(44px) 이상을 선택합니다.
………………………| Size | Height | Padding X | Font size |
|---|---|---|---|
| xxxs | … | … | … |
| xxs | … | … | … |
| xs | … | … | … |
| sm | … | … | … |
| md | … | … | … |
| lg | … | … | … |
| xl | … | … | … |
| xxl | … | … | … |
| xxxl | … | … | … |
States
Default, Focus, Error, Readonly, Disabled 상태를 지원합니다. 위 Live Preview에서 상태를 바꾸고 Tab으로 실제 포커스를 확인하세요.
Tab으로 포커스를 이동해 보세요.
입력한 값을 확인해 주세요.
값을 확인할 수 있지만 변경할 수 없습니다.
현재 사용할 수 없습니다.
readonly는 포커스와 텍스트 복사가 가능하며 폼 전송에 포함됩니다. disabled는 탭 순서와 폼 전송에서 제외됩니다.
Input 상태 토큰 전체 · 원본 이름과 매핑
| Token | 정의 / 매핑 | 현재 값 |
|---|---|---|
--site-input-default-bg | var(--site-bg-base) | … |
--site-input-default-border | var(--site-line-default) | … |
--site-input-default-text | var(--site-text-muted) | … |
--site-input-default-icon | var(--site-icon-default-color) | … |
--site-input-focus-border | var(--site-line-focus) | … |
--site-input-focus-text | var(--site-text-primary) | … |
--site-input-focus-icon | var(--site-icon-strong-color) | … |
--site-input-error-border | var(--site-line-error) | … |
--site-input-error-text | var(--site-text-error) | … |
--site-input-readonly-bg | var(--site-bg-surface-light) | … |
--site-input-readonly-border | var(--site-line-default) | … |
--site-input-readonly-text | var(--site-text-primary) | … |
--site-input-readonly-icon | var(--site-icon-muted-color) | … |
--site-input-disabled-bg | var(--site-bg-disabled) | … |
--site-input-disabled-border | var(--site-line-default) | … |
--site-input-disabled-text | var(--site-text-on-disabled) | … |
--site-input-disabled-icon | var(--site-icon-muted-color) | … |
Guidelines
권장해요
항상 보이는 레이블과 구체적인 도움말을 제공합니다.
오류에는 aria-invalid와 수정 방법을 설명하는 메시지를 함께 제공합니다.
입력 목적에 맞는 type, autoComplete, inputMode를 사용합니다.
피해주세요
placeholder만으로 레이블을 대신하지 않습니다.
값을 읽기만 해야 할 때 disabled로 정보를 숨기지 않습니다.
여러 줄 입력이나 날짜·체크박스처럼 다른 패턴이 필요한 요소를 텍스트 Input에 억지로 넣지 않습니다.
원본 색상 값을 보존합니다. 오류·placeholder 등의 대비는 사용하는 배경과 글자 크기에 맞게 확인합니다.
API
네이티브 input 속성을 지원합니다. size는 HTML의 문자 수가 아닌 디자인 크기입니다. className은 실제 input, wrapperClassName은 컨테이너에 적용됩니다.
| Prop | Type | Default / 설명 |
|---|---|---|
| size | xxxs | xxs | xs | sm | md | lg | xl | xxl | xxxl | md |
| type | HTML input type | text |
| startIcon / endIcon | ReactNode | 장식용 아이콘, aria-hidden 처리 |
| wrapperClassName | string | 컨테이너 스타일 |
| disabled | boolean | false · 조작 및 폼 전송 제외 |
| readOnly | boolean | false · 값 확인만 허용 |
| aria-invalid | boolean | "true" | "false" | 오류 표시 |
| aria-describedby | string | 도움말·오류 요소의 id |
| id / name | string | 레이블 연결 / 폼 필드 이름 |
| onChange | ChangeEventHandler<HTMLInputElement> | 변경 이벤트 |
| …native props | ComponentProps<"input"> | required, autoComplete 등 |
Code Example
'use client';
import { useState } from 'react';
import { Input } from '@/components/input';
export default function NameField() {
const [name, setName] = useState('');
return (
<div>
<label htmlFor="name">이름</label>
<Input id="name" name="name" autoComplete="name"
value={name} onChange={e => setName(e.target.value)}
aria-describedby="name-help" />
<p id="name-help">예약자 이름을 입력해 주세요.</p>
</div>
);
}