Pular para o conteúdo
Storybookv2Pacote

AppCard

Moléculas

Abrir no Storybook

Superfície de conteúdo composta com AppCardMedia, AppCardBody e AppCardFooter.

Quando usar: agrupar mídia, texto e ações relacionadas (produto, plano, prêmio) numa superfície elevada.

Quando não usar: uma lista simples de texto sem mídia ou ação própria; use Typography direto.

Importar

import { AppCard } from '@handsondigital/idplugger-ui'

CSS

Para carregar só o CSS deste componente (além do tokens.css), importe o arquivo dele; as dependências vêm por @import:

@import '@handsondigital/idplugger-ui/css/AppCard.css';

Com Tailwind 4 e camadas, use a variante em @layer idplugger-ui:

@import '@handsondigital/idplugger-ui/css/layer/AppCard.css';

Exemplos

Default

Exemplo: AppCard, Default
const Default = () => (
<div style={{ width: 298 }}>
<AppCard>
<AppCardMedia>
<AppThumb alt="Produto" />
</AppCardMedia>
<AppCardBody>
<Typography variant="h5" as="h3" style={{ margin: 0 }}>Nome do produto</Typography>
<Typography variant="body" style={{ margin: 0, color: 'var(--color-foreground-muted)' }}>
Descrição curta do produto participante da campanha.
</Typography>
</AppCardBody>
<AppCardFooter>
<AppButton size="full">Ver mais</AppButton>
</AppCardFooter>
</AppCard>
</div>
);

Planos

Exemplo: AppCard, Planos
const Planos = () => (
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(0, 260px))', gap: 24 }}>
<AppCard>
<AppCardMedia>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 155, background: 'var(--color-surface-muted)' }}>
<AppBadge>Básico</AppBadge>
</div>
</AppCardMedia>
<AppCardBody>
<Typography variant="h4" as="h3" style={{ margin: 0 }}>Básico</Typography>
<ul style={{ margin: 0, paddingInlineStart: 20, display: 'grid', gap: 8 }}>
<li>1 participação por mês</li>
<li>Suporte por e-mail</li>
</ul>
</AppCardBody>
<AppCardFooter>
<AppButton appearance="outline" size="full">Escolher</AppButton>
</AppCardFooter>
</AppCard>
<AppCard tone="brand">
<AppCardMedia>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 155 }}>
<AppBadge tone="primary">Enterprise</AppBadge>
</div>
</AppCardMedia>
<AppCardBody>
<Typography variant="h4" as="h3" style={{ margin: 0 }}>Enterprise</Typography>
<ul style={{ margin: 0, paddingInlineStart: 20, display: 'grid', gap: 8 }}>
<li>Participações ilimitadas</li>
<li>Suporte prioritário</li>
<li>Relatórios mensais</li>
</ul>
</AppCardBody>
<AppCardFooter>
<AppButton tone="white" size="full">Escolher</AppButton>
</AppCardFooter>
</AppCard>
<AppCard>
<AppCardMedia>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 155, background: 'var(--color-surface-muted)' }}>
<AppBadge>Intermediário</AppBadge>
</div>
</AppCardMedia>
<AppCardBody>
<Typography variant="h4" as="h3" style={{ margin: 0 }}>Intermediário</Typography>
<ul style={{ margin: 0, paddingInlineStart: 20, display: 'grid', gap: 8 }}>
<li>5 participações por mês</li>
<li>Suporte por chat</li>
</ul>
</AppCardBody>
<AppCardFooter>
<AppButton appearance="outline" size="full">Escolher</AppButton>
</AppCardFooter>
</AppCard>
</div>
);

Carregando

Exemplo: AppCard, Carregando
const Carregando = () => (
<div style={{ width: 298 }} aria-busy="true">
<AppCard>
<AppCardMedia>
<AppThumb alt="" />
</AppCardMedia>
<AppCardBody>
<AppSkeleton variant="title" />
<AppSkeleton variant="text" lines={2} />
</AppCardBody>
<AppCardFooter>
<AppSkeleton variant="rect" height={44} />
</AppCardFooter>
</AppCard>
</div>
);

Interativo

Exemplo: AppCard, Interativo
const Interativo = () => (
<div style={{ width: 298 }}>
<AppCard interactive>
<AppCardMedia>
<AppThumb alt="" />
</AppCardMedia>
<AppCardBody>
<Typography variant="h5" as="h3" style={{ margin: 0 }}>Plano Básico</Typography>
<a href="#plano-basico">Ver mais</a>
</AppCardBody>
</AppCard>
</div>
);

Grade

Exemplo: AppCard, Grade
const Grade = () => (
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 220px), 1fr))', gap: 16, maxWidth: 960 }}>
{['Produto A', 'Produto B', 'Produto C', 'Produto D'].map((name) => (
<AppCard key={name}>
<AppCardMedia>
<AppThumb alt={name} />
</AppCardMedia>
<AppCardBody>
<Typography variant="h6" as="h3" style={{ margin: 0 }}>{name}</Typography>
</AppCardBody>
<AppCardFooter>
<AppButton size="full" appearance="outline">Ver mais</AppButton>
</AppCardFooter>
</AppCard>
))}
</div>
);

Props

PropTipoPadrãoDescrição
as"article" | "div" | "li"divElemento raiz renderizado. Padrão: 'div'.
elevation"raised" | "flat"raised'flat' remove a sombra, mantendo só a borda. Padrão: 'raised'.
interactivebooleanfalseTransforma o primeiro link/botão do card na área clicável do card inteiro (stretched link), com hover elevado e foco visível da marca.
tone"default" | "brand"default'brand' usa o fundo suave da marca. Padrão: 'default'.