Table
Tablo verisi için stillenmiş primitive'ler: ince çizgi halkalı bir çerçeve içinde, yer kalmadığında yatayda kayan gerçek bir <table>. Sıralama, sayfalama ve seçim mantığı senin kodunda kalır.
| Fatura | Müşteri | Durum | Tutar |
|---|---|---|---|
| INV-1042 | Northwind | Ödendi | 1.240,00 |
| INV-1043 | Globex | Bekliyor | 860,50 |
| INV-1044 | Initech | Gecikmiş | 3.120,00 |
<Table scrollLabel="Faturalar">
<TableHead>
<TableRow>
<TableHeader>Fatura</TableHeader>
<TableHeader>Müşteri</TableHeader>
<TableHeader>Durum</TableHeader>
<TableHeader align="end">Tutar</TableHeader>
</TableRow>
</TableHead>
<TableBody>
<TableRow>
<TableCell>INV-1042</TableCell>
<TableCell>Northwind</TableCell>
<TableCell><Badge tone="success">Ödendi</Badge></TableCell>
<TableCell align="end">1.240,00</TableCell>
</TableRow>
{/* … */}
</TableBody>
</Table>Import
import { Table, TableHead, TableBody, TableRow, TableHeader, TableCell } from "@merid/react";Örnekler
Sıkı, hover'sız
density="sm" hücreleri 10px × 12px'e sıkılaştırır; hoverable={false} salt okunur tablolar için satırdaki hover rengini kapatır.
| Anahtar | İstek |
|---|---|
| api/search | 12.480 |
| api/users | 3.904 |
<Table density="sm" hoverable={false} scrollLabel="API anahtarları">
<TableHead>
<TableRow>
<TableHeader>Anahtar</TableHeader>
<TableHeader align="end">İstek</TableHeader>
</TableRow>
</TableHead>
<TableBody>
<TableRow>
<TableCell>api/search</TableCell>
<TableCell align="end">12.480</TableCell>
</TableRow>
</TableBody>
</Table>Satır seçimi
Bir satırdaki selected, accent-soft dolguyu uygular. Seçimin kullanılabilir olması ve duyurulması için bunu bir Checkbox kolonuyla birlikte kullan. scrollLabel çerçeveyi focus alabilen, adlandırılmış bir bölgeye çevirir; böylece klavye kullanıcıları onu kaydırabilir.
| Fatura | Tutar | |
|---|---|---|
| INV-1042 | 1.240,00 | |
| INV-1043 | 860,50 | |
| INV-1044 | 3.120,00 |
<Table scrollLabel="Faturalar">
<TableHead>
<TableRow>
<TableHeader><Checkbox aria-label="Tümünü seç" checked={allSelected} indeterminate={someSelected} onChange={toggleAll} /></TableHeader>
<TableHeader>Fatura</TableHeader>
<TableHeader align="end">Tutar</TableHeader>
</TableRow>
</TableHead>
<TableBody>
{rows.map((row) => (
<TableRow key={row.id} selected={selected.includes(row.id)}>
<TableCell><Checkbox aria-label={row.id + " faturasını seç"} checked={selected.includes(row.id)} onChange={() => toggle(row.id)} /></TableCell>
<TableCell>{row.id}</TableCell>
<TableCell align="end">{row.amount}</TableCell>
</TableRow>
))}
</TableBody>
</Table>Sıralanabilir kolonlar
Bir başlığa sortDirection ve onSort ver: <th> üzerine aria-sort koyar ve etiketi yön ikonlu gerçek bir butona sarar. Satırları sıralamak senin işin; sıralanabilir ama o an aktif sıralama olmayan kolonlarda "none" kullan.
const [sort, setSort] = useState<{ key: "name" | "amount"; dir: "ascending" | "descending" }>({ key: "name", dir: "ascending" });
const toggle = (key: "name" | "amount") =>
setSort((s) => ({ key, dir: s.key === key && s.dir === "ascending" ? "descending" : "ascending" }));
<TableHeader sortDirection={sort.key === "name" ? sort.dir : "none"} onSort={() => toggle("name")}>
Ad
</TableHeader>API referansı
Her parça ref'ini karşılık gelen native elemana iletir ve native attribute'ları aktarır.
Table
Çerçeve div'i <table>'ı sarar; className ve native prop'lar <table>'a gider.
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
density | "sm" | "md" | "md" | Satır yoğunluğu: md'de hücreler 14px 16px, sm'de 10px 12px. |
hoverable | boolean | true | Hover'da satırı vurgular. |
scrollLabel | string | – | Kaydırma sarmalayıcısını bu adla focus alabilen bir bölgeye çevirir. Hiç taşmayan tablolarda verme. |
TableHead, TableBody
<thead> (hafif yüzey üzerinde) ve <tbody>. Native attribute'lar dışında prop'ları yok.
TableRow
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
selected | boolean | – | `data-selected` ile accent-soft dolgu. ARIA eklemez: seçimi seçim kontrolüyle (örneğin işaretli bir checkbox hücresiyle) aktar, `aria-selected`'ı da yalnızca `role="grid"` olan bir tabloda kendin ver. |
TableHeader
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
align | "start" | "center" | "end" | "start" | Metin hizalaması; sayısal kolonlarda end kullan. |
scope | "col" | "row" | "colgroup" | "rowgroup" | "col" | Native başlık scope'u. |
sortDirection | "ascending" | "descending" | "none" | – | Kolonu sıralanabilir yapar: aria-sort'u ayarlar ve etiketi yön ikonlu bir butonun içinde render'lar. |
onSort | (event) => void | – | Sıralama butonuna basıldığında çağrılır. Sonraki yönü hesaplamak ve satırları sıralamak sana kalır. |
TableCell
| Prop | Tip | Varsayılan | Açıklama |
|---|---|---|---|
align | "start" | "center" | "end" | "start" | Metin hizalaması; sayısal kolonlarda end kullan. |
Stil verme
| Seçici | Değerler |
|---|---|
.mrd-table-frame | Kaydırılabilen, ince çizgi halkalı sarmalayıcı |
.mrd-table | <table> elemanı; data-density = sm · md, data-hoverable |
.mrd-table__head, .mrd-table__body | Bölümler |
.mrd-table__row | Satırlar; seçiliyken data-selected |
.mrd-table__header, .mrd-table__cell | Hücreler; data-align = start · center · end |
Component değişkeni: her yoğunluk için ayarlanan --mrd-table-cell-padding.
Erişilebilirlik
- Native bir tablo olduğu için ekran okuyucular satır ve kolon gezintisini hazır alır.
TableHeadervarsayılan olarakscope="col"'dur; satır başlıkları içinscope="row"kullan. - Tabloyu tanımlamak için bir
<caption>(bunu VisuallyHidden ile görsel olarak gizleyebilirsin) ya da tabloyaaria-labelekle. TableRow selectedyalnızca görseldir (data-selected); düz bir tablonun seçim anlamı yoktur, bu yüzden state'i satırdaki seçim kontrolü taşımalı.- Tablo taşabiliyorsa
scrollLabelver; çerçeveye Tab ile ulaşılır ve ok tuşlarıyla kaydırılır.
| Tuş | Ne yapar |
|---|---|
| Tab | Focus'u kaydırma bölgesine (scrollLabel verildiyse) ve hücrelerdeki etkileşimli içeriğe taşır. |
| ←→ | Focus'taki bölgeyi yatayda kaydırır. |
Kullanım ilkeleri
Yap
Rakamlar alt alta hizalansın diye sayıları align="end" ile sağa yasla; hücreler zaten tabular rakam kullanıyor.
Kaçın
Layout için tablo kullanmak ya da metin kolonlarını ortalamak.
İlgili sayfalar
- Checkbox: satır seçimi.
- Pagination: uzun tabloları sayfalamak.
- EmptyState: tabloda hiç satır olmadığında.