Questionnaire
Sorular arasında yön duygusuyla ilerleyen, gerçek ilerlemeyi gösteren ve klavyeden cevaplanan adım adım bir form.
pnpm dlx shadcn@latest add https://hextaui.com/r/questionnaire.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 @shadcn/react @base-ui/react @tabler/icons-react class-variance-authority cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/questionnaire.tsx components/ui/button.tsx components/ui/input.tsx components/ui/kbd.tsx components/ui/number-flow.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Cevaplar, her öğenin name değeriyle anahtarlanan normal bir form olarak gönderilir. Sorular gittiğiniz yöne doğru hareket eder, kart her sorunun yüksekliğine yumuşar ve ilerleme yalnızca cevaplanan veya atlanan sorular için dolar.
Yükselme geçişi ve çubuk
transition="lift" soruları bir yığın gibi yukarı aşağı hareket ettirir. İlerlemede variant="bar" tek ve sürekli bir çubuk gösterir.
Otomatik ilerleme
autoAdvance ile tekli cevap seçmek kısa bir duraklamadan sonra ilerler; böylece yalnızca 1–5 ile cevaplayabilirsiniz. Önceki bir cevabı değiştirmek asla ileri atlamaz ve son soru kendi kendine hiç gönderilmez.
Koşullu sorular
Bir öğeyi akışın dışında bırakmak için devre dışı bırakın. Geçerli olana kadar ilerlemeden ve akıştan çıkar.
Sağdan sola
Kayma okuma yönünü izler.
| Tuş | Action |
|---|---|
| ↑↓ | Metin alanı dahil cevaplar arasında gezinir. Gezinmek seçim yapmaz. |
| Space | Odaktaki cevabı seçer veya çoktan seçmelide açıp kapatır. |
| Enter | Devam eder. Seçilmemiş tekli cevapta önce onu seçer. Son soruda gönderir. |
| ←→ | Önceki veya sonraki soru; sağdan solda yansıtılır. Cevap gerektiğinde Next sallanır. Metin alanında imleci hareket ettirirler. |
| HomeEnd | İlk veya son cevap. |
| A1 | shortcuts ayarlıyken bir cevabı tuşuyla seçer. Questionnaire odak alınca tuş başlıkları parlar; başlamak için içinde herhangi bir yere tıklayın. |
| Esc | Harf kısayolları yeniden çalışsın diye metin alanından çıkar. |
| ⌘Enter | Her yerden gönderir. |
- Her
QuestionnaireItem, başlığı<legend>olan bir<fieldset>'dir. Etkin olmayan sorular gizli ve etkisizdir; animasyonla çıkan da dahil. - İlerleme, “Question 2 of 5” duyuran bir
progressbar'dır; bölümler ve dönen sayı dekoratiftir. - Hatalar
role="alert"kullanır ve geçersiz cevaplararia-invalidalır. - Azaltılmış harekette sorular anında değişir ve hiçbir şey sallanmaz.
| Prop | Tür | Varsayılan |
|---|---|---|
transition | "slide" | "lift" | "slide" |
autoAdvanceTekli cevap ilk kez seçildikten 350ms sonra ilerler. | boolean | false |
shortcutsHer cevaba bir tuş kısayolu ekler. | "letters" | "numbers" | – |
item | string | – |
defaultItem | string | – |
onItemChange | (item: string) => void | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="questionnaire" | Form; data-transition ile. |
data-current / data-total | Geçerli konum ve soru sayısı. |
data-first / data-last | İlk veya son soruda bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
variant | "segments" | "bar" | "segments" |
| Öznitelik | Açıklama |
|---|---|
data-slot="questionnaire-progress-segment" | Soru başına bir tane; data-status, data-active ve data-invalid ile. |
| Prop | Tür | Varsayılan |
|---|---|---|
nameForm alanı adı. | string | – |
required | boolean | false |
multipleRadyo yerine onay kutuları. | boolean | false |
disabledSoruyu akışın dışında bırakır. | boolean | false |
onStatusChange | (status) => void | – |
| Öznitelik | Açıklama |
|---|---|
data-status | "unanswered", "answered" veya "skipped". |
data-active | Geçerli soru. |
data-invalid | Cevap gerekir. |
data-leaving | Animasyonla çıkan soru. |
| Prop | Tür | Varsayılan |
|---|---|---|
value | string | – |
defaultChecked | boolean | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <label> |
| Öznitelik | Açıklama |
|---|---|
data-checked / data-unchecked | Cevabın seçili olup olmadığı. |
data-type | "radio" veya "checkbox". |
data-shortcut | Cevabın tuşu. |
Seçeneklerle birlikte duran serbest metinli bir cevap. Yazmak seçilen seçeneği temizler. Ona bir etiket veya aria-label verin.
| Prop | Tür | Varsayılan |
|---|---|---|
variant | Button variant | "ghost", or "default" for Next and Submit |
size | Button size | "default" |
QuestionnaireNext ve QuestionnaireSubmit bir yuvayı paylaşır; böylece son soruda hiçbir şey kaymadan Next yerine Submit gelir.
- 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.
- KbdKısayollar için, her platformda doğru simgeleri gösteren, düzgün sesli okunan ve gerçek tuşlar gibi basılan tuş başlıkları.
- 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.
- Number flowYalnızca değişen basamakların döndüğü animasyonlu sayılar; herhangi bir Intl biçimi ve yerel ayarla.
- 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ı.
Kullanıldığı bloklar
Questionnaire üzerine kurulan bloklar.