Rating
Yulduzli baho: klaviatura, yarim qiymatlar, hover'da oldindan ko'rish va sharhlar uchun faqat o'qish rejimi.
'use client';
import { Rating } from '@akhatmirzo/ui';
export default function RatingBasic() {
return <Rating defaultValue={4} />;
}
Import
import { Rating } from '@akhatmirzo/ui';Qachon ishlatish
- Mahsulot, xizmat yoki kuryerni baholash — foydalanuvchi bir bosishda fikrini bildiradi.
- Sharhlar ro'yxatida o'rtacha bahoni ko'rsatish —
readOnly(kasr qiymatlar ham aniq chiziladi: 4.3 → 4 ta to'liq va 0.3 qism). - Aniq son yoki keng shkala kerak bo'lsa (0–100) —
Sliderqulayroq. - Ma'nosi har xil variantlar ("Yomon / O'rtacha / Yaxshi") —
SegmentedControlyokiRadioGroup.
Yarim qiymatlar
allowHalf — har bir yulduzning chap yarmi x.5, o'ng yarmi x qiymatini beradi; strelkalar
0.5 qadam bilan yuradi. Yarim yulduz clip-path bilan chiziladi.
'use client';
import { Rating } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function RatingHalf() {
const [value, setValue] = useState(3.5);
return (
<div className="flex items-center gap-3">
<Rating value={value} onValueChange={setValue} allowHalf size="lg" />
<span className="text-sm text-text-muted tabular-nums">{value} / 5</span>
</div>
);
}
Faqat o'qish
readOnly — interaktiv emas: element role="img" va aria-label="4.5 / 5" bilan bitta rasm
sifatida o'qiladi. Qiymat yaxlitlanmaydi — 3.7 aniq 3.7 yulduz bo'lib chiziladi.
- Dilnoza
Yetkazib berish tez, sifat zo'r.
- Jasur
O'lchami biroz katta keldi.
'use client';
import { Rating } from '@akhatmirzo/ui';
const reviews = [
{ name: 'Dilnoza', rating: 5, text: "Yetkazib berish tez, sifat zo'r." },
{ name: 'Jasur', rating: 3.5, text: "O'lchami biroz katta keldi." },
];
export default function RatingReadOnly() {
return (
<ul className="m-0 flex w-full max-w-sm list-none flex-col gap-4 p-0">
{reviews.map((r) => (
<li key={r.name} className="flex flex-col gap-1">
<div className="flex items-center justify-between gap-3">
<span className="text-sm font-medium text-text">{r.name}</span>
<Rating value={r.rating} readOnly size="sm" />
</div>
<p className="m-0 text-sm text-text-muted">{r.text}</p>
</li>
))}
</ul>
);
}
Rang, ikonka va o'lcham
color— to'lgan yulduz rangi:warning(standart),primary,danger. Bo'sh yulduzlar —text-mutedrangida.icon— ichki yulduz o'rniga istalgan ikonka (currentColorbilan bo'yaladigan SVG).size—sm16px,md20px (standart),lg28px.max— yulduzlar soni (standart 5).
'use client';
import { Rating } from '@akhatmirzo/ui';
import { Heart } from 'lucide-react';
export default function RatingCustom() {
return (
<div className="flex flex-col gap-4">
<Rating
defaultValue={3}
color="danger"
icon={<Heart fill="currentColor" strokeWidth={0} />}
/>
<Rating defaultValue={2} color="primary" size="sm" />
<Rating defaultValue={7} max={10} />
<Rating defaultValue={3} disabled />
</div>
);
}
Tozalash va Field
allowClear (standart true) — tanlangan yulduzni qayta bossangiz qiymat 0 bo'ladi.
Majburiy baholashda allowClear={false} qo'ying. Field ichida label guruh nomiga,
izoh aria-describedby ga aylanadi.
1 dan 5 gacha baholang
'use client';
import { Field, Rating } from '@akhatmirzo/ui';
export default function RatingWithField() {
return (
<Field label="Xizmat sifati" description="1 dan 5 gacha baholang">
<Rating defaultValue={5} allowClear={false} />
</Field>
);
}
Props
Qolgan <div> atributlari ildiz elementga, ref ham shunga tushadi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
value | number | — | Qiymat (boshqariladigan rejim) |
defaultValue | number | 0 | Boshlang'ich qiymat |
onValueChange | (value: number) => void | — | Qiymat o'zgarganda |
max | number | 5 | Yulduzlar soni |
allowHalf | boolean | false | 0.5 qadam |
allowClear | boolean | true | Tanlangan qiymatni qayta bosish 0 qiladi |
readOnly | boolean | false | Faqat ko'rsatish: role="img" + aria-label |
disabled | boolean | — | O'chirilgan holat (fokus olmaydi) |
size | 'sm' | 'md' | 'lg' | 'md' | Yulduz o'lchami 16 / 20 / 28px |
icon | ReactNode | yulduz SVG | Yulduz o'rniga ikonka |
color | 'warning' | 'primary' | 'danger' | 'warning' | To'lgan yulduz rangi |
labels | { value?: (value: number, max: number) => string; group?: string } | '${v} / ${max}', 'Baho' | Radio va readOnly nomi; guruh nomi (Field va aria-label bo'lmasa) |
Data atributlari
| Atribut | Qayerda | Qiymat |
|---|---|---|
data-size | ildiz | sm · md · lg |
data-hover | ildiz | sichqoncha yulduzlar ustida bo'lsa |
data-readonly | ildiz | readOnly da mavjud |
data-disabled | ildiz | o'chirilganda mavjud |
data-state | radio | checked · unchecked |
data-state | yulduz | full · partial · empty |
Klaviatura
| Tugma | Harakat |
|---|---|
Tab | Guruhga kirish (tanlangan yulduzga) |
→ ↑ / ← ↓ | Bir qadam oshirish / kamaytirish (va tanlash) |
Home / End | Eng kichik (1 yoki 0.5) / eng katta qiymat |
Space / Enter | Fokusdagi yulduzni tanlash (qayta — tozalash) |
Accessibility
- Interaktiv —
role="radiogroup", har bir qiymatrole="radio"(aria-checked,aria-label="3 / 5");allowHalfda har yulduzda ikkita radio. Roving tabindex: guruhda bittaTabto'xtashi. - Nom.
Fieldlabel'iaria-labelledbyorqali, aks holdaaria-labelyokilabels.group("Baho"). - readOnly —
role="img"vaaria-label(labels.value), yulduzlararia-hidden. - Disabled —
aria-disabled, radiolar fokus olmaydi.