Input
텍스트 입력을 받는 인풋 컴포넌트입니다.
개요
Input은 사용자로부터 텍스트 정보를 입력받는 기본 폼 요소입니다. 다양한 타입과 상태를 지원하며, 아이콘과 함께 사용할 수 있습니다.
주요 특징:
- 다양한 Type (text, password, email, number, tel, url 등)
- 4가지 State (default, focus, error, disabled)
- 아이콘 지원 (prefix, suffix)
- Clear 버튼
- 비밀번호 표시/숨기기
사용 사례:
- 로그인/회원가입 폼
- 검색 입력
- 설정 값 입력
- 데이터 필터링
설치
npx @vortex/cli add input --package foundation기본 사용법
import { Input } from "@vortex/ui-foundation";
export default function Example() {
return <Input placeholder="Enter text..." />;
}Types (타입)
Text (기본)
<Input type="text" placeholder="이름을 입력하세요" />Password
<Input type="password" placeholder="비밀번호를 입력하세요" /><Input type="email" placeholder="이메일을 입력하세요" />Number
<Input type="number" placeholder="숫자를 입력하세요" />Tel
<Input type="tel" placeholder="전화번호를 입력하세요" />URL
<Input type="url" placeholder="URL을 입력하세요" />States (상태)
Default
<Input placeholder="기본 상태" />Focus
<Input placeholder="포커스 시 강조" autoFocus />Error
<Input
placeholder="에러 상태"
error
errorMessage="올바른 이메일을 입력해주세요"
/>Disabled
<Input placeholder="비활성화 상태" disabled />아이콘
Prefix Icon
import { Search } from "lucide-react";
<Input placeholder="검색..." prefix={<Search size={16} />} />;Suffix Icon
import { Mail } from "lucide-react";
<Input type="email" placeholder="이메일 입력" suffix={<Mail size={16} />} />;Clear 버튼
<Input
placeholder="검색어 입력"
clearable
onClear={() => console.log("cleared")}
/>비밀번호 표시/숨기기
<Input type="password" placeholder="비밀번호" showPasswordToggle />Props API
| Prop | Type | Default | Description |
|---|---|---|---|
| type | ’text’ | ‘password’ | ‘email’ | ‘number’ | ‘tel’ | ‘url' | 'text’ | 인풋 타입 |
| placeholder | string | - | 플레이스홀더 텍스트 |
| value | string | - | 입력 값 |
| defaultValue | string | - | 기본 입력 값 |
| disabled | boolean | false | 비활성화 상태 |
| error | boolean | false | 에러 상태 |
| errorMessage | string | - | 에러 메시지 |
| prefix | ReactNode | - | Prefix 아이콘 |
| suffix | ReactNode | - | Suffix 아이콘 |
| clearable | boolean | false | Clear 버튼 표시 |
| showPasswordToggle | boolean | false | 비밀번호 토글 버튼 |
| onChange | (value: string) => void | - | 값 변경 핸들러 |
| onClear | () => void | - | Clear 버튼 클릭 핸들러 |
| className | string | - | 추가 CSS 클래스 |
접근성
Input 컴포넌트는 WCAG 2.1 AA 기준을 준수합니다.
ARIA 속성:
aria-label또는<label>연결 (필수)aria-invalid="true"(에러 상태)aria-describedby(에러 메시지 연결)
키보드 네비게이션:
Tab: 다음 요소로 포커스 이동Shift + Tab: 이전 요소로 포커스 이동
스크린 리더 지원:
- Label 텍스트 읽힘
- Placeholder 안내
- 에러 메시지 읽힘
예제
예제 1: 로그인 폼
export default function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
return (
<form className="space-y-md">
<div>
<label htmlFor="email">이메일</label>
<Input
id="email"
type="email"
placeholder="이메일을 입력하세요"
value={email}
onChange={setEmail}
/>
</div>
<div>
<label htmlFor="password">비밀번호</label>
<Input
id="password"
type="password"
placeholder="비밀번호를 입력하세요"
value={password}
onChange={setPassword}
showPasswordToggle
/>
</div>
<Button type="submit">로그인</Button>
</form>
);
}예제 2: 검색 입력
import { Search, X } from "lucide-react";
export default function SearchInput() {
const [query, setQuery] = useState("");
return (
<Input
placeholder="검색어를 입력하세요"
value={query}
onChange={setQuery}
prefix={<Search size={16} />}
clearable
onClear={() => setQuery("")}
/>
);
}예제 3: 폼 검증
export default function ValidatedInput() {
const [email, setEmail] = useState("");
const [error, setError] = useState("");
const validate = (value: string) => {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(value)) {
setError("올바른 이메일 형식이 아닙니다");
} else {
setError("");
}
};
return (
<Input
type="email"
placeholder="이메일 입력"
value={email}
onChange={(value) => {
setEmail(value);
validate(value);
}}
error={!!error}
errorMessage={error}
/>
);
}관련 컴포넌트
Last updated on