Button
Harakatni ishga tushiruvchi tugma: 6 variant, 3 o'lcham, loading.
'use client';
import { Button } from '@akhatmirzo/ui';
export default function ButtonVariants() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button variant="primary">Saqlash</Button>
<Button>Soft</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="danger">O'chirish</Button>
<Button variant="link">Batafsil</Button>
</div>
);
}
Import
import { Button } from '@akhatmirzo/ui';Qachon ishlatish
- Harakat uchun — saqlash, yuborish, oynani ochish. Boshqa sahifaga o'tish uchun havola
kerak:
asChildbilan<a>bering (pastda misol bor). primary— sahifada bitta. Foydalanuvchidan kutilayotgan asosiy harakat uchun. Qolgan tugmalarsoft(standart),outlineyokighostbo'lsin.danger— faqat xavfli harakatga: o'chirish, bekor qilib bo'lmaydigan amallar. Odatdaconfirm()bilan birga.- Faqat ikonka bo'lsa —
Buttonemas,IconButtonishlating: uaria-labelni majburiy qiladi. - Matnni fe'l bilan yozing: "Saqlash", "Yuborish", "O'chirish" — "OK" yoki "Ha" emas.
Variantlar
variant — tugmaning ko'rinishi va vazni. Standart qiymat — soft.
| Variant | Qachon |
|---|---|
primary | Asosiy harakat — ko'rinishda bittadan ko'p bo'lmasin |
soft | Ikkilamchi harakatlar (standart) |
outline | Neytral, chegarali — "Bekor qilish", filtrlar |
ghost | Fonsiz — toolbar va jadval qatorlari ichida |
danger | O'chirish va boshqa xavfli harakatlar |
link | Matn ko'rinishidagi tugma, padding'siz |
O'lchamlar
Uch o'lcham — 32, 40 va 48px. Shu balandliklar Input va Select bilan bir xil, shuning uchun
bir qatorda tekis turadi. sm tugmaning ko'rinmas bosish maydoni 40px gacha kengaytirilgan.
'use client';
import { Button } from '@akhatmirzo/ui';
export default function ButtonSizes() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button size="sm">Kichik · 32</Button>
<Button size="md">O'rta · 40</Button>
<Button size="lg">Katta · 48</Button>
</div>
);
}
Ikonkalar
leftIcon va rightIcon — istalgan ReactNode. Ikonka o'lchami tugma o'lchamiga qarab
avtomatik: 16 / 18 / 20px. Ikonkalar ekran o'quvchidan yashiriladi (aria-hidden).
'use client';
import { Button } from '@akhatmirzo/ui';
import { ArrowRight, Plus, Trash2 } from 'lucide-react';
export default function ButtonIcons() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button variant="primary" leftIcon={<Plus />}>
Qo'shish
</Button>
<Button rightIcon={<ArrowRight />}>Davom etish</Button>
<Button variant="danger" leftIcon={<Trash2 />}>
O'chirish
</Button>
</div>
);
}
Yuklanish va o'chirilgan holat
loading paytida matn joyida qoladi (tugma kengligi o'zgarmaydi), ustida spinner chiqadi va
bosish e'tiborsiz qoldiriladi. Birinchi tugmani bosib ko'ring.
'use client';
import { Button, toast } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function ButtonLoading() {
const [saving, setSaving] = useState(false);
const save = () => {
setSaving(true);
setTimeout(() => {
setSaving(false);
toast.success('Saqlandi');
}, 1500);
};
return (
<div className="flex flex-wrap items-center gap-3">
<Button variant="primary" loading={saving} onClick={save}>
Saqlash
</Button>
<Button variant="outline" loading labels={{ loading: 'Yuborilmoqda' }}>
Yuborish
</Button>
<Button disabled>O'chirilgan</Button>
</div>
);
}
loading va disabled farqi
disabled tugma fokusdan chiqadi va bosilmaydi. loading tugma esa fokusda qoladi —
klaviatura bilan ishlayotgan foydalanuvchi joyini yo'qotmaydi, faqat bosish ishlamaydi.
Havola sifatida (asChild)
asChild bilan Button o'z <button> elementini emas, bolasini render qiladi — stil
tugmaniki, element esa <a>. Next.js'da <Link> ni ham shunday berish mumkin.
'use client';
import { Button } from '@akhatmirzo/ui';
import { ArrowRight } from 'lucide-react';
export default function ButtonAsChild() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button asChild variant="outline" rightIcon={<ArrowRight />}>
<a href="#accessibility">Accessibility bo'limiga</a>
</Button>
<Button asChild variant="link">
<a href="https://github.com/Akhatmirzo/akhatmirzo-toolkit">GitHub</a>
</Button>
</div>
);
}
import Link from 'next/link';
<Button asChild variant="primary">
<Link href="/buyurtmalar">Buyurtmalarga o'tish</Link>
</Button>;To'liq kenglik
Mobil formalar va kirish oynalari uchun — fullWidth.
'use client';
import { Button } from '@akhatmirzo/ui';
export default function ButtonFullWidth() {
return (
<div className="flex w-full max-w-sm flex-col gap-3">
<Button variant="primary" fullWidth>
Kirish
</Button>
<Button variant="outline" fullWidth>
Ro'yxatdan o'tish
</Button>
</div>
);
}
Props
Button qolgan barcha <button> atributlarini (onClick, type, form, aria-*, data-*
...) va ref ni qabul qiladi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
variant | 'primary' | 'soft' | 'outline' | 'ghost' | 'danger' | 'link' | 'soft' | Ko'rinish va vazn |
size | 'sm' | 'md' | 'lg' | 'md' | Balandlik: 32 / 40 / 48px |
loading | boolean | false | Spinner ko'rsatadi, bosishni o'chiradi, aria-busy qo'yadi |
disabled | boolean | false | Tugmani o'chiradi (50% shaffof) |
leftIcon | ReactNode | — | Matndan oldingi ikonka |
rightIcon | ReactNode | — | Matndan keyingi ikonka |
fullWidth | boolean | false | Konteyner kengligini egallaydi |
asChild | boolean | false | O'z elementi o'rniga bolasini render qiladi (masalan, <a>) |
labels | { loading?: string } | { loading: 'Yuklanmoqda' } | Ekran o'quvchi uchun matnlar |
type | 'button' | 'submit' | 'reset' | 'button' | Forma ichida tasodifan yubormasligi uchun standart — 'button' |
Data atributlari
Holatlar data-* atributlarida — o'z stillaringizni ularga bog'lashingiz mumkin:
| Atribut | Qiymat |
|---|---|
data-variant | primary · soft · outline · ghost · danger · link |
data-size | sm · md · lg |
data-disabled | disabled bo'lganda mavjud |
data-loading | loading bo'lganda mavjud |
Stilni boshqa elementga qo'llash kerak bo'lsa, buttonVariants ham eksport qilinadi:
import { buttonVariants } from '@akhatmirzo/ui';
<label className={buttonVariants({ variant: 'outline', size: 'sm' })}>Fayl tanlash</label>;Accessibility
- Native element. Standart holatda haqiqiy
<button type="button">chiziladi — forma ichida tasodifan yuborilmaydi;EntervaSpacebilan bosiladi. - Fokus halqasi faqat klaviatura bilan kelganda ko'rinadi (
:focus-visible). - Yuklanish.
loadingdaaria-busy="true"vaaria-disabled="true"qo'yiladi, tugma fokusda qoladi. Ko'p ekran o'quvchilararia-busyni o'qimagani uchun yashirinaria-livehudud "Yuklanmoqda" deb e'lon qiladi — matnnilabels.loadingbilan o'zgartirasiz. - Ikonkalar va spinner
aria-hidden— ekran o'quvchi faqat tugma matnini o'qiydi. asChild+disabled.<a>uchundisabledatributi yo'q, shuning uchunaria-disabled="true"vatabIndex={-1}qo'yiladi, bosish to'xtatiladi.- Kichik tugmalar.
size="sm"ko'rinishda 32px, lekin bosish maydoni 40px — barmoq bilan ham oson tegiladi.