GH GambleHub

Kart interfeysi və vizual bloklar

1) Niyə kartlar

Kartlar əsas atributlar və hərəkətlərlə mahiyyəti (oyun, matç, aksiya, məqalə) qablaşdırır. Yaxşı kart:
  • tez taranır,
  • bir əsas CTA verir,
  • müxtəlif konteynerlərə/sütunlara uyğunlaşır,
  • davranış proqnozlaşdırıla bilər (hover, press, fokus, kontekstli menyu).

2) Kartın anatomiyası

Minimum tərkibi:

1. Media zonası (üz qabığı/loqo/preview, 16: 9/4: 3/1: 1).

2. Başlıq (1-2 kəsikli sətirlər).

3. Metadata (altbaşlıq, tag/kateqoriya, provayder, vaxt).

4. Status nişanları (yeni, canlı, aksiya, reytinq).

5. STA/sürətli hərəkətlər (düymə və ya nişanlar).

6. İkincili mətn (qısa, 2-3 sətir max).

7. Nəzarət (seçilmiş,... kontekst).

Hiyerarxiya: media → başlıq → CTA → meta → ikincil. Dağıdıcı hərəkətlər gizli və ya menyuda verilir.

3) Mesh və düzən

Grid (sabit sütun): 2-6 sütun; auto-fit/auto-fill vasitəsilə adaptasiya.
Responsive tiles: 'minmax (240px, 1fr)' - kartlar düz sərhədlərə qədər böyüyür.
Masonry/dəyişən hündürlük: diqqətlə; fokus və oxunabilirlik qaydasını təmin edin.
List (bir sıra): üfüqi qənaət və çeşidlənmə vacib olduqda.

css
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px,1fr));
gap: 16px;
}
.card {
border-radius: 12px;
background: var(--bg-elevated);
box-shadow: var(--elev-2);
display: grid;
grid-template-rows: auto 1fr auto;
overflow: hidden;
}
.card__media { aspect-ratio: 16/9; object-fit: cover; }

4) Sıxlıq və ritm

Sahələr/girintilər: 12-16 px daxilində; 8-12 px blokları arasında.
Sətir hündürlüyü: 1. 3–1. 5; şriftlər: başlıq 16-18 px, meta 12-14 px.
Mətn klippinqi: 'line-clamp: 2-3'; tooltip/detallarda tam mətn tələb olunur.

5) Vəziyyət və interaktivlik

Hover/Focus/Active: kölgə/işıqlandırma, lakin «atlama» maketi olmadan; ': focus-visible' həmişə görürük.
Selectable: checkbox/çərçivə; link kartı ilə qarışdırmayın.
Pressed: 98% -ə qədər azalma + aşağı kölgə (≤ 120 ms).
Busy/Loading: skelet deyil, «boş».

css
.card:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.card:hover { box-shadow: var(--elev-3); transform: translateY(-1px); transition: box-shadow. 16s, transform. 16s; }

6) Şəkillər və Media

Aspect-ratio sərt sabit; oyunlar siyahısında - 16:9 və ya 4:3.
Tənbəl yükləmə:' loading =» lazy»' +' decoding =» async»'.
Dominant afişa rəngi ilə pleysholder/skelet.
Yükləmə səhvi: saxta şəkil + «image-off» simgəsi.

html
<img class = "card __ media" src ="..." alt = "Game name" loading =" lazy" onerror =" this. src='/fallback. png'">

7) Nişanlar və nişanlar

Qısa (1-2 söz): Yeni, Canlı, -20%, Top 10.
Yalnız rəngə güvənmək olmaz - ikona/mətn əlavə edin.
Yerləşmə: media sol üst; bir neçə - 4-6 px boşluğu ilə yığın.

css
.badge { display:inline-flex; gap:6px; align-items:center; padding:4px 8px; border-radius:8px; font-size:.75rem; }
.badge--live { background: var(--bg-danger); color: var(--on-danger); }

8) CTA və sürətli fəaliyyət

Kart başına bir primary (məsələn, «Oyna», «Bahis et»).
Köməkçi nişanlar (seçilmiş, paylaşmaq,...) - hover/fokus.
Destruktiv - təsdiq və ya undo panel vasitəsilə.

html
<div class="card__actions">
<button class="btn btn--primary">Играть</button>
<button class =" icon" aria-label = "Add to Favorites" title =" B Favorites "> </button>
<button class="icon" aria-haspopup="menu" aria-expanded="false">⋯</button>
</div>

