Attachment
Yüklemeler için dosya ve görsel kartları; ilerleme, durumlar, eylemler, tüm kartı kaplayan bir tetikleyici ve uzantısını koruyan adlar içerir.
pnpm dlx shadcn@latest add https://hextaui.com/r/attachment.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/attachment.tsx components/ui/aspect-ratio.tsx components/ui/skeleton.tsx components/ui/button.tsx components/ui/progress.tsx components/ui/scroll-area.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Image
<AttachmentMedia /> üzerinde variant="image", yüklenirken parlayan kare bir küçük resim gösterir. Önizlemenin üstte olduğu bir kutucuk için orientation="vertical" ayarlayın.
Durumlar
state tüm yükleme yaşam döngüsünü kapsar. Boştaki dosyalar kesikli kenarlık alır, yüklenen ve işlenen başlıklar parlar, hatalar ise medyayı ve açıklamayı kırmızıya çevirir.
Yükleme akışı
İnce bir ilerleme çubuğunu alt kenara çizmek için state="uploading" iken progress geçin. Görsel önizlemeleri yükleme bitene kadar soluk kalır.
Boyutlar
size dolguyu, medyayı ve metni birlikte ölçekler; iç köşeleri kartla eş merkezli tutar.
Uzun adlar
Uzun dosya adları uzantıdan önce kısaltılır; böylece kişiler bir .pdf ile .zip'i yine ayırt edebilir. Tamamını okumak için adın üzerine gelin.
Group
<AttachmentGroup /> eklentileri yana kayan bir satırda dizer; kenarlar solar ve öğeler yerine oturur.
Trigger
<AttachmentTrigger /> tüm kartı tıklanabilir yapar, örneğin bir önizleme veya bağlantı açmak için; karttaki eylemler ise bağımsız kalır. Ona bir aria-label verin.
Composer
Sayfa yüklendikten sonra eklenen dosyalar pop ederek belirir; biri kaldırıldığında satırın geri kalanı düzgünce kayar.
Bozuk görsel
Bir görsel önizlemesi yüklenemediğinde bir dosya simgesine geri döner.
Stres testi
Dar bir sütunda zorlu adlar, her 60 ms'de rastgele bir durum ve tek bir grupta 200 öğe. Hiçbir şey taşmaz ve düzen bozulmaz.
Sağdan sola
Media, content ve actions yansıtılır; ilerleme çubuğu başlangıç kenarından dolar.
| Tuş | Action |
|---|---|
| Tab | Odağı her eyleme, sonra trigger'a taşır. Dikey kutucuklardaki gizli eylemler, odak karta girdiğinde görünür. |
| EnterSpace | Odaktaki eylemi veya trigger'ı etkinleştirir. |
- Yükleme sırasında ilerleme çubuğunda
role="progressbar"bulunur ve başlıkla etiketlenir. - Dize başlıklar tam adı içeren bir
titleniteliği alır; böylece kısaltılmış adlar yine okunabilir. - Yalnızca simgeli eylemlerde ve trigger'da metin yoktur; bu yüzden onlara her zaman dosyayı adlandıran bir
aria-labelverin. - Azaltılmış hareket açıkken ekler pop etmeden görünür, ilerleme çubuğu yumuşamak yerine atlar ve gruplar anında yeniden düzenlenir.
Grup, eylem ve trigger dışındaki her parça düz bir öğe oluşturur ve onun niteliklerini kabul eder. Kart stilleri attachmentVariants olarak dışa aktarılır.
| Prop | Tür | Varsayılan |
|---|---|---|
state | "idle" | "uploading" | "processing" | "error" | "done" | "done" |
progress0 ile 100 arası. Yalnızca yükleme sırasında gösterilir ve bu aralığa sabitlenir. | number | – |
size | "default" | "sm" | "xs" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment" | CSS'te kartı hedefleyin. |
data-state | Geçerli durum. |
data-size | Geçerli boyut. |
data-orientation | Geçerli yönelim. |
data-slot="attachment-progress" | Yükleme sırasında bulunan ilerleme çubuğu. |
--attachment-radius | Kartın köşe yarıçapı. İç köşeler buna göre türetilir. |
| Prop | Tür | Varsayılan |
|---|---|---|
variantimage, alt öğesini bir dosya simgesi fallback'ine sahip kare bir AspectRatio içine sarar. | "icon" | "image" | "icon" |
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-media" | CSS'te medyayı hedefleyin. |
data-variant | Geçerli varyant. |
Başlığı ve açıklamayı tutan, kalan genişliği kaplayan bir <div>.
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-content" | CSS'te içeriği hedefleyin. |
| Prop | Tür | Varsayılan |
|---|---|---|
childrenBir dize, uzantısı asla kırpılmayacak şekilde bölünür. | ReactNode | – |
titleÜzerine gelindiğinde gösterilir. Varsayılan olarak tam addır. | string | children |
idBelirtilmezse oluşturulur. İlerleme çubuğu bununla etiketlenir. | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-title" | CSS'te başlığı hedefleyin. |
Boyut, tür veya durum için tek satırlık bir <span>. Yer bittiğinde kısaltılır.
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-description" | CSS'te açıklamayı hedefleyin. |
Eylem düğmeleri için bir <div>. Dikey kutucuklarda önizlemenin üzerinde yüzer ve fare olan cihazlarda üzerine gelindiğinde veya odaklandığında görünür.
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-actions" | CSS'te eylemleri hedefleyin. |
Trigger'ın üstünde duran bir <Button />. Button'ın tüm prop'larını kabul eder.
| Prop | Tür | Varsayılan |
|---|---|---|
variant | ButtonVariant | "ghost" |
size | ButtonSize | "icon-xs" |
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-action" | CSS'te eylemleri hedefleyin. |
Tüm kartı kaplayan görünmez bir katman. Bir diyalog trigger'ı, bir bağlantı veya herhangi bir düğmeyle birleştirin.
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <button type="button"> |
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-trigger" | CSS'te tetikleyiciyi hedefleyin. |
Her eke oturan ve öğeler eklendiğinde veya kaldırıldığında satırı animasyonla kaydıran yatay bir <ScrollArea />. scrollbars dışındaki tüm ScrollArea prop'larını kabul eder.
| Öznitelik | Açıklama |
|---|---|
data-slot="attachment-group" | CSS'te grubu hedefleyin. |
data-slot="attachment-group-list" | Ekleri tutan satır. |
- Aspect ratioMedya yüklenmeden önce şeklini koruyan, yüklenirken parıldayan, medyayı yumuşakça görünür kılan ve hata durumunda yedeğe düşen bir kutu.
- ButtonHer varyant ve boyutta düğmeler; hızlı istekler için spinner'ı atlayan yerleşik yükleme, başarı ve hata akışı.
- 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.
- ProgressBir görevin ne kadar ilerlediğini gösteren, güncellemeler arasında yumuşak geçiş yapan ve toplam bilinmediğinde kayan bir çubuk ya da halka.
- Scroll areaMinimal bir kaydırma çubuğuyla yerel kaydırma, yalnızca görülecek daha fazla şey olan yerde solan kenarlar ve son öğeyi ikiye bölen isteğe bağlı bir göz atma payı.
- BubbleVaryantlı, köşeleri gruplanmış, tepkileri olan ve etkileşimli içeriğe yer açan sohbet mesajı balonları.
Kullanıldığı bloklar
Attachment üzerine kurulan bloklar.
- Prompt InputTek sakin bir satır olarak başlayan, yazdıkça karta dönüşen ve konuşma başladığında aşağı inen bir sohbet yazma alanı. Enter gönderir; Japonca ve Çince girişle de güvenle çalışır. Dosyaları yapıştırın, bırakın ya da seçin; önizleme, ilerleme ve yeniden deneme desteği vardır. @ dosya ekler, / ise imleçte açılan bir menüden komut çalıştırır. Sayı tuşlarıyla çalışan bir model seçici, Max'ta canlanan bir efor kaydırıcısı, bir bağlam halkası, canlı dalga biçimli dikte, araç çipleri, yanıt akarken yazılan mesajlar için bir kuyruk ve yeniden yüklemeden sağ çıkan taslaklar.
- Chat ThreadYazma alanının çevresindeki tüm konuşma. Yanıt akarken sorunuz üstte sabitlenir, yandaki kontrol noktaları mesajlar arasında atlar ve her yanıt kopyalanabilir, düzenlenebilir, yeniden denenebilir, puanlanabilir ve sürümler arasında değiştirilebilir. Yanıtlar kod blokları, tablolar ve alıntılarla Markdown olarak render edilir; düşünme, araç çağrıları ve Prompt Input doğrudan yerine oturur.