@akhatmirzo/ui

Button

Harakatni ishga tushiruvchi tugma: 6 variant, 3 o'lcham, loading.

Import

import { Button } from '@akhatmirzo/ui';

Qachon ishlatish

  • Harakat uchun — saqlash, yuborish, oynani ochish. Boshqa sahifaga o'tish uchun havola kerak: asChild bilan <a> bering (pastda misol bor).
  • primary — sahifada bitta. Foydalanuvchidan kutilayotgan asosiy harakat uchun. Qolgan tugmalar soft (standart), outline yoki ghost bo'lsin.
  • danger — faqat xavfli harakatga: o'chirish, bekor qilib bo'lmaydigan amallar. Odatda confirm() bilan birga.
  • Faqat ikonka bo'lsa — Button emas, IconButton ishlating: u aria-label ni 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.

VariantQachon
primaryAsosiy harakat — ko'rinishda bittadan ko'p bo'lmasin
softIkkilamchi harakatlar (standart)
outlineNeytral, chegarali — "Bekor qilish", filtrlar
ghostFonsiz — toolbar va jadval qatorlari ichida
dangerO'chirish va boshqa xavfli harakatlar
linkMatn 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.

Ikonkalar

leftIcon va rightIcon — istalgan ReactNode. Ikonka o'lchami tugma o'lchamiga qarab avtomatik: 16 / 18 / 20px. Ikonkalar ekran o'quvchidan yashiriladi (aria-hidden).

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.

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.

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.

Props

Button qolgan barcha <button> atributlarini (onClick, type, form, aria-*, data-* ...) va ref ni qabul qiladi.

PropTipStandartTavsif
variant'primary' | 'soft' | 'outline' | 'ghost' | 'danger' | 'link''soft'Ko'rinish va vazn
size'sm' | 'md' | 'lg''md'Balandlik: 32 / 40 / 48px
loadingbooleanfalseSpinner ko'rsatadi, bosishni o'chiradi, aria-busy qo'yadi
disabledbooleanfalseTugmani o'chiradi (50% shaffof)
leftIconReactNode—Matndan oldingi ikonka
rightIconReactNode—Matndan keyingi ikonka
fullWidthbooleanfalseKonteyner kengligini egallaydi
asChildbooleanfalseO'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:

AtributQiymat
data-variantprimary · soft · outline · ghost · danger · link
data-sizesm · md · lg
data-disableddisabled bo'lganda mavjud
data-loadingloading 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; Enter va Space bilan bosiladi.
  • Fokus halqasi faqat klaviatura bilan kelganda ko'rinadi (:focus-visible).
  • Yuklanish. loading da aria-busy="true" va aria-disabled="true" qo'yiladi, tugma fokusda qoladi. Ko'p ekran o'quvchilar aria-busy ni o'qimagani uchun yashirin aria-live hudud "Yuklanmoqda" deb e'lon qiladi — matnni labels.loading bilan o'zgartirasiz.
  • Ikonkalar va spinner aria-hidden — ekran o'quvchi faqat tugma matnini o'qiydi.
  • asChild + disabled. <a> uchun disabled atributi yo'q, shuning uchun aria-disabled="true" va tabIndex={-1} qo'yiladi, bosish to'xtatiladi.
  • Kichik tugmalar. size="sm" ko'rinishda 32px, lekin bosish maydoni 40px — barmoq bilan ham oson tegiladi.

Sahifada