9) Mövcudluq (A11y)

Bütün link kartı - '<a>' ilə başa düşülən 'aria-label', əks halda: başlıq link kimi, qalanları statikdir.
Tab sifariş vizual uyğun; focus ring görünür.
Şəkillər 'alt'; dekorativ -' aria-hidden =» true»'.
Statuslar üçün 'role = «status» '/' aria-live = «polite»' istifadə edin.
Mətn və nişanların kontrastı ≥ AA; mənası yalnız rəng deyil.

10) Performans

Media və siyahıların tənbəl yüklənməsi; sentry müşahidəçi ilə pagination və ya infinit scroll.
Bant/sonsuz verilişlər üçün virtualizasiya (± 10k element).
Reflow-u minimuma endirin: yalnız 'transform/opacity' animasiya edin.
Kartları skeletonlarla render edin və məlumatları yüklədikdən sonra məzmunu əvəz edin.

11) Skeletonlar, səhvlər, boş

Skelet kart strukturunu təkrarlayır (media/mətn/düymə), aqressiv shimmer olmadan; 'prefers-reduced-motion' nəzərə alın.
Error-state: ikon + qısa mətn («Oyun yüklənə bilmədi») + Retry düyməsi.
Empty-state: Simge/illüstrasiya, izahat, «Sonrakı nə» (filter/axtarış/abunə).

12) Məzmunun idarə edilməsi

Kəsilməsi: 'line-clamp' + aydın ipuçları (tooltip).
Uzun ədədlər/cədvəllər: 'font-variant-numeric: tabular-nums;'.
Lokalizasiya: uzun etiketlər üçün ehtiyat + 20-30% enində.
RTL dəstəyi: flip nişanlar/simgələr və hizalama.

13) Qaranlıq mövzu və kontrast

Kölgələr zəifdir, sərhədləri ('1px') şəffaflıqla istifadə edin.
Kiçik şriftlər üçün AAA dəstəkləyin; titrəməkdən çəkinin.
Media mətnin oxunması üçün nazik örtüklə (8-12% overlay) qaralır.

css
.theme-dark. card { background: var(--bg-elevated-dark); box-shadow: var(--elev-1-dark); }
.theme-dark. card__media::after { content:""; position:absolute; inset:0; background: rgba(0,0,0,.12); }

14) Çeşidləmə, filtrlər, paginasiya

Filter paneli üst/yan; nəticə - kart şəbəkəsi.
Pagination görünür; sonsuz scroll - yalnız «Başlanğıc geri» və mövqeyi saxlamaq.
Filtrlər skroll «atmaq» deyil; tez (≤ 100 ms) və ya göstərici ilə tətbiq olunur.

15) iGaming xüsusiyyətləri

15. 1 Oyun kartı (slot/table)

Media: posteri 16:9, provayder loqosu.
Metadata: provayder, RTP, dəyişkənlik, kateqoriyalar (- yalnız məlumatlı, uduşsuz).
Nişanlar: New, Popular, Tournament, Jackpot.
CTA: «Play» + «Demo». Kontekst «18 +» və məsuliyyətli oyun - görünür.

15. 2 Matç/əmsal kartı

Canlı döş nişanı; taymer/dövr.
Ani hover/press və təhlükəsiz undo (əgər icazə verilirsə) ilə əsas əmsallar (2-3).
Titrəmədən yeniləmələr; kursu dəyişdikdə - diqqətli işıqlandırma.

15. 3 Turnir/tədbir kartı

Tarixlər, mükafat fondu, qaydalar (link).
Status («Qeydiyyat açıq/bağlıdır», «Gəlir»).
CTA «Qoşulmaq», «Qaydalar»; iştirak tərəqqi (xal/yer).

16) Antipattern

Bütün kart klikabildir + daxili ikincil linklər (fokus/klik tələləri).
Yaxınlıqda iki primary-CTA («Play» və «Bonus almaq») - diqqət rəqabət.
Heç bir pleysholder/skelet → «atlama» mesh (CLS).
Sonsuz shimmer effektləri; kölgə/blur animasiya (bahalı).
Metadata «sütun» kiçik boz boz (kontrast yoxdur).
Yalnız rənglə məna verən nişanlar.

17) Dizayn sistemi tokenləri (nümunə)

