EmptyState
Bo'sh ro'yxat, natijasiz qidiruv va birinchi kirish holati uchun: ikonka, sarlavha, izoh va harakatlar.
Buyurtmalar hali yo'q
Birinchi buyurtma kelganda shu yerda ko'rinadi.
'use client';
import { Button, EmptyState } from '@akhatmirzo/ui';
import { Inbox, Plus } from 'lucide-react';
export default function EmptyStateBasic() {
return (
<EmptyState
icon={<Inbox />}
title="Buyurtmalar hali yo'q"
description="Birinchi buyurtma kelganda shu yerda ko'rinadi."
action={
<Button variant="primary" leftIcon={<Plus />}>
Mahsulot qo'shish
</Button>
}
secondaryAction={<Button variant="ghost">Qo'llanma</Button>}
/>
);
}
Import
import { EmptyState } from '@akhatmirzo/ui';Qachon ishlatish
- Ro'yxat yoki jadval bo'sh bo'lganda — "Buyurtmalar hali yo'q". Bo'sh oq joy o'rniga nima bo'lganini va keyingi qadamni ko'rsating.
- Qidiruv yoki filtr natija bermaganda — so'rovni o'zgartirish yoki filtrni tozalashni taklif qiling.
- Birinchi kirishda — foydalanuvchini birinchi harakatga yo'naltiring (
size="lg"). - Bitta asosiy harakat —
action(primary), qo'shimchasisecondaryAction(ghost). - Sarlavha qisqa, izoh foydali bo'lsin — "Hech narsa yo'q" emas, "Birinchi buyurtma kelganda shu yerda ko'rinadi".
Qidiruvda natija yo'q
bordered — bo'lim ichida ishlatish uchun punktir chegara.
Hech narsa topilmadi
"Namangan" bo'yicha natija yo'q. So'zni o'zgartirib ko'ring.
'use client';
import { Button, EmptyState, Input } from '@akhatmirzo/ui';
import { SearchX } from 'lucide-react';
import { useState } from 'react';
export default function EmptyStateSearch() {
const [query, setQuery] = useState('Namangan');
return (
<div className="flex w-full max-w-md flex-col gap-3">
<Input
aria-label="Shahar qidirish"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Shahar nomi"
/>
<EmptyState
size="sm"
bordered
icon={<SearchX />}
title="Hech narsa topilmadi"
description={`"${query}" bo'yicha natija yo'q. So'zni o'zgartirib ko'ring.`}
action={
<Button size="sm" onClick={() => setQuery('')}>
Qidiruvni tozalash
</Button>
}
/>
</div>
);
}
O'lchamlar
size: sm — vertikal padding 24px, md (standart) — 40px, lg — 64px, ikonka doirasi 64px va
kattaroq sarlavha.
Kichik
sm
O'rta
md
Katta
lg
'use client';
import { EmptyState } from '@akhatmirzo/ui';
import { FolderOpen } from 'lucide-react';
export default function EmptyStateSizes() {
return (
<div className="grid w-full gap-4 sm:grid-cols-3">
<EmptyState bordered size="sm" icon={<FolderOpen />} title="Kichik" description="sm" />
<EmptyState bordered size="md" icon={<FolderOpen />} title="O'rta" description="md" />
<EmptyState bordered size="lg" icon={<FolderOpen />} title="Katta" description="lg" />
</div>
);
}
DataTable bilan
DataTable bo'sh bo'lganda o'zining empty slotida aynan shu ko'rinishni chizadi. empty ga
EmptyState'dagi kabi icon, title, description va action beriladi.
| № | Mijoz | Summa |
|---|---|---|
Buyurtmalar hali yo'q Birinchi buyurtma kelganda shu yerda ko'rinadi. | ||
'use client';
import { Button, DataTable, type DataTableColumn } from '@akhatmirzo/ui';
import { Inbox, Plus } from 'lucide-react';
interface Order {
id: number;
customer: string;
total: string;
}
const columns: DataTableColumn<Order>[] = [
{ key: 'id', header: '№' },
{ key: 'customer', header: 'Mijoz' },
{ key: 'total', header: 'Summa' },
];
const orders: Order[] = [];
export default function EmptyStateDataTable() {
return (
<DataTable
className="w-full"
label="Buyurtmalar"
data={orders}
columns={columns}
empty={{
icon: <Inbox />,
title: "Buyurtmalar hali yo'q",
description: "Birinchi buyurtma kelganda shu yerda ko'rinadi.",
action: (
<Button size="sm" variant="primary" leftIcon={<Plus />}>
Buyurtma qo'shish
</Button>
),
}}
/>
);
}
Props
EmptyState qolgan barcha <div> atributlarini qabul qiladi (title dan tashqari — u prop
sifatida band).
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
titlemajburiy | ReactNode | — | Sarlavha |
description | ReactNode | — | Qisqa izoh (max 40 belgi kenglikda) |
icon | ReactNode | — | Berilsa — 48px doira ichida (lg da 64px) |
action | ReactNode | — | Asosiy harakat |
secondaryAction | ReactNode | — | Ikkilamchi harakat |
size | 'sm' | 'md' | 'lg' | 'md' | Vertikal padding: 24 / 40 / 64px |
bordered | boolean | false | Punktir chegara va radius (bo'lim ichida ishlatish uchun) |
headingLevel | 2 | 3 | 4 | 5 | 6 | 3 | Sarlavha tegi (h2–h6) |
Data atributlari
Ildiz elementda: data-size, data-bordered (punktir chegara bo'lsa). Stilni boshqa elementga
qo'llash uchun emptyStateVariants ham eksport qilinadi.
Accessibility
- Sarlavha haqiqiy
h*tegi — standarth3. Sahifa tuzilishiga moslabheadingLevelbilan o'zgartiring, shunda sarlavhalar ketma-ketligi buzilmaydi. - Ikonka bezak — doirasi bilan birga
aria-hidden. - Harakatlar — siz bergan tugmalar, klaviatura bilan odatdagidek ishlaydi. Tor ekranda (< 640px) ular ustma-ust va to'liq kenglikda turadi.
- Natija dinamik o'zgarsa (qidiruv), xabar e'lon qilinishini istasangiz, o'rab turgan
konteynerga
role="status"bering.