GH GambleHub

Interfață card și blocuri vizuale

1) De ce carduri

Cărțile ambalează o entitate (joc, meci, acțiune, articol) cu atribute și acțiuni cheie. Carte bună:
  • scanat rapid,
  • dă un singur maestru CTA,
  • se adaptează la diferite containere/coloane,
  • previzibil în comportament (hover, apăsați, focus, meniu contextual).

2) Anatomia unui card

Compoziția minimă:

1. Zonă media (copertă/logo/previzualizare, 16: 9/4: 3/1: 1).

2. Antet (1-2 linii trunchiate).

3. Metadate (subtitrare, etichetă/categorie, furnizor, timp).

4. Insigne de stare (noi, live, promovare, evaluare).

5. CTA/acțiuni rapide (buton sau pictograme).

6. Text secundar (linii scurte, max 2-3).

7. Controale (favorite,... context).

Ierarhie: media antet CTA meta secundar. Acțiunile distructive sunt ascunse sau afișate în meniu.

3) Grile și machete

Grilă (coloană fixă): 2-6 coloane, ■ prin auto-fit/auto-umplere.
Plăci receptive: „minmax (240px, 1fr)” - cărțile cresc exact până la frontiere.
Zidărie/înălțime variabilă: atent; asigură ordinea focalizării și lizibilitatea.
Listă (într-un rând): atunci când economia orizontală și sortarea sunt importante.

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) Densitate și ritm

Margini/liniuțe: interior 12-16 px; între unitățile 8-12 px.
Înălțimea rândului: 1. 3–1. 5; fonturi: titlul 16-18 px, meta 12-14 px.
Tăiere text: „linie-clemă: 2-3”; obligatoriu text complet în tooltip/detalii.

5) Stări și interactivitate

Hover/Focus/Active: umbră/evidențiere, dar fără aspect „salturi”; „: focus-vizibil” întotdeauna vizibil.
Selectabil: caseta de selectare/cadru; a nu se confunda cu un card de referinţă.
Apăsat: scădeți până la 98% + umbră în jos (≤ 120 ms).
Ocupat/Încărcare: schelet, nu „gol”.

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) Imagini și mass-media

Raportul de aspect este fix; pe listele de jocuri - 16:9 sau 4:3.
Încărcare leneşă: 'încărcare =' leneş '' + 'decodare =' async' '.
Înlocuitor/schelet cu culoare dominantă poster.
Eroare de încărcare: imagine inactivă + pictogramă imagine-off.

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

7) Insigne și etichete

Scurt (1-2 cuvinte): Nou, Live, -20%, Top 10.
Nu vă puteți baza doar pe culoare - adăugați o pictogramă/text.
Locul de amplasare: partea de sus stânga mass-media; mai multe - într-o stivă cu un decalaj de 4-6 px.

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 și acțiune rapidă

Un primar pe carte (de exemplu, „Play”, „Bet”).
Icoane auxiliare (favorite, share,...) - prin hover/focus.
Distructive - prin confirmare sau anulare-panou.

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) Disponibilitate (A11y)

Întreaga carte de legătură este „<a>” cu o „etichetă arie” clară, altfel: titlul este ca un link, restul este static.
Ordinea Tab-ului corespunde vizualului; inelul de focalizare este vizibil.
Imagini cu „alt”; decorativ -' aria-ascuns =” adevărat”'.
Pentru statusuri, utilizați „rol =” stare „”/„ aria-live =” politicos „”.
Text și contrast insignă ≥ AA; sensul nu este doar culoare.

10) Performanță

Încărcarea leneș de mass-media și liste; paginare sau infinita defilare cu santinela-observator.
Virtualizare pentru ieşiri pe bandă/infinit (± elemente 10k).
Minimizaţi fluxul: Animaţi numai 'transformare/opacitate'.
Redați carduri cu schelete și înlocuiți cu conținut după încărcarea datelor.

11) Schelete, greșeli, gol

Scheletul repetă structura cardului (media/text/buton), fără strălucire agresivă; luați în considerare „prefers-redusă-mișcare”.
Stare de eroare: pictograma + text scurt („Nu a reușit să încarce jocul”) + butonul Retry.
Stare goală: pictogramă/ilustrație, explicație, „Ce urmează” (filtru/căutare/abonamente).

12) Gestionarea conținutului

Truncation: „line-clamp” + tooltip explicit.
Numere/sume lungi: cifre tabel: 'font-variant-numeric: tabular-nums; '.
Localizare: rezervă + 20-30% lățime pentru etichete lungi.
Suport RTL: insigne/pictograme și alinieri.