json
{
"card": {
"radius": 12,
"gap": 12,
"mediaRatio": "16/9",
"px": "12 12 12 12",
"shadow": { "rest": "var(--elev-2)", "hover": "var(--elev-3)" }
},
"badge": { "radius": 8, "px": "4 8", "icon": 14 },
"grid": { "gap": 16, "min": 240, "max": 1 },
"motion": { "hoverMs": 160, "pressMs": 100, "fadeMs": 160 },
"a11y": { "contrastAA": true, "focusRingWidth": 2, "focusRingOffset": 2 }
}

18) Snippetlər

React: universal kart

tsx type CardProps = {
title: string;
subtitle?: string;
mediaUrl?: string;
badges?: string[];
onPrimary?: () => void;
primaryLabel?: string;
onFav?: () => void;
children?: React. ReactNode;
};
export default function Card({
title, subtitle, mediaUrl, badges=[], onPrimary, primaryLabel='Открыть', onFav, children
}: CardProps){
return (
<article className="card group focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2">
<div className="relative">
{mediaUrl? <img className="w-full aspect-[16/9] object-cover" src={mediaUrl} alt={title}/>: <div className="aspect-[16/9] bg-neutral-200"/>}
<div className="absolute top-2 left-2 flex gap-1">
{badges. map(b => <span key={b} className="badge">{b}</span>)}
</div>
</div>
<div className="p-3 grid gap-2">
<h3 className="text-sm font-semibold line-clamp-2" title={title}>{title}</h3>
{subtitle && <p className="text-xs text-neutral-500 line-clamp-2">{subtitle}</p>}
{children}
<div className="flex items-center gap-8">
{onPrimary && <button className="btn btn--primary" onClick={onPrimary}>{primaryLabel}</button>}
{onFav && <button className="icon opacity-0 group-hover:opacity-100" aria-label="В избранное" onClick={onFav}></button>}
</div>
</div>
</article>
);
}

İnfinit-skroll sentry

js const sentry = document. querySelector('#sentry');
const io = new IntersectionObserver(entries=>{
if(entries. some(e=>e. isIntersecting)) loadMore();
}, { rootMargin: '200px' });
io. observe(sentry);

19) Metriklər və təcrübələr

CTR primary-CTA и Time-to-Click.
Scroll-depth → click: «bükülmə üzərində »/« bükülmə altında» klik.
Kart → təfərrüatlara baxın → konvertasiya.
Nişanların görünürlüyü və onların CTR-ə təsiri.
Skeleton visible time и CLS.
A/B: kartların ölçüsü, meta məlumatların sayı, sürətli hərəkətlərin görünürlüyü, mesh növü (list/grid).

20) QA-çek siyahısı

Mövcudluq

  • Focus ring görünür; Tab qaydası məntiqlidir.
  • Alt mətnlər və 'aria-label' düzgün; mətn ilə status nişanları.
  • Mətn/fon kontrastı ≥ AA.

Davranış

  • Bir primary-CTA; sürətli hərəkətlər əsas ssenarini örtmür.
  • Hover/press/selected fərqlidir; kontekstli menyu işləyir.
  • Boş/səhvlər/skeletlər doğrudur; Retry var.

Performans

  • Tənbəl media yükləmə; heç bir kəskin maket sıçrayışlar.
  • Böyük siyahıların virtuallaşdırılması; animasiya 'transform/opacity'.

Mesh

  • 'minmax (240px, 1fr)' və 'gap' adaptivdir; Masonry fokus/oxu qaydasını pozmur.
  • RTL/lokalizasiya kəsmə və nişanları «sındırmır».

21) Dizayn sistemində sənədləşmə

Компоненты: `Card`, `GameCard`, `MatchCard`, `TournamentCard`, `StatusBadge`, `SkeletonCard`.
Tokenlər: radius/kölgə/girintilər/qatlar, nişan rəngləri, animasiyalar.
Nümunələr: «Bir CTA», «Spinner əvəzinə skeleton», «İnfinit scroll + mövqeyi saxlamaq».
Do/Don 't-qalereyası: həddindən artıq yüklənmiş kart vs minimal, «bütün kart tıklanabilir» vs aşkar elementlər.

Qısa xülasə

Kartlar aydın bir iyerarxiya, bir əsas CTA, proqnozlaşdırıla bilən şərtlər, davamlı şəbəkələr və performans və əlçatanlığa hörmət olduqda işləyir. Tokenləri və nümunələri düzəldin, skeletlərdən və tənbəl yükləmələrdən istifadə edin, məzmunu lakonik saxlayın - və kart interfeysləri xüsusilə iGaming ssenarilərində sürətli, oxunaqlı və konversiyalı olacaq.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.