HoverCard
Havola ustiga kursor kelganda chiqadigan oldindan ko'rish kartasi: profil, mahsulot, havola tafsiloti.
Kutubxona muallifi — @akhatmirzo.
'use client';
import { Avatar, Badge, HoverCard } from '@akhatmirzo/ui';
import { CalendarDays } from 'lucide-react';
export default function HoverCardProfile() {
return (
<p className="m-0 text-sm">
Kutubxona muallifi —{' '}
<HoverCard>
<HoverCard.Trigger asChild>
<a
href="https://github.com/Akhatmirzo"
className="focus-ring rounded-sm font-medium text-primary underline-offset-4 hover:underline"
>
@akhatmirzo
</a>
</HoverCard.Trigger>
<HoverCard.Content align="start">
<div className="flex gap-3">
<Avatar name="Akhatmirzo Umarov" />
<div className="flex min-w-0 flex-col gap-1">
<span className="font-semibold">Akhatmirzo Umarov</span>
<span className="text-text-muted">
Frontend dasturchi. React, TypeScript va o'zbekcha UI.
</span>
<span className="mt-1 flex items-center gap-2 text-xs text-text-muted">
<CalendarDays className="size-3.5" aria-hidden="true" />
2021-yildan beri
<Badge size="sm" color="success">
Ochiq
</Badge>
</span>
</div>
</div>
</HoverCard.Content>
</HoverCard>
.
</p>
);
}
Import
import { HoverCard } from '@akhatmirzo/ui';Qachon ishlatish
- Havola orqasidagi narsani oldindan ko'rsatish — foydalanuvchi profili, mahsulot, hujjat. Foydalanuvchi sahifadan chiqmasdan "bu nima?" degan savolga javob oladi.
- Faqat qo'shimcha ma'lumot. Karta sensorli ekranda ochilmaydi va ekran o'quvchi uni o'qimasligi mumkin — trigger o'zi havola bo'lsin, ma'lumot esa havola ochadigan sahifada ham bo'lsin.
- Qisqa matnli izoh uchun —
Tooltip. - Ichida tugma, forma kerak bo'lsa — bosish bilan ochiladigan
Popover.
Tuzilishi
| Qism | Vazifasi |
|---|---|
HoverCard | Holat va kechikishlar: openDelay, closeDelay, open |
HoverCard.Trigger | Havola (standart — <a>; o'z elementingiz uchun asChild) |
HoverCard.Content | Panel: Popover bilan bir xil ko'rinish, portal, joylashuv, size |
<HoverCard openDelay={400}>
<HoverCard.Trigger asChild>
<a href="/u/akhatmirzo">@akhatmirzo</a>
</HoverCard.Trigger>
<HoverCard.Content side="bottom" align="start">
…profil…
</HoverCard.Content>
</HoverCard>Karta kursor kelgandan 500ms keyin ochiladi va kursor ketgandan 200ms keyin yopiladi — tasodifiy o'tib ketishda chiqmaydi, kartaga o'tish uchun esa vaqt qoladi. Klaviatura bilan fokuslanganda ham ochiladi.
O'lchamlar
size — sm (240px) yoki md (320px, standart). Boshqa kenglik uchun className bering.
'use client';
import { HoverCard } from '@akhatmirzo/ui';
export default function HoverCardSizes() {
return (
<div className="flex flex-wrap items-center gap-6 text-sm">
{(['sm', 'md'] as const).map((size) => (
<HoverCard key={size}>
<HoverCard.Trigger asChild>
<a
href="#chorsu"
className="focus-ring rounded-sm font-medium text-primary underline underline-offset-4"
>
size="{size}"
</a>
</HoverCard.Trigger>
<HoverCard.Content size={size}>
<p className="m-0 font-semibold">Chorsu Market</p>
<p className="m-0 mt-1 text-text-muted">
Toshkentdagi onlayn do'kon: 12 000+ mahsulot, 1 kunda yetkazib berish.
</p>
</HoverCard.Content>
</HoverCard>
))}
</div>
);
}
Joylashuv
side — top, right, bottom (standart) yoki left; align — start, center (standart)
yoki end. Panel triggerdan 6px uzoqlikda turadi va ekran chetiga yetsa, teskari tomonga o'tadi.
'use client';
import { Button, HoverCard } from '@akhatmirzo/ui';
const sides = ['top', 'right', 'bottom', 'left'] as const;
export default function HoverCardPlacement() {
return (
<div className="flex flex-wrap items-center gap-3">
{sides.map((side) => (
<HoverCard key={side} openDelay={200} closeDelay={100}>
<HoverCard.Trigger asChild>
<Button variant="outline">{side}</Button>
</HoverCard.Trigger>
<HoverCard.Content side={side} size="sm">
<p className="m-0">
Panel <b>{side}</b> tomonda. Ekran chetiga yetsa, o'zi teskari tomonga o'tadi.
</p>
</HoverCard.Content>
</HoverCard>
))}
</div>
);
}
Muhim ma'lumotni yashirmang
Telefon va planshetda hover yo'q — HoverCard u yerda umuman ochilmaydi. Narx, holat, xato kabi muhim ma'lumot sahifaning o'zida ko'rinsin.
Props
HoverCard
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
openDelay | number | 500 | Kursor kelgandan keyin ochilish kechikishi, ms |
closeDelay | number | 200 | Kursor ketgandan keyin yopilish kechikishi, ms |
open | boolean | — | Ochiqmi (boshqariladigan rejim) |
defaultOpen | boolean | — | Boshlang'ich holatda ochiq |
onOpenChange | (open: boolean) => void | — | Ochilib-yopilganda |
HoverCard.Content
Radix HoverCard.Content ning qolgan prop'lari (alignOffset, avoidCollisions ...), <div>
atributlari va ref ham qabul qilinadi.
| Prop | Tip | Standart | Tavsif |
|---|---|---|---|
size | 'sm' | 'md' | 'md' | Kenglik: 240 / 320px |
side | 'top' | 'right' | 'bottom' | 'left' | 'bottom' | Qaysi tomonda ochiladi |
align | 'start' | 'center' | 'end' | 'center' | Trigger bo'ylab tekislash |
sideOffset | number | 6 | Triggerdan masofa, px |
collisionPadding | number | 8 | Ekran chetidan minimal masofa, px |
container | HTMLElement | null | — | Portal konteyneri (standart — document.body) |
Data atributlari
| Atribut | Qayerda | Qiymat |
|---|---|---|
data-state | trigger, panel | open · closed |
data-side | panel | top · right · bottom · left |
data-size | panel | sm · md |
Accessibility
- Faqat qo'shimcha. Karta ekran o'quvchiga e'lon qilinmaydi va fokus unga o'tmaydi — undagi ma'lumot havola ochadigan sahifada ham bo'lishi kerak.
- Klaviatura. Trigger fokus olganda karta ochiladi, fokus ketganda yopiladi;
Escham yopadi. - Sensorli ekran. Touch bilan ochilmaydi — bosish havolaning o'zini ochadi.
- Ichida interaktiv element (tugma, forma) qo'ymang — ularga klaviatura bilan yetib bo'lmaydi.
Bunday holatda
Popoverishlating.