Hero
Em andamentoO topo da página inicial: três slides que se revezam, com a busca de cursos logo abaixo. É a primeira coisa que o candidato vê, e o caminho mais curto até um curso.
- Função
- Institucional
- Também chamado de
- banner, carrossel de topo, destaque
- Mora em
- app/components/organisms/Hero.tsx
- Última mudança
- 2026-10-01
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
1280px, em tamanho real
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Um por página, no topo, e só na página inicial ou em páginas de entrada de uma área.
Faça
- Use no topo da página inicial, onde a busca de cursos precisa estar à mão.
- Deixe o botão de pausa: o slide troca a cada 8 segundos, e a WCAG 2.2.2 exige um jeito de parar.
- Mantenha a busca exigindo o tipo de curso — é o que monta o endereço de resultados.
Evite
- Dois na mesma página: o slide à mostra traz o título de primeiro nível.
- Esconder os controles: no celular eles ficam sempre à mostra, e no computador aparecem no hover e no foco, de propósito.
- Usar como vitrine de campanha: para isso existe o MarketingHero.
Quando não usar. Em página de campanha, que precisa de preço e chamada de matrícula: use o MarketingHero. Para um carrossel de destaques sem a busca, o HeroCarousel. Para a busca sozinha, no meio de uma página, o SearchBar.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Título do slide — Texto branco sobre o vermelho de interface ou sobre foto escurecida.
- Descrição e modalidades — As quatro modalidades em negrito.
- Prova social — Avatares e o número de formados.
- Imagem — Só a partir de 1024px; abaixo disso some.
- Controles do carrossel — Pausa (a primeira no DOM, E75), anterior e próximo — 48px; sempre visíveis abaixo de 768px, e acima no hover e com o foco no carrossel.
- Cartão de busca — Sobe 64px sobre o carrossel: FormField com o Input (busca) e com o Select (tipo de curso), e o Button verde "Pesquisar" (E73).
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Avançando | O padrão: o slide troca sozinho a cada 8 segundos, e o botão mostra o ícone de pausa. |
| Pausado | Depois do botão de pausa: o avanço para, o ícone vira o de retomar e o botão anuncia aria-pressed="true". |
| Parado pelo foco | Com o foco em qualquer ponto do carrossel, o avanço para até o foco sair — o botão de pausa não muda. |
| Movimento reduzido | Com prefers-reduced-motion, o avanço nasce parado e o botão de pausa some (motion-reduce:hidden). |
| Controles escondidos | Só a partir de 768px: setas e pausa ficam transparentes até o mouse passar ou o foco entrar no carrossel (E75 — no celular, sem hover, a pausa nunca aparecia). |
| Campo em foco | Nos dois campos da busca: o contrato de campo — borda de 2px --border-focus (E73; era a borda vermelha com anel). |
| Busca incompleta | Sem o tipo de curso, o navegador não envia — o campo é required (o asterisco está no rótulo) e mostra o aviso dele. |
Comportamento
| Situação | O que acontece |
|---|---|
| Ponteiro sobre o carrossel | Suspende a troca automática, como o foco dentro dele; ao sair, ela volta (E143, Magoo e APG) — testado na ficha. |
| Página aberta | O slide avança sozinho a cada 8 segundos, com esmaecimento de 0,8s. |
| Foco dentro do carrossel | A troca automática para enquanto o foco estiver ali — e volta quando ele sai. |
| Pausa acionada | O avanço para e o botão vira "retomar". O rótulo vem de usePausaDeMovimento. |
| Movimento reduzido no sistema | O avanço já nasce parado, e o botão de pausa some — não há o que pausar. |
| Busca sem tipo de curso | Não envia: o campo é obrigatório. |
| Busca completa | Leva a /cursos?q=…&categoria=…. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import Hero from '@/app/components/organisms/Hero';
<Hero />Propriedades
Lidas do código da peça no build — não escritas à mão.
Hero não recebe nenhuma propriedade. O conteúdo está escrito dentro do componente; para mudá-lo, é preciso editar o arquivo.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Altura do carrossel | 600px; 70% da janela a partir de 768px, mínimo 550px | h-[600px] md:h-[70vh] min-h-[550px] |
| Largura do conteúdo | 1200px no máximo | max-w-[1200px] |
| Setas e pausa | 48 × 48px | h-12 w-12 |
| Campos e botão da busca | 48px de altura | classNameDoCampo="h-12" · Button size="lg" |
| Cartão de busca | sobe 64px sobre o carrossel | -mt-16 |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--primary | #D42B2B | bg-primarybg-primary/90border-primaryborder-primary/30text-primary |
--foreground | #1A1A1A | bg-inkfrom-ink/95text-inkvia-ink/40 |
--card | #FFFFFF | bg-cardborder-card |
--border | #E5E5E5 | border-border |
--ink-inverse | #FAFAFA | text-ink-inverse |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
--ring-inverse | #FAFAFA | ring-ring-inverse |
--secondary | #0B8434 | bg-secondary |
--secondary-dark | #0D6B2E | bg-secondary-dark |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Passa pela pausa (primeira, E75), pelos links do slide à mostra, por slide anterior e próximo slide, pelos dois campos e por Pesquisar. Os slides escondidos ficam fora; os controles aparecem com o foco no carrossel. |
| EnterEspaço | Aciona a seta ou a pausa em foco. |
| Enter | Num campo da busca, envia — se o tipo de curso estiver escolhido. |
Leitor de tela
O que é anunciado, e por quê.
- O carrossel é uma região "Destaques" com
aria-roledescription="carrossel", e cada slide um grupo "N de 3" (E75, APG Carousel). - Só o slide à mostra tem
h1; os outros títulos são parágrafo e ficaminert— umh1por página também no HTML do servidor (E75). - Os slides ficam em
aria-live="off"enquanto trocam sozinhos, epolitequando param (pausa ou foco): a troca feita pela pessoa é anunciada, a automática não fala por cima da página. - As setas se chamam "Slide anterior" e "Próximo slide"; o botão de pausa tem o rótulo de
usePausaDeMovimentoe anuncia se está pressionado. - Os dois campos da busca têm rótulo visível, ligado pelo FormField — "O que você busca?" e "Tipo de curso" (obrigatório).
O que sustenta o estado
Esta peça usa regiaoViva, carrossel. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: regiaoViva, carrossel — ver docs/a11y-screen-reader-checklist.md.
Achados abertos
Defeitos conhecidos, com o que falta fazer.
- Os slides estão escritos dentro do componente. O Hero não recebe nenhuma propriedade: trocar um slide é editar o arquivo. Aceitar os slides por prop é o que o tornaria reutilizável.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/organisms/Hero.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
251416b2026-10-01E159: Testimonials — o vídeo toca dentro do cartão, YouTube e Vimeo
O histórico completo está no GitHub (abre em outra aba).