13) Temă întunecată și contrast

Umbrele sunt mai slabe, folosesc frontierele („1px”) cu transparență.
Suport AAA pentru fonturi mici; evita pâlpâituri.
Media este întunecată de un voal subțire (suprapunere 8-12%) pentru a face textul ușor de citit.

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) Sortare, filtre, paginare

Panou filtru sus/lateral; rezultatul este o grilă de cărți.
Paginarea este vizibilă; defilare fără sfârșit - numai cu „Înapoi la început” și păstrarea poziției.
Filtrele nu „resetează” derularea; aplicat rapid (≤ 100 ms) sau cu indicator.

15) Specificul iGaming

15. 1 Carte de joc (slot/masă)

Media: 16:9 poster, logo-ul furnizorului.
Metadate: furnizor, RTP, volatilitate, categorii (- doar informativ, fără promisiuni de câștig).
Insigne: Nou, Popular, Turneu, Jackpot.
CTA: "Play" + "Demo. "Contextul "18 +" și jocul responsabil sunt vizibile.

15. 2 Card de potrivire/coeficient

Live insigna Live; cronometru/perioadă.
Coeficienți cheie (2-3) cu hover instant/presă și anulare în condiții de siguranță (dacă este permis).
Actualizări fără flicker; atunci când se schimbă cursul - iluminare îngrijită.

15. 3 carte de turneu/eveniment

Date, fond de premiere, reguli (link).
Status (Înregistrare deschisă/închisă, în curs).
CTA „Alăturați-vă”, „Reguli”; progresul participării (puncte/loc).

16) Antipattern

Întreaga carte este clickable + în interiorul link-uri secundare (focus/click capcane).
Două CTA-uri primare din apropiere („Play” și „Buy Bonus”) - competiție de atenție.
Nu există înlocuitori/schelete → grila de sărituri (CLS).
Efecte strălucitoare nesfârșite; animație umbră/ceață (scump).
Metadate coloană în gri mic pe gri (nici un contrast).
Insigne care transmit sensul numai în culoare.

17) Proiectarea tokenurilor sistemului (exemplu)

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) Fragmente

Reacție: card universal

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>
);
}

Santinelă de derulare infinită

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

19) Măsurători și experimente

CTR primar-CTA и Time-to-Click.
Derulați-adâncime → faceți clic pe: faceți clic pe „peste îndoire „/” sub îndoire ”.
Card → vizualizare detalii → conversie.
Vizibilitatea ecusoanelor și impactul acestora asupra CTR.
Timp vizibil schelet и CLS.
A/B: dimensiunea cardurilor, cantitatea de metadate, vizibilitatea acțiunilor rapide, tipul grilei (listă/grilă).

20) Lista de verificare QA

Disponibilitate

Inelele de focalizare sunt vizibile; Ordinea filelor este logică.

  • Textele Alt și „eticheta aria” sunt corecte; insigne de stare cu text.
  • Contrast text/fundal ≥ AA.

Comportament

  • Un primar-CTA; acțiunile rapide nu se suprapun scenariului principal.
  • Hover/apăsați/selectat distinctiv; meniul contextual funcționează.
  • Gol/erori/schelete sunt corecte; Uite-l pe Retry.

Performanță

  • Încărcare media leneșă; nu există salturi ascuțite în aspect.
  • Virtualizarea listelor mari; animații „transform/opacitate”.

Grilă

  • „minmax (240px, 1fr)” și „decalaj” sunt adaptive; Zidăria nu rupe ordinea de focalizare/citire.
  • RTL/localizare nu „rupe” decuparea și insigne.

21) Documentația în sistemul de proiectare

Компоненты: 'Card',' GameCard', 'MatchCard',' TournamentCard', 'StatusBadge', 'SkeletonCard'.
Jetoane: rază/umbre/liniuțe/straturi, culori insignă, animații.
Modele: „One CTA”, „Skeleton în loc de spinner”, „Infinite scrolling + menținerea poziției”.
Do/Don' t galerie: card supraîncărcat vs minim, „carte întreagă clickable” vs elemente explicite.

Scurt rezumat

Cardurile funcționează atunci când au o ierarhie clară, un master CTA, stări previzibile, grile stabile și respect pentru performanță și accesibilitate. Capturați jetoane și modele, utilizați schelete și încărcare leneșă, păstrați conținutul concis - iar interfețele cardurilor vor deveni rapide, ușor de citit și gata de conversie, în special în scripturile iGaming.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Telegram
@Gamble_GC
Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.