- Modificado JingleCards.tsx para layout de carrossel horizontal no mobile e grid de 3 colunas no desktop. - Reduzido tamanho dos cards no mobile. - Removido textos explicativos no mobile. - Ajustado espaçamento mobile. - Adicionado scrollbar-hide para esconder barra de rolagem visual. - Adicionado changelog e plano de implementação.
5.8 KiB
Impl: Jingles — Carousel mobile e cards menores
Status: aprovado Atualizado em: 2026-09-22 Issue: #1249 Intenção: docs/plans/jingles-mobile-carousel.md Appetite restante: herdado (45 min)
Leitura da intenção
- Outcome: No mobile (390px), os cards de jingle aparecem em carrossel horizontal com scroll suave e snap; cards menores que os atuais; desktop (1280px) mantém grid de 3 colunas. Remover textos explicativos e indicadores de UI no mobile.
- O que NÃO negociar: Layout desktop (grid 3 colunas) intocado; player de áudio/controles de play/pause inalterados; mesma quantidade de jingles exibidos; acessibilidade (navegação por teclado, leitores de tela) preservada.
- O que reavaliar: Hipóteses de "Direção no codebase" que podem estar erradas: (1) O
JingleCardsjá é client component — verificar se o carrossel pode ser implementado sem novo wrapper; (2) Breakpointmd(768px) pode ser adequado para mobile vs desktop; (3) Remoção de textos pode afetar a compreensão do fluxo de uso.
Abordagem recomendada
flowchart LR
subgraph page[JingleCards.tsx — client]
A[mobile: flex overflow-x-auto snap-x] --> B[Card w-[280px] flex-none snap-start]
C[desktop: md:grid md:grid-cols-3] --> D[Card md:w-auto md:flex-none]
end
E[JingleIntro.tsx] --> F[Remover bloco "Um jingle toca por vez"]
G[JingleHomeSection.tsx] --> H[Remover "Um jingle toca por vez"]
I[Estilos] --> J[Reduced padding mobile]
Opções consideradas: A | B | C
Recomendação: A — CSS-only responsive layout — porque o JingleCards já é client component e o carrossel pode ser implementado com overflow-x-auto snap-x snap-mandatory no mobile, mantendo o grid existente no desktop via breakpoint md. Não exige novo wrapper ou mudança de semântica a11y.
Rejeitadas:
- B) Wrapper client com matchMedia — Custo: componente wrapper novo + dupla renderização pós-hidratação para detectar viewport. O S6 (home-campanha-sem-carrossel-desktop) já rejeitou esse padrão por não vale o movimento quando o CSS resolve.
- C) Biblioteca de carrossel (ex: Embla) — Custo: nova dependência + setup + customização. O scroll nativo com snap atende ao requisito (snap suave, sem auto-avanço) e mantém zero deps.
Componentes / mudanças
JingleCards(src/components/jingles/JingleCards.tsx): Adicionar classes responsive para mobile (carrossel) e desktop (grid). Cards mobile comw-[280px] flex-none snap-start; desktopmd:w-auto md:flex-none.JingleIntro(src/components/jingles/JingleIntro.tsx): Remover bloco inteiro "Um jingle toca por vez" (icone + texto) viahidden sm:blockou remoção direta. Remover parágrafo mobile "Dê o play para ouvir aqui..." mantendo versão desktop.JingleHomeSection(src/components/jingles/JingleHomeSection.tsx): Remover texto "Um jingle toca por vez." da seção de jingles.- Migration: sem migration. Access/Consent: n/a. UI: Impeccable B — shape → craft (browser, viewports 390/1280) → critique → polish.
Dados → forma
- Sem dados novos — itens já existem. Forma: carrossel horizontal no mobile com cards menores; grid estático no desktop.
Fases verificáveis
- Layout mobile carrossel — Modificar
JingleCards.tsx: adicionaroverflow-x-auto snap-x snap-mandatoryno container, cards comw-[280px] flex-none snap-start. Verificar scroll suave e snap no mobile (390px). - Cards menores mobile — Ajustar padding e imagem:
p-4mobile vsp-5desktop,h-40mobile vsh-48desktop. Gapgap-4mobile vsgap-5 sm:gap-6desktop. - Desktop grid preservado — Manter
md:grid md:grid-cols-3no container; cardsmd:w-auto md:flex-none. Verificar grid 3 colunas no desktop (1280px). - Remoção de textos —
JingleIntro.tsx: remover bloco "Um jingle toca por vez" (icone + texto) e parágrafo mobile.JingleHomeSection.tsx: remover "Um jingle toca por vez." - Gates —
pnpm gate:fastna iteração;pnpm push.
Rabbit holes / Não escopo (engenharia)
- Não redesenhar o card no mobile (mantém estrutura existente, só ajusta tamanho).
- Não mexer no player de áudio ou controles de play/pause.
- Não alterar a quantidade de jingles exibidos.
- Não adicionar indicadores de carrossel (barra de rolagem, paginação, texto "Arraste para ouvir mais").
Riscos e mitigação
- Regressão mobile: Container mobile com
overflow-x-autopode causar layout quebrado se cards não tiverem largura fixa. Mitigação:w-[280px] flex-nonegarante largura consistente; snap alinha cards. - Desktop grid afetado: Breakpoint
mdpode não ser adequado. Mitigação: testar em 768px+ para garantir transição suave. - Acessibilidade: Carrossel horizontal pode não ser acessível por teclado. Mitigação:
snap-xcomscroll-snap-typeescroll-snap-alignsuportam navegação por teclado; verificararia-labelnos cards. - Performance: Múltiplos
<audio>elements podem consumir memória. Mitigação: manterpreload="none"existente; áudio só carrega ao play.
Aceite de engenharia
- Aceite de produto da intenção ainda coberto (carrossel mobile, cards menores, desktop grid)
- Invariantes AGENTS/engineering-standards (sem migration/Consent; identificadores em inglês; copy pt-BR)
- Testes de domínio previstos (unit/int) onde access/write paths mudam — verificar se
JingleCardstem testes existentes; adicionar testes de layout se necessário.
Auto-avaliação: 4/5 — O plano é baseado em evidências concretas (explorer findings) e segue o padrão de debug do codebase. As hipóteses são testáveis e o apetite é realista. Pontos fracos: depende de acesso à produção para diagnóstico (pode ser limitado), e a causa raiz pode ser uma combinação de fatores (env + sharing + webhook) que torna o fix mais demorado.