GH GambleHub

Interface de cartas e blocos visuais

1) Porquê os cartões

Os cartões embalam a entidade (jogo, jogo, promoção, artigo) com atributos e ações essenciais. Bom cartão:
  • rapidamente escaneado,
  • dá um CTA principal,
  • adaptável a diferentes contêineres/colunas,
  • previsível por comportamento (hover, press, foco, menu contextual).

2) Cartão anatomia

Composição mínima:

1. Área de mídia (capa/logo/suprimento, 16: 9/4: 3/1: 1).

2. Cabeçalho (1-2 linhas truncadas).

3. Metadados (subtítulo, tag/categoria, provedor, tempo).

4. Bage status (novidades, live, promoção, classificação).

5. Ação 100/rápida (botão ou ícone).

6. Texto secundário (curto, 2-3 linhas max).

7. Controladores (favoritos,... contexto).

Hierarquia: cabeçalho de mídia CTA meta secundário. As ações destrutivas estão ocultas ou inseridas no menu.

3) Malhas e disposição

Grid (coluna fixa): 2-6 colunas; adaptando por auto-fit/auto-fill.
Responsive tiles: 'minmax (240px, 1fr)' - os cartões crescem exatamente até os limites.
Masonry/altura variável: cuidado; garantir a ordem de foco e a lisura.
Lista: quando a economia horizontal e a triagem são importantes.

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) Densidade e ritmo

Campos/recuos: dentro de 12-16 px; entre os blocos 8-12 px.
Altura da linha: 1. 3–1. 5; fontes: título 16-18 px, meta 12-14 px.
Texto clipping: 'line-clamp: 2-3'; o texto completo é obrigatório em tooltip/detalhes.

5) Estados e interatividade

Hover/Focus/Action: sombra/realce, mas sem «saltos» de layout; ': focus-visível' é sempre visto.
Selectível: checkbox/moldura; não confundir com o cartão de referência.
Pressed: redução de 98% + sombra para baixo (≤ 120 ms).
Busy/Loading: esqueleton, não «vazio».

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) Imagens e mídia

Aspect-ratio é fixo; nas listas de jogos - 16:9 ou 4:3.
Carregamento preguiçoso: 'loading =' lazy '' + 'decoding =' async '.
Playsholder/skeleton com a cor dominante do pôster.
Erro de carregamento: imagem de fachada + ícone «image-off».

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

7) Crachás e marcas

Palavras curtas (1-2): New, Live, -20%, Top 10.
Não pode confiar apenas na cor - adicione um ícone/texto.
Localização: topo esquerdo da mídia; várias em uma pilha com espaço 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 e ação rápida

Um primary por cartão (por exemplo, «Jogar», «Apostar»).
Ícones auxiliares (favoritos, compartilhar,...) - por hover/foco.
Destrutivos - através de confirmação ou painel undo.

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

Todo o cartão-referência é '<a>' com 'aria-label' claro, senão, o título como referência, o resto como estático.
A ordem do Tab corresponde ao visual; O anel de foco pode ser visto.
Imagens de 'alt'; decoração - 'aria-hidden =' true '.
Para estatais, use 'role =' status '/' aria-live = 'polite'.
Contraste de texto e crachá ≥ AA; Não se trata apenas de cor.

10) Performance

Carregamento preguiçoso de mídia e listas; paginação ou impinit scroll com sensry-observador.
Virtualização para emissões de fita/infinitas (£10k elementos).
Minimize o reflow: Anistie apenas 'trans/opacity'.
Renderize os cartões com esqueletos e substitua o conteúdo após carregar os dados.

11) Esqueletos, erros, vazios

O skeleton repete a estrutura do cartão (mídia/texto/botão), sem um shimmer agressivo; considere «preferers-reduced-motion».
Erro-state: ícone + texto curto («Não foi possível carregar o jogo») + botão Retry.
Empty-state: ícone/ilustração, explicação, «O seguinte» (filtro/pesquisa/assinatura).

12) Gerenciamento de conteúdo

Corte: 'line-clamp' + dicas explícitas (tooltip).
Números/somas longos: Números de tabela: 'fonte-variant-numérico: tabular-nums;'.
Localização: reserva + 20-30% de largura para editoras longas.
Apoio de apoio para flip crachás/ícones e alinhamentos.

13) Tema escuro e contraste

As sombras são mais fracas, use os limites ('1px') com transparência.
Suporte AAA para fontes pequenas; Evite os estranhos.
A mídia é escurecida por um véu fino (overlay 8-12%) para que o texto seja lido.

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) Triagem, filtros, paginação

Barra de filtros superior/lado; o resultado é uma grade de cartões.
A paginação é visível; O scroll infinito é apenas com «De volta para o início» e mantém a posição.
Filtros não «removem» scroll; aplicam-se rapidamente (≤ 100 ms) ou com um indicador.

15) Especificidades iGaming

15. 1 Cartão de jogo (slot/mesa)

Mídia: pôster 16:9, logotipo do provedor.
Metadados: provedor, RTP, volatilidade, categorias (- apenas informação, sem promessas de ganho).
Bage, New, Popular, Turnement, Jackpot.
CTA: «Jogar» + «Demo». O contexto «18 +» e o jogo responsável são visíveis.

15. 2 Cartão de jogo/coeficiente

Crachá ao vivo Live; timer/período.
Coeficientes chave (2-3) com hover/press instantâneo e undo seguro (se permitido).
Atualizações sem parafusos; quando o curso é alterado, realce com cuidado.

15. 3 Cartão do torneio/iventa

Datas, prémios, regras (referência).
Status («Inscrição aberta/encerrada», «Em andamento»).
CTA «Aderir», «Regras»; progresso da participação (pontos/local).

16) Antipattern

Toda a ficha é clicada + dentro de links secundários (armadilhas de foco/clique).
Dois primary-CTA ao lado («Jogar» e «Comprar bônus») - competição de atenção.
Falta de playsholders/esqueletos → grade «saltitante» (CLS).
Efeitos shimmer sem fim; animação sombra/blur (caro).
Metadados «em coluna» cinza em cinza (sem contraste).
Crachás que só transmitem o significado em cores.

17) Sistema de design de tokens (exemplo)

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

React: cartão 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>
);
}

Impinit scroll 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) Métricas e experiências

CTR primary-CTA и Time-to-Click.
Scroll-depth → click: cliques «acima do dobro »/« abaixo do dobro».
Cartão → exibição de detalhes → conversão.
Visibilidade dos crachás e sua influência na CTR.
Skeleton visible time и CLS.
A/B: tamanho dos cartões, quantidade de metadados, visibilidade de ação rápida, tipo de grade (lista/grid).

20) QA-folha de cheque

Disponibilidade

  • Os anéis de foco são visíveis; a ordem de Tab é lógica.
  • Os textos alt e 'aria-label' são corretos; Status-crachá com texto.
  • Contraste texto/fundo ≥ AA.

Comportamento

  • Um primary-CTA; ações rápidas não se sobrepõem ao cenário principal.
  • Hover/press/selected são diferentes; o menu contextual funciona.
  • Os/erros/esqueletos vazios são corretos; há Retry.

Performance

  • Carregamento preguiçoso de mídia; Não há subidas bruscas de layout.
  • Virtualização de listas maiores; animação 'transform/opacity'.

Grade

  • 'minmax (240px, 1fr)' e 'gap' são adaptáveis; Masonry não quebra o foco/ordem de leitura.
  • A localização não «quebra» o corte e os crachás.

21) Documentação em design

Компоненты: `Card`, `GameCard`, `MatchCard`, `TournamentCard`, `StatusBadge`, `SkeletonCard`.
Tocos: raio/sombra/recuo/camadas, cores de crachá, animação.
Pattern: «Um CTA», «Skeleton em vez de spinner», «Impinit scroll + manter a posição».
Do/Don 't galeria: cartão vs sobrecarregado mínimo, «clicado todo cartão» vs itens explícitos.

Resumo curto

Os cartões funcionam quando têm uma hierarquia clara, um CTA principal, condições previsíveis, malhas sustentáveis e respeito pela performance e disponibilidade. Fixe os tocadores e pattern, use esqueletos e downloads preguiçosos, mantenha o conteúdo conciso - e as interfaces de cartas tornam-se rápidas, legíveis e conversíveis, especialmente em cenários de iGaming.

Contact

Entrar em contacto

Contacte-nos para qualquer questão ou necessidade de apoio.Estamos sempre prontos para ajudar!

Telegram
@Gamble_GC
Iniciar integração

O Email é obrigatório. Telegram ou WhatsApp — opcionais.

O seu nome opcional
Email opcional
Assunto opcional
Mensagem opcional
Telegram opcional
@
Se indicar Telegram — responderemos também por lá.
WhatsApp opcional
Formato: +indicativo e número (ex.: +351XXXXXXXXX).

Ao clicar, concorda com o tratamento dos seus dados.