Slider
Raqamli qiymat yoki oraliqni sudrab tanlash: bitta va ikki tutqich, belgilar, qiymat pufakchasi va Field bilan integratsiya.
'use client';
import { Slider } from '@akhatmirzo/ui';
export default function SliderBasic() {
return (
<div className="w-full max-w-sm">
<Slider defaultValue={[40]} aria-label="Yorqinlik" />
</div>
);
}
Import
import { Slider } from '@akhatmirzo/ui';Qachon ishlatish
- Aniq raqam muhim bo'lmaganda — ovoz balandligi, yorqinlik, radius. Foydalanuvchi "taxminan" tanlaydi va natijani darhol ko'radi.
- Oraliq filtri — narx "dan — gacha", yosh, maydon. Ikki tutqichli slider ikkita input'dan tezroq.
- Aniq qiymat kerak bo'lsa (summa, miqdor) —
InputyokiMaskedInputqulayroq; slider bilan yonma-yon ham qo'yish mumkin. - Qadamlar kam bo'lsa (3–5 ta variant) —
SegmentedControlyokiRadioGrouptushunarliroq.
Qiymat — doim massiv
Radix kabi qiymat har doim number[]: bitta tutqich — [50], oraliq — [20, 80]. Tutqichlar soni
massiv uzunligidan olinadi. defaultValue berilmasa — [min].
<Slider defaultValue={[50]} />
<Slider defaultValue={[20, 80]} />Oraliq
Ikki qiymat — ikki tutqich. formatValue qiymatni pufakchada va ekran o'quvchida chiroyli
ko'rsatadi; minStepsBetweenThumbs tutqichlar orasidagi eng kichik masofani (qadamlarda)
belgilaydi.
Narx: 1 000 000 so'm — 3 500 000 so'm
'use client';
import { formatMoney } from '@akhatmirzo/core';
import { Slider } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function SliderRange() {
const [price, setPrice] = useState([1_000_000, 3_500_000]);
return (
<div className="flex w-full max-w-sm flex-col gap-4">
<Slider
value={price}
onValueChange={setPrice}
min={0}
max={5_000_000}
step={50_000}
minStepsBetweenThumbs={2}
formatValue={(v) => formatMoney(v)}
aria-label="Narx"
/>
<p className="m-0 text-sm text-text-muted">
Narx:{' '}
<span className="font-semibold text-text tabular-nums">
{formatMoney(price[0]!)} — {formatMoney(price[1]!)}
</span>
</p>
</div>
);
}
Qiymat pufakchasi
showValue — tutqich ustidagi qiymat (Tooltip uslubida):
| Qiymat | Qachon ko'rinadi |
|---|---|
active (standart) | Sichqoncha ustida turganda, sudrashda va fokus olganda |
always | Doim |
never | Hech qachon |
'use client';
import { Slider } from '@akhatmirzo/ui';
export default function SliderShowValue() {
return (
<div className="flex w-full max-w-sm flex-col gap-10 pt-8">
<Slider defaultValue={[30]} showValue="active" aria-label="Faol paytda" />
<Slider defaultValue={[60]} showValue="always" aria-label="Doim" />
<Slider defaultValue={[80]} showValue="never" aria-label="Hech qachon" />
</div>
);
}
Belgilar
marks — trek ostidagi chiziqcha va yozuvlar. Belgilar faqat ko'rsatish uchun: qiymatni step
cheklaydi.
'use client';
import { Slider } from '@akhatmirzo/ui';
const marks = [
{ value: 0, label: '0%' },
{ value: 25, label: '25%' },
{ value: 50, label: '50%' },
{ value: 75, label: '75%' },
{ value: 100, label: '100%' },
];
export default function SliderMarks() {
return (
<div className="w-full max-w-sm">
<Slider
defaultValue={[25]}
step={25}
marks={marks}
formatValue={(v) => `${v}%`}
aria-label="Chegirma"
/>
</div>
);
}
O'lchamlar va holatlar
size — md (trek 6px, tutqich 20px, standart) yoki sm (4px / 16px). Tutqichning bosish
maydoni ikkala o'lchamda ham kamida 40px. disabled — sudrab bo'lmaydi va fokus olmaydi.
'use client';
import { Slider } from '@akhatmirzo/ui';
export default function SliderSizes() {
return (
<div className="flex w-full max-w-sm flex-col gap-8">
<Slider size="sm" defaultValue={[35]} aria-label="Kichik" />
<Slider size="md" defaultValue={[65]} aria-label="O'rta" />
<Slider defaultValue={[50]} disabled aria-label="O'chirilgan" />
</div>
);
}
Field bilan
Field ichida label tutqich nomiga aylanadi, izoh va xato aria-describedby ga
ulanadi, error bo'lsa slider invalid holatga o'tadi (tutqich va to'lgan qism qizil).
Do'kondan necha km uzoqlikkacha yetkazasiz
40 km dan uzoqqa kuryer yo'q
'use client';
import { Field, Slider } from '@akhatmirzo/ui';
import { useState } from 'react';
export default function SliderWithField() {
const [km, setKm] = useState([45]);
return (
<div className="w-full max-w-sm">
<Field
label="Yetkazib berish radiusi"
description="Do'kondan necha km uzoqlikkacha yetkazasiz"
error={km[0]! > 40 ? "40 km dan uzoqqa kuryer yo'q" : undefined}
>
<Slider value={km} onValueChange={setKm} max={60} formatValue={(v) => `${v} km`} />
</Field>
</div>
);
}
Vertikal
orientation="vertical" — slider ota elementning balandligini egallaydi (kamida 160px).
Klaviaturada ↑ ↓ ham ishlaydi.
'use client';
import { Slider } from '@akhatmirzo/ui';
export default function SliderVertical() {
return (
<div className="flex h-48 items-stretch gap-10 pl-12">
<Slider orientation="vertical" defaultValue={[70]} aria-label="Ovoz" />
<Slider orientation="vertical" defaultValue={[20, 60]} aria-label="Harorat" />
</div>
);
}
Forma va API
nameberilsa,<form>ichida har bir tutqich uchun yashirin<input>yaratiladi: bitta tutqichdaname, oraliqdaname[].onValueChange— har bir siljishda;onValueCommit— sudrash tugaganda (yoki klaviatura bilan o'zgarganda) bir marta. Server so'rovlarinionValueCommitga ulang.
<Slider
defaultValue={[20]}
onValueChange={setPreview} // har siljishda
onValueCommit={(v) => saveSettings({ volume: v[0] })} // qo'yib yuborilganda
/>Props
Qolgan <span> atributlari va Radix Root prop'lari (dir, form) ham qabul qilinadi; ref
ildiz elementga tushadi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
value | number[] | — | Qiymat (boshqariladigan rejim) |
defaultValue | number[] | [min] | Boshlang'ich qiymat |
onValueChange | (value: number[]) => void | — | Har bir o'zgarishda |
onValueCommit | (value: number[]) => void | — | Sudrash tugaganda yoki klaviatura bilan o'zgarganda |
min | number | 0 | Eng kichik qiymat |
max | number | 100 | Eng katta qiymat |
step | number | 1 | Qadam |
minStepsBetweenThumbs | number | 0 | Tutqichlar orasidagi eng kichik masofa (qadamlarda) |
orientation | 'horizontal' | 'vertical' | 'horizontal' | Yo'nalish |
size | 'sm' | 'md' | 'md' | Trek 4 / 6px, tutqich 16 / 20px |
showValue | 'never' | 'active' | 'always' | 'active' | Tutqich ustidagi qiymat pufakchasi |
formatValue | (value: number) => string | String | Pufakcha va aria-valuetext matni |
marks | { value: number; label?: ReactNode }[] | — | Trek ostidagi belgilar |
disabled | boolean | — | Sliderni o'chiradi |
invalid | boolean | — | Xato holati (Field ichida avtomatik) |
name | string | — | Forma uchun: har bir tutqichga yashirin input (oraliqda name[]) |
labels | { thumb?: (index: number, count: number) => string } | 'Qiymat' | 'Minimal qiymat' / 'Maksimal qiymat' | Tutqichlarning ekran o'quvchi uchun nomi |
aria-label | string | — | Field bo'lmasa — slider nomi (oraliqda tutqich nomi bilan qo'shiladi) |
Data atributlari
| Atribut | Qayerda | Qiymat |
|---|---|---|
data-size | ildiz | sm · md |
data-orientation | ildiz, trek, tutqich | horizontal · vertical |
data-disabled | ildiz, trek, tutqich | o'chirilganda mavjud |
data-invalid | ildiz | xato holatida mavjud |
data-slot | trek, to'lgan qism, ... | slider-track · slider-range · slider-thumb · slider-value · slider-marks |
Klaviatura
| Tugma | Harakat |
|---|---|
← ↓ / → ↑ | Bir qadam kamaytirish / oshirish |
PageDown / PageUp | 10 qadam kamaytirish / oshirish |
Shift + strelka | 10 qadam |
Home / End | min / max |
Tab | Keyingi tutqichga o'tish |
Accessibility
- Rol. Har bir tutqich —
role="slider",aria-valuemin,aria-valuemax,aria-valuenow,aria-orientationbilan. Asosida Radix Slider. - Matnli qiymat.
aria-valuetext=formatValuenatijasi — ekran o'quvchi "1 500 000 so'm" deb o'qiydi, "1500000" emas. - Nom.
Fieldichida tutqich label bilanaria-labelledbyorqali bog'lanadi. Oraliqda har tutqich nomi: label + "Minimal qiymat" / "Maksimal qiymat" (labels.thumbbilan o'zgartiriladi). Field bo'lmasa —aria-labelbering. - Xato.
Fieldning izohi va xatosiaria-describedbyga, xato holatiaria-invalidga tushadi. - Pufakcha va belgilar bezak —
aria-hidden(qiymataria-valuetextda allaqachon bor). - Touch. Tutqichning ko'rinmas bosish maydoni kamida 40px.