Input OTP
Yazmayı, yapıştırmayı ve SMS otomatik doldurmayı kabul eden tek kullanımlık kod slotları; kodları basamaklayarak getiren isteğe bağlı bir animasyon ve doğrulama için bir durum içerir.
Type or paste 123456 to pass. Anything else fails.
pnpm dlx shadcn@latest add https://hextaui.com/r/input-otp.jsonBileşeni, HextaUI tema token'larını ve bileşenin bağımlı olduğu tüm HextaUI bileşenlerini ekler.
Henüz eklemediyseniz tema token'larını global CSS'inize ekleyin.
Bağımlılıkları yükleyin.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/input-otp.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Her karakter için bir <InputOTPSlot /> render edin ve length değerini aynı sayıya ayarlayın. Slotlar konumlarını kendileri bulur; bu yüzden senkron tutulacak bir index prop'u yoktur.
Birleşik
Varsayılan görünüm. Her <InputOTPGroup /> slotlarını paylaşılan kenarlarla tek bir şeritte birleştirir.
Ayrı
variant="separate" her slota aralarında boşluk olan kendi yuvarlak kutusunu verir.
Boyutlar
sm, default ve lg girdi ve düğme yükseklikleriyle eşleşir. Dokunmatik ekranlarda her boyut 16px yazı tipiyle en az 44px'e büyür.
Animasyonlu
animated varsayılan olarak kapalıdır. Açıkken yazılan karakterler yükselerek girer, silinenler kalanlar kayarken batarak çıkar ve otomatik doldurma, yapıştırma veya kendi state'inizden gelen tam bir kod slot slot basamaklanarak gelir. Basamaklamayı görmek için Fill code'a basın.
Durum
status kodu denetlemenin sonucunu gösterir. loading slotları kilitler ve alanı meşgul işaretler, error her slotu geçersiz işaretler ve success kenarları yeşile çevirir. Her biri duyurulur. animated ile loading bir dalga çalıştırır, error bir kez sarsılır ve success karakterleri pop ettirir.
Kontrollü
value ve onValueChange geçin. Değer her zaman filtrelenmiş koddur ve asla length'ten uzun olmaz.
Form
Bir name ile kod formla birlikte gönderilir. autoSubmit son slot dolar dolmaz gönderir; böylece otomatik doldurulan bir kod, kişileri bir dokunuş daha gerekmeden oturum açtırır.
Field ile
Bir <Field /> içinde etiket, açıklama ve hata sizin için bağlanır. Hatayı görmek için 000000 dışında bir şey girin.
Geçersiz
Kökteki aria-invalid her slotu işaretler. Mesajı aria-describedby ile bağlayın.
Harfler ve sayılar
validationType="alphanumeric" kurtarma ve davet kodlarını kabul eder, normalizeValue ise yazılırken veya yapıştırılırken onları büyük harfe çevirir.
Maskeli
mask PIN'ler için her karakteri gizler. Değer tek kullanımlık bir kod değilse otomatik doldurmayı autoComplete="off" ile kapatın.
Özel ayırıcı
Slotları istediğiniz gibi gruplayın ve <InputOTPSeparator /> bileşenine kendi simgenizi geçin.
Devre dışı
Devre dışı bir alana odaklanılamaz ve düzenlenemez.
Sağdan sola
Slotlar sağdan dolar ve ok tuşları gördüğünüzü izler. İlkinden sonraki slotlara çevrilmiş bir aria-label verin. Sağdan sola bir sayfada kodu soldan sağa tutmak için alanda dir="ltr" ayarlayın.
| Tuş | Action |
|---|---|
| Tab | Odağı alana, ilk boş slota taşır ve tekrar dışarı çıkarır. Tab sırasında yalnızca bir slot vardır. |
| ←→ | Önceki veya sonraki slota geçer; sağdan sola düzenlerde görsel sırayla. |
| Home↑ | İlk slota geçer. |
| End↓ | Son karakterden sonraki slota geçer. |
| Backspace | Slottaki karakteri siler; slot boşsa öncekini siler. Sonraki karakterler geri kayar. |
| Delete | Slottaki karakteri siler ve odağı orada tutar. |
| CtrlBackspace | Kodun tamamını temizler. macOS'ta ⌘ Backspace. |
| CtrlA | Kodun tamamını seçer (macOS'ta ⌘ A). Backspace veya Delete sonra onu temizler ve ilk slota döner, yazmak veya yapıştırmak onu değiştirir ve Ctrl C hepsini kopyalar. Başka herhangi bir tuş veya tıklama seçimi sonlandırır. |
- Her slot gerçek bir girdidir. İlki adını
<label>bileşeninizden veyaaria-label'dan alır; diğerleri "Character 2 of 6" gibi adlandırılır. Çevirmek için bir slottaaria-labelgeçin. - İlk slotta
autocomplete="one-time-code"bulunur; böylece iOS ve macOS Mesajlar ve Mail'den kodlar sunar, Android SMS kodları sunar ve parola yöneticileri onu doldurabilir. Tek bir slota düşen tam bir kod hepsine dağıtılır. Animasyonlu basamaklama, WebOTP API'sinden ayarladığınız kodlar dahil her kaynak için çalışır. - Bir slot odaktayken kod boşaldığında, örneğin yanlış bir kod temizlendikten sonra, odak ilk slota geri döner; böylece bir sonraki deneme doğru yerden başlar.
statusayarlandığında alanın yanındaki gizli bir canlı bölge bunu duyurur. SözcükleriloadingLabel,successLabelveerrorLabelile değiştirin.animatedile karakterler ekran okuyuculardan gizli bir katmanda çizilir, girdiler ise gerçek değeri tutar. Azaltılmış harekette karakterler yalnızca solar ve durum dalgası hafif bir nabza dönüşür.
Base UI OTP field üzerine kuruludur. Her Base UI prop'u aktarılır.
| Prop | Tür | Varsayılan |
|---|---|---|
lengthZorunlu. Slot sayısı; aynı sayıda InputOTPSlot parçası render edin. | number | – |
variant | "joined" | "separate" | "joined" |
size | "sm" | "default" | "lg" | "default" |
animatedKarakterleri animasyonla girip çıkarın, çok karakterli girdiyi basamaklandırın ve durumu animasyonlayın. | boolean | false |
statusKodu denetlemenin sonucu. Loading slotları salt okunur yapar. | "idle" | "loading" | "success" | "error" | – |
loadingLabel | string | "Verifying code" |
successLabel | string | "Code verified" |
errorLabel | string | "Code is incorrect" |
value | string | – |
defaultValue | string | – |
onValueChange | (value: string, details) => void | – |
onValueCompleteSon slot dolduğunda çağrılır. | (value: string, details) => void | – |
onValueInvalidYazılan veya yapıştırılan karakterler reddedildiğinde çağrılır. | (value: string, details) => void | – |
validationType | "numeric" | "alpha" | "alphanumeric" | "none" | "numeric" |
normalizeValueFiltrelemeden sonra çalışır. İdempotent tutun. | (value: string) => string | – |
inputModeVarsayılan olarak validationType'tan gelir. | string | – |
autoComplete | string | "one-time-code" |
autoSubmit | boolean | false |
mask | boolean | false |
aria-invalidHer slotu geçersiz olarak işaretler. | boolean | – |
name | string | – |
form | string | – |
idİlk slota gider; böylece bir etiketin htmlFor'u ona işaret eder. | string | – |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-otp" | Kök. |
data-variant="joined" | "separate" | Geçerli varyant. |
data-size | Geçerli boyut. |
data-status | Ayarlıysa durum. |
data-animated | animated açıkken bulunur. |
data-shake | Durum error olduktan sonra alan sarsılırken bulunur. |
data-complete | Her slot doluyken bulunur. |
data-filled | Herhangi bir slot doluyken bulunur. |
data-focused | Bir slot odaktayken bulunur. |
data-disabled | Devre dışıyken bulunur. |
data-readonly | Yükleme dahil salt okunur olduğunda bulunur. |
data-required | Zorunlu olduğunda bulunur. |
data-invalid / data-valid / data-touched / data-dirty | Bir Field içinde alan state'i. |
data-slot="input-otp-status" | Kökün kardeşi olan gizli canlı bölge. |
Bir dizi slotu düzenleyen düz bir öğe. Birleşik variant'ta slotlar kenarları paylaşır.
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-otp-group" | CSS'te grubu hedefleyin. |
Tek bir girdi tutan bir kutu. className kutuya gider; diğer tüm prop'lar girdiye gider.
| Prop | Tür | Varsayılan |
|---|---|---|
aria-labelEtiketi kullanan ilk slotta yok sayılır. | string | "Character N of M" |
classNameState slotun dizinini, değerini, filled'ı ve alan durumunu içerir. | string | (state) => string | – |
placeholder | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-otp-slot" | Kutu. |
data-filled | Slotta bir karakter olduğunda bulunur. |
data-status | Boşta değilse kökün durumu. |
--input-otp-index | Durum hareketini kademelendirmek için kullanılan slot konumu. |
data-slot="input-otp-input" | İçindeki girdi; Base UI'ın data-filled, data-focused, data-complete ve field nitelikleriyle. |
data-slot="input-otp-char" | animated olduğunda çizilen karakter. |
Eksi simgeli bir ayırıcı. Başka bir simge kullanmak için alt öğe geçin.
| Prop | Tür | Varsayılan |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-otp-separator" | CSS'te ayırıcıyı hedefleyin. |
Bir slotun ve bir grubun arkasındaki sınıf adları (inputOTPGroupVariants). Bunları { variant, size } ile çağırın.
- MotionHer bileşenin kullandığı yumuşatma eğrileri, süreler ve azaltılmış hareket denetimi; ayrıca boyut dönüşümleri ve kayan vurgular için hook'lar.
- CalendarTekli, aralık ve çoklu seçim için, kayan aylar, aralık önizlemeleri ve dokunmaya uygun boyutta günler içeren bir tarih ızgarası.
- Checkboxİşareti çizilerek beliren, belirsiz üst öğeleri, grupları ve hover durumunu paylaşan etiketleri olan bir onay kutusu.
- ComboboxÇipler, gruplar ve asenkron sonuçlar içeren, siz yazdıkça boyutu değişen bir açılır pencerede filtrelenebilir bir select.
- Date pickerTek tarihler ve aralıklar için takvimi bir popover içinde, telefonlarda ise alt sayfa olarak açan bir düğme.
- FieldKontrolüne bağlanmış etiketler, açıklamalar ve hatalar; doğrulama durumları ve formlar için düzenler içerir.
Kullanıldığı bloklar
Input OTP üzerine kurulan bloklar.
- ProfileBir yapay zeka ürününün ayarlarındaki Profil bölümü. Fotoğrafı daire içine kırpın, siz yazarken kontrol edilen bir kullanıcı adı seçin, yeni e-postayı 6 haneli bir kodla onaylayın, siteyi tanıyan bağlantılar ekleyin ve başkalarının sizi nasıl gördüğünü canlı bir kartta izleyin.
- SecurityBir yapay zeka ürünü için oturumlar ve güvenlik. Satırları animasyonla kaldıran oturum kapatmalı etkin cihazlar, canlı güç ölçerli parola değişikliği, gerçek QR kodlu iki aşamalı doğrulama kurulumu, 6 haneli bir kontrol ve indirilebilir kurtarma kodları, WebAuthn ile passkey'ler ve yazılı onayla korunan hesap silme.