IconButton
Faqat ikonkadan iborat kvadrat tugma: aria-label majburiy, 3 o'lcham.
'use client';
import { IconButton } from '@akhatmirzo/ui';
import { Heart, Pencil, Plus, Share2, Trash2 } from 'lucide-react';
export default function IconButtonVariants() {
return (
<div className="flex flex-wrap items-center gap-3">
<IconButton variant="primary" aria-label="Qo'shish">
<Plus />
</IconButton>
<IconButton aria-label="Sevimlilarga qo'shish">
<Heart />
</IconButton>
<IconButton variant="outline" aria-label="Tahrirlash">
<Pencil />
</IconButton>
<IconButton variant="ghost" aria-label="Ulashish">
<Share2 />
</IconButton>
<IconButton variant="danger" aria-label="O'chirish">
<Trash2 />
</IconButton>
</div>
);
}
Import
import { IconButton } from '@akhatmirzo/ui';Qachon ishlatish
- Joy tor bo'lsa va ikonka hammaga tanish bo'lsa — yopish (✕), tahrirlash, o'chirish,
toolbar tugmalari. Ma'nosi aniq bo'lmasa, matnli
Buttonishlating. aria-label— majburiy. TypeScript usiz kompilyatsiya qilmaydi. Ekran o'quvchi ikonkani ko'rmaydi, faqat shu matnni o'qiydi — harakatni fe'l bilan yozing: "Yopish", "Tahrirlash".- Ko'rinadigan izoh kerak bo'lsa — tugmani
Tooltipga o'rang. - Toolbar va jadval qatorlarida
ghostvariant eng yengil ko'rinadi.
Variantlar
Button dagi variantlar, link dan tashqari: primary, soft (standart), outline, ghost,
danger. Har birining ma'nosi Button sahifasida.
O'lchamlar
Kvadrat: 32, 40 va 48px — Button, Input balandliklari bilan bir xil. Ikonka o'lchami
avtomatik: 16 / 18 / 20px. sm ning ko'rinmas bosish maydoni 40px gacha kengaytirilgan.
'use client';
import { IconButton } from '@akhatmirzo/ui';
import { X } from 'lucide-react';
export default function IconButtonSizes() {
return (
<div className="flex flex-wrap items-center gap-3">
<IconButton variant="outline" size="sm" aria-label="Yopish">
<X />
</IconButton>
<IconButton variant="outline" size="md" aria-label="Yopish">
<X />
</IconButton>
<IconButton variant="outline" size="lg" aria-label="Yopish">
<X />
</IconButton>
</div>
);
}
Holatlar
loading paytida ikonka o'rnida spinner aylanadi, tugma fokusda qoladi, bosish e'tiborsiz
qoldiriladi. Birinchi tugmani bosib ko'ring.
'use client';
import { IconButton } from '@akhatmirzo/ui';
import { Download, Trash2 } from 'lucide-react';
import { useState } from 'react';
export default function IconButtonStates() {
const [loading, setLoading] = useState(false);
const download = () => {
setLoading(true);
setTimeout(() => setLoading(false), 1500);
};
return (
<div className="flex flex-wrap items-center gap-3">
<IconButton
variant="primary"
loading={loading}
onClick={download}
aria-label="Hisobotni yuklab olish"
labels={{ loading: 'Yuklab olinmoqda' }}
>
<Download />
</IconButton>
<IconButton variant="danger" disabled aria-label="O'chirish">
<Trash2 />
</IconButton>
</div>
);
}
Moslashtirish
Shakl va joylashuvni className bilan o'zgartirasiz — masalan, dumaloq "suzuvchi" tugma uchun
rounded-full. Pastdagi misolda ghost tugmalardan toolbar yig'ilgan.
'use client';
import { IconButton } from '@akhatmirzo/ui';
import { Bold, Italic, Plus, Underline } from 'lucide-react';
export default function IconButtonToolbar() {
return (
<div className="flex flex-wrap items-center gap-6">
<div
role="toolbar"
aria-label="Matn formati"
className="flex items-center gap-1 rounded-lg border border-border bg-surface p-1"
>
<IconButton variant="ghost" size="sm" aria-label="Qalin">
<Bold />
</IconButton>
<IconButton variant="ghost" size="sm" aria-label="Kursiv">
<Italic />
</IconButton>
<IconButton variant="ghost" size="sm" aria-label="Tagiga chizilgan">
<Underline />
</IconButton>
</div>
<IconButton variant="primary" size="lg" className="rounded-full" aria-label="Yangi buyurtma">
<Plus />
</IconButton>
</div>
);
}
Havola sifatida (asChild)
IconButton ham asChild ni qabul qiladi: stil tugmaniki, element esa sizning <a> (yoki
Next.js <Link>) ingiz.
'use client';
import { IconButton } from '@akhatmirzo/ui';
import { Settings } from 'lucide-react';
export default function IconButtonAsChild() {
return (
<IconButton asChild variant="outline" aria-label="Sozlamalar">
<a href="#props">
<Settings />
</a>
</IconButton>
);
}
Props
IconButton — Button ustidagi yupqa qobiq. Button ning loading, disabled, asChild,
labels va boshqa barcha <button> atributlarini qabul qiladi; leftIcon, rightIcon va
fullWidth bu yerda yo'q.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
aria-labelmajburiy | string | — | Ekran o'quvchi o'qiydigan nom |
variant | 'primary' | 'soft' | 'outline' | 'ghost' | 'danger' | 'soft' | Ko'rinish va vazn |
size | 'sm' | 'md' | 'lg' | 'md' | Kvadrat o'lchami: 32 / 40 / 48px |
loading | boolean | false | Ikonka o'rniga spinner, bosish o'chadi, aria-busy qo'yiladi |
disabled | boolean | false | Tugmani o'chiradi |
asChild | boolean | false | O'z elementi o'rniga bolasini render qiladi (masalan, <a>) |
labels | { loading?: string } | { loading: 'Yuklanmoqda' } | Ekran o'quvchi uchun yuklanish matni |
children | ReactNode | — | Ikonka (SVG). Matn yozmang — buning uchun Button bor |
Data atributlari Button bilan bir xil: data-variant, data-size, data-disabled,
data-loading.
Accessibility
- Nom majburiy.
aria-labelTypeScript darajasida talab qilinadi — nomsiz tugma kompilyatsiyadan o'tmaydi. - Native
<button type="button">—EntervaSpacebilan bosiladi, forma ichida tasodifan yubormaydi. - Ikonka ekran o'quvchidan yashiriladi (
aria-hidden), o'qiladigan yagona narsa —aria-label. - Yuklanish.
aria-busy="true"qo'yiladi va yashirinaria-livehududlabels.loadingmatnini e'lon qiladi. - Kichik o'lcham.
size="sm"ko'rinishda 32px, lekin bosish maydoni 40px.