Input group
Simgeler, metin, düğmeler ya da klavye ipucu eklenmiş; tek kenarlık ve odak halkasını paylaşan bir input.
pnpm dlx shadcn@latest add https://hextaui.com/r/input-group.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-group.tsx components/ui/input.tsx components/ui/button.tsx components/ui/number-flow.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Önce <InputGroupInput /> veya <InputGroupTextarea />, ardından ekleri koyun. Ekler kendilerini align ile yerleştirir; böylece alan tab sırasında ve ekran okuyucular için ilk gelir.
Grup alanını izler; bu yüzden akıllı parçalar bağlantı gerektirmez. <InputGroupClear />, <InputGroupPasswordToggle /> ve <InputGroupCount />, kontrollü olsun olmasın, alandan değeri, type'ı ve maxLength'i okur.
Simge
Simgeler kenarlığın içinde iki yanda durur. Bir simgeye tıklamak girdiye odaklanır; böylece tüm grup tek bir alan gibi hissedilir.
Temizle
<InputGroupClear /> bir değer olduğunda solarak belirir. Tarayıcının düzenleme geçmişi aracılığıyla temizler; bu yüzden Cmd+Z metni geri getirir ve onChange'inizi tetikler. Escape de temizler. İkinci bir Escape, çevresindeki diyalog veya popover için bırakılır.
Karakter sayısı
<InputGroupCount /> alanın maxLength değerine göre sayar. Yalnızca değişen basamaklar döner. Sayı sınıra yaklaşırken koyulaşır, sınırda kırmızıya döner ve sınırı aşan bir tuş onu hafifçe sarsar. Ekran okuyucular, alan sınıra yaklaştığında ve ulaştığında bir mesaj duyar; her tuşta duymaz.
Metin
Birimler, para birimleri ve URL parçaları için <InputGroupText /> kullanın. Girdinin dolgusu bir ekin yanında daralır; böylece metin tek bir değer gibi okunur.
Button
<InputGroupButton /> alanın içine sığacak boyutta bir ghost düğmedir. Köşeleri grubunkilerle eş merkezlidir ve kendi odak halkasını alır.
Klavye ipucu
Bir ekin içindeki düz bir <kbd> tuş kapağı olarak stillenir. Yalnızca görsel bir ipucudur; kısayolu kendiniz bağlayın.
Textarea
<InputGroupTextarea /> içeriğiyle birlikte 16rem'e kadar büyür, sonra kayar. Yükseklik satırlar arasında zıplamak yerine yumuşakça değişir. Bir block-end eki altında bir araç çubuğuna dönüşür ve kenarlarındaki düğmeler içinde bulundukları köşenin aynı iç boşluğunu alır.
Üst bilgi
Bir block-start eki alanın üstünde durur. Aralarına ince bir çizgi çizmek için separator ekleyin.
Parola
<InputGroupPasswordToggle /> bir type="password" alanını metne ve geri çevirir. İmleç ve seçim olduğu yerde kalır, fare tıklaması odağı alanda tutar ve form gönderildiğinde parola yeniden gizlenir. revealed ile kontrol edin.
Boyutlar
Gruptaki size yüksekliği belirler ve <Input /> boyutlarıyla eşleşerek girdiye aktarılır. Düğmeler her boyutta eş merkezli köşeleri korur.
Geçersiz
Girdide aria-invalid ayarlayın; odak halkası dahil tüm grup kırmızıya döner. Mesajı aria-describedby ile bağlayın.
Devre dışı
Devre dışı bir girdi tüm grubu soluklaştırır ve üzerinde not-allowed imleci gösterir. Aksi halde kullanılabilir kalacakları için ek düğmelerini de devre dışı bırakın.
Yükleniyor
Satır içi ekler, içerikleri değiştiğinde yeni genişliklerine yumuşakça geçer; böylece bir spinner sonuç sayısına dönüşürken alan asla zıplamaz. Spinner yalnızca harekete izin verildiğinde döner ve role="status" metni duyurur.
Dropdown
Girdinin kapsamını daraltmak için bir <InputGroupButton /> bileşenini dropdown trigger'ı olarak render edin.
Uzun içerik
Uzun değerler grubu genişletmek yerine girdinin içinde kayar. Uzun ek metnini azami genişlikli, kısaltan bir span içine sarın.
Sağdan sola
Ekler, dolgu ve köşe yarıçapları mantıksal kenarlar kullanır; bu yüzden inline-start sağa denk gelir.
| Tuş | Action |
|---|---|
| Tab | Alandan her ek düğmesine kaynak sırasıyla geçer. |
| ShiftTab | Düğmeler ve alan arasında geriye doğru gezinir. |
| Escape | Bir InputGroupClear ile alanı temizler. Zaten boşsa Escape geçip gider. |
- Her alanın bir adı olmalıdır. Görünür bir etiket, bir Field veya
aria-labelkullanın. Simgeler ve ek metni alan adının parçası değildir. - Yalnızca simgeli düğmelere bir
aria-labelverin. - Ek metni bir para birimi veya alan adı gibi anlam taşıyorsa, onu etikete ekleyin veya
aria-describedbyile ona başvurun. <InputGroupClear />Escape aynı işi yaptığı için tab sırasında atlanır. Parola düğmesi tab ile erişilebilir kalır ve aynı adı korur; durumunuaria-pressedbildirir.- Bir gönderim alanı geçersiz bulduğunda grup bir kez sarsılır. Azaltılmış harekette tek ipucu kırmızı kenarlıktır.
- Dokunmatik ekranlarda alan metni en az 16px'tir; böylece telefonlar odaklanıldığında yakınlaştırmaz.
<InputGroupInput /> ve <InputGroupTextarea /> render ettikleri öğelerin prop'larını kabul eder. Diğer parçalar öğelerinin niteliklerini kabul eder.
| Prop | Tür | Varsayılan |
|---|---|---|
sizeGirdiye aktarılan grup yüksekliği. | "sm" | "default" | "lg" | "default" |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group" | CSS'te grubu hedefleyin. role="group" render eder. |
data-size | Geçerli boyut. |
data-filled | Alanın bir değeri olduğu sürece bulunur. |
data-shake | Başarısız bir gönderimden sonra grup sarsılırken bulunur. |
data-disabled | Yalnızca ekler devre dışıyken grubu soluklaştırmak için kendiniz ayarlayın. |
--input-group-radius | Grubun köşe yarıçapı. Düğmeler ve tuş kapakları yarıçaplarını buradan türetir. |
--input-group-height | Geçerli boyut için grubun yüksekliği. |
| Prop | Tür | Varsayılan |
|---|---|---|
sizeGruptan devralınır. | "sm" | "default" | "lg" | – |
aria-invalid | boolean | – |
disabled | boolean | false |
readOnly | boolean | false |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-control" | Alanı işaretler. Grup, odak, geçersiz, devre dışı ve salt okunur durumlarını ondan okur. |
data-invalid | Çevreleyen bir Field değeri geçersiz işaretlediğinde bulunur. |
data-disabled | Alan devre dışı olduğunda bulunur. |
data-focused | Alan odaktayken bulunur. |
data-filled | Alanın bir değeri olduğunda bulunur. |
data-dirty | Değer ilk değerden farklı olduğunda bulunur. |
data-touched | Alana odaklanıp ayrıldıktan sonra bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
autoResizeİçerikle birlikte 16rem'e kadar büyür; yükseklikler arasında yumuşakça değişir. | boolean | true |
shakeBir gönderim geçersiz bulduğunda grubu sarsın. | boolean | true |
rows | number | – |
aria-invalid | boolean | – |
disabled | boolean | false |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-control" | Alanı işaretler. Grup, odak, geçersiz, devre dışı ve salt okunur durumlarını ondan okur. |
data-invalid | Çevreleyen bir Field değeri geçersiz işaretlediğinde bulunur. |
data-disabled | Alan devre dışı olduğunda bulunur. |
data-focused | Alan odaktayken bulunur. |
data-filled | Alanın bir değeri olduğunda bulunur. |
data-dirty | Değer ilk değerden farklı olduğunda bulunur. |
data-touched | Alana odaklanıp ayrıldıktan sonra bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
align | "inline-start" | "inline-end" | "block-start" | "block-end" | "inline-start" |
separatorBir blok eki ile alan arasına ince bir çizgi çizin. | boolean | false |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-addon" | CSS'te ekleri hedefleyin. |
data-align | Geçerli hizalama. |
data-separator | separator ayarlandığında bulunur. |
--input-group-addon-inset | Grubun kenarı ile içindeki bir düğme veya tuş kapağı arasındaki boşluk. |
| Prop | Tür | Varsayılan |
|---|---|---|
variant | "default" | "outline" | "secondary" | "ghost" | "destructive" | "link" | "ghost" |
size | "xs" | "sm" | "icon-xs" | "icon-sm" | "xs" |
type | string | "button" |
feedbackYükleme ve başarı akışı dahil her Button prop'u çalışır. | boolean | false |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-button" | CSS'te ek düğmelerini hedefleyin. |
data-size | Geçerli boyut. |
| Prop | Tür | Varsayılan |
|---|---|---|
onClearAlan temizlendikten sonra çağrılır. | () => void | – |
aria-label | string | "Clear" |
children | ReactNode | <IconX /> |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-clear" | CSS'te temizle düğmesini hedefleyin. |
data-visible | Alanın bir değeri olduğu ve düzenlenebilir olduğu sürece bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
revealedKontrollü state. Kendini yönetmesi için ayarlamadan bırakın. | boolean | – |
onRevealedChange | (revealed: boolean) => void | – |
aria-label | string | "Show password" |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-password-toggle" | CSS'te toggle'ı hedefleyin. |
data-revealed | Parola gösterilirken bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
thresholdSayı öne çıkmaya başladığında kalan karakter sayısı. | number | 10% of maxLength, at most 20 |
announcementSayı eşiği geçtiğinde veya sınıra ulaştığında ekran okuyucular için mesaj. | (remaining: number) => string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-count" | CSS'te sayacı hedefleyin. |
data-state="near" | "limit" | Eşik içinde ve hiç karakter kalmadığında bulunur. |
data-bump | Sınırda bir tuşa basıldığında kısa süre bulunur. |
| Öznitelik | Açıklama |
|---|---|
data-slot="input-group-text" | CSS'te ek metnini hedefleyin. |
- ButtonHer varyant ve boyutta düğmeler; hızlı istekler için spinner'ı atlayan yerleşik yükleme, başarı ve hata akışı.
- InputÜç boyutlu, geçersiz ve salt okunur durumları, yerel doğrulama stilleri ve telefonların asla yakınlaştırmaması için 16px dokunmatik yazı tipi olan bir metin girişi.
- 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.
- useAutosizeBir textarea'yı yazdıklarınıza göre en küçük ve en büyük yüksekliği arasında büyütür; metne hiç dokunmadan her değişikliği canlandırır.
- useComposedRefKendi öğenize bir ref tutarken, üst bileşenin ilettiği her ref'e de yönlendirmeyi sürdürür.
- useInvalidShakeGönderme denemesi bir form kontrolünü geçersiz bulduğunda onu sallar; biri hâlâ yazarken asla sallamaz.
Kullanıldığı bloklar
Input group üzerine kurulan bloklar.
- BillingBir yapay zeka ürünü için Cursor, Claude ve Vercel tarzında plan ve kullanım. Modele göre bölünmüş, dönem sonunu öngören ve krediler bitmeden uyaran bir kullanım ölçeri, üzerinde gezinebileceğiniz günlük bir grafik, ölçer üzerinde önizleyebileceğiniz uyarılara sahip bir harcama limiti, tam orantılı hesaplamayla plan değişiklikleri, gerçek doğrulamalı bir kart formu ve PDF olarak indirilen faturalar.
- Diff ReviewBir ajanın dosyalardaki düzenlemelerini uygulanmadan önce gözden geçirin. Sayaçlı bir dosya ağacı, her değişikliği, her dosyayı ya da hepsini kabul veya reddetme, herhangi bir satıra ya da aralığa ajana geri giden yorumlar, birleşik ve bölünmüş görünümler, kelime düzeyinde vurgular, geri alma, akışla gelen düzenlemeler ve sohbet için bir “4 dosya düzenlendi” özeti.
- ModelsBir yapay zeka ürününün ayarlarındaki Modeller sayfası. Bağlamı, hızı ve maliyeti tek bakışta görünen varsayılan bir model, her modelin neyi desteklediğini bilen varsayılan bir efor, sağlayıcıya göre gruplanmış; filtreler, sabitlemeler ve toplu anahtarlar içeren aranabilir bir model listesi, gerçek bir bağlantı testi olan OpenAI uyumlu sunucular ve nelerin yeni olduğunu söyleyen bir yenileme.
- 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.