@olundot/ui · Inputs
OTPField
고정 길이 숫자 인증 코드를 자리별로 입력하고 완료 시점을 감지하는 필드입니다.
- 필수 props
- `label`은 필수이며 `length` 기본값은 6입니다.
- value
- controlled value와 defaultValue를 모두 지원합니다.
- callback props
- `onValueChange`는 매 입력마다, `onComplete`는 길이가 채워졌을 때 호출합니다.
- fluid
- `fluid`는 좁은 폭에서 숫자 칸을 줄여 6자리를 한 줄로 유지합니다.
기본
6자리 숫자 코드코드 보기tsx
import { OTPField } from "@olundot/ui";
export function VerificationCodeField() {
return (
<OTPField surface="canvas"
label="인증 코드"
name="verificationCode"
helperText="문자로 받은 6자리 숫자를 입력합니다."
/>
);
}좁은 폭
모바일 폭에서 한 줄 유지코드 보기tsx
import { OTPField } from "@olundot/ui";
export function FluidVerificationCodeField() {
return (
<div className="w-full max-w-[320px]">
<OTPField
surface="canvas"
fluid
label="모바일 인증 코드"
name="mobileVerificationCode"
helperText="좁은 화면에서도 6칸을 한 줄로 유지합니다."
/>
</div>
);
}제어 값
value와 callback props코드를 기다리는 중
코드 보기tsx
import { useState } from "react";
import { OTPField } from "@olundot/ui";
export function ControlledVerificationCodeField() {
const [code, setCode] = useState("");
const [completeCode, setCompleteCode] = useState("");
return (
<div className="grid gap-2">
<OTPField surface="canvas"
label="보안 코드"
name="securityCode"
value={code}
onValueChange={setCode}
onComplete={setCompleteCode}
helperText="코드가 모두 채워지면 확인 단계로 이동할 수 있습니다."
/>
<p className="text-sm text-text-tertiary">
{completeCode ? `입력 완료: ${completeCode}` : "코드를 기다리는 중"}
</p>
</div>
);
}상태
오류, 비활성, 4자리 코드코드 보기tsx
import { OTPField } from "@olundot/ui";
export function OTPFieldStates() {
return (
<div className="grid gap-5">
<OTPField surface="canvas"
label="초대 코드"
length={4}
defaultValue="12"
errorText="4자리 코드를 모두 입력합니다."
invalid
/>
<OTPField surface="canvas"
label="시험 입장 코드"
defaultValue="482913"
helperText="응시 시작 전 감독관이 발급한 코드입니다."
readOnly
/>
</div>
);
}