Pular para o conteúdo principal
← Voltar ao changelog

Changelog - 01/05/2026

FTD Onboarding — três fluxos novos consolidados (stage-ftd)

Maior entregável do dia. A branch stage-ftd aterrissou três fluxos completos de retenção/conversão D0, todos brand-configuráveis e cobertos por testes:

  • FTD Offer ("Oferta Relâmpago") — modal + floating widget + story thumb com Quick Deposit embutido. Componentes em app/components/ftd-offer/ (Provider, Modal, FloatingWidget, StoryThumb), storage isolado por marca em ftd-offer-storage.ts e analytics em ftd-offer-analytics.ts.
  • FTD Cashback — fluxo D0 com modal de oferta inicial (FtdCashbackFirstModal), modal de prêmio (FtdCashbackPrizeModal), Provider, dev panel, scaffolding de tiers (ftd-cashback-tiers.ts) e persistência local (ftd-cashback-storage.ts). Testes cobrem storage e cálculo de tiers.
  • FTD Check-in — daily check-in com mock fixture, logs diagnósticos, special offers, label "done today" e kill switch via feature flag remota da brand 7k (feat/ftd-checkin-7k-feature-flags). Componentes Checkin, CheckinTrigger, CheckinStoreOffers.
  • Loop de reabertura corrigidouseFtdCashbackFlow ganha guard pra não reabrir o first-modal logo depois do close (PR #485, fix/ftd-cashback-first-modal-loop).

Busca Unificada (feat/search-unified-refactor)

Refatoração grande da busca: header e página passam a compartilhar input + estado, com nova rota de resultados completos:

  • HeaderSearchInput novo (substitui HeaderSearchTrigger) embeded direto no header, com hook useHeaderHasEmbeddedSearch pra evitar duplicação.
  • Estados IdleState e ResultsState isolados em app/components/search/, alimentados por novo store Zustand (app/store/search.ts) com testes dedicados.
  • useRecentSearches novo hook com persistência client-side e suíte de testes.
  • Rota /search/all nova pra full results, separada da busca interativa.
  • Idle rows turbinadas com popular-terms configurável e chips reaproveitáveis.
  • Sync de query param via useSearchParamSync mantém a URL coerente com o input.

Cassino / Jogos

  • Refac de cents nas estatísticas (#461 + #473) — novo hook useStatsFormatMoney, feature flag hideStatsCents propagada pra todas as 13 brands, e refinamento posterior restringindo o opt-in apenas aos componentes menores (GameStats, GameWinners, GameIframe, LazyWinnersSection, WinsCarousel). 7k-bet-br ativa o flag.
  • Padronização de páginas de catálogo (#476) — GamesPageHeader, GamesFilterBar e ProvidersGrid passam a compartilhar header + container entre category.$slug, providers.$slug e providers._index.
  • Top Games legacy-grid (vera-bet-br) (#400) — nova variante TopGameCardLegacyGrid no widget de top-games, mais um bento RecommendedGamesBento, registry expandido e config dedicada em overrides/vera-bet-br/app/config/widgets/top-games.ts.
  • Linhas vazias colapsam (#474) — DeferredHomeRow agora detecta widgets que retornam null e remove o wrapper, eliminando phantom flex gap nas páginas /, /games e /games/live.
  • Favoritos e recents on-demand (#479) — fim das requests globais no _layout.tsx. useFavorites busca por contexto (home, sheets, search), novo hook useFavoritesAuthSync, novo recents.server.ts e useRecentlyPlayedSeed simplificado. Reduz overhead de cold-start em todas as páginas.

Pagamentos

  • PIX random-key: EVPRANDOM (#472) — nome canônico corrigido em PixKeySelector, PixSection, tipo account-features e propagado pras 13 brands. Kanban 14a0b719.
  • Bancos explícitos no 7k-bet-br (#483) — desativada a agregação "Pix" no methods.ts da 7k; cada banco aparece individualmente.
  • Deposit modal polish (#475) — banner do FirstDepositBonusBanner ganha cor consistente e CTA do CtaButtonSignature desabilitado quando o estado é inválido.

Auth e Telefone

  • Textos legais config-driven no LoginModal (#491) — novo componente AuthLegalTexts lê de app/config/auth/legal-texts.ts (override em overrides/7k-bet-br/), substituindo strings hardcoded.
  • Phone save desabilitado quando não há mudança (#503) — PhoneSection e PhoneStep comparam state inicial vs atual antes de habilitar o save.
  • lockDdiSelection honrado em todos os fluxos de telefone (#506) — flag finalmente respeitada também no edit de account e no step de validação. Brand fi-7k-bet ativa.

UI / Mobile / Carousels

  • Edge-to-edge mobile + lateral fade (#489 + #509) — Carousel e Marquee ganham scroll edge-to-edge no mobile e a borda de fade lateral vira opt-in. A relação entre os dois flags foi consolidada: edge-to-edge só aplica quando o fade está desabilitado, evitando combinações estranhas.
  • Lateral fade desligado nos 7k variants (#512) — cl-bet7k-com, fi-7k-bet e ng-7k-bet desativam o fade no mobile.
  • Modal mobile sem botão de fechar (#486) — Modal esconde o close-button no mobile (gesture-driven), preservando-o no desktop.
  • Sidebar dos 7k: "Aviator" → "Aviator Crash" (#490) — label corrigido no override da 7k-bet-br.
  • Minigames sidebar/strategy (#513) — StrategyOverlay e useStrategyAuthTrigger ganham flag hasFtd propagada pelo store; novo helper ftd-encrypted-id.ts substitui parte de campaign-widget-url.ts.
  • Refac do CampaignWidget (#515) — iframe handling agora roda via strategy nomeada (app/utils/strategy/iframe.ts); app/utils/campaign-widget-url.ts deletado, lógica e testes migrados pro namespace de strategy. Override da cassino-bet-br e vera-bet-br ganham app/config/strategy/strategy.ts. Limpeza líquida de ~120 linhas.

SEO e Redirects Legados

  • Separador de título "|" → "–" (#484) — padronização em FAQ, page descriptions, games-seo, sports-seo e game-details. Aplicado no base e em todos os overrides (7k, betpontobet, cassino, vera).
  • Canonical/og:url no sports respeita rota localizada (#449) — sports/$.tsx e sports/_index.tsx agora usam routeHref() em vez de path hardcoded; tipo sports-seo.ts ajustado e configs de cada brand limpas.
  • 301s pra rotas Nuxt legadas (#446) — app/config/routes/legacy-redirects.ts ganha entradas adicionais; legacy-redirect.ts cobre o catchall de sports.

Gamificação / Recompensas

  • Data real de expiração nos rewards expirados (#477) — RewardCard deixa de mostrar "expirado" sem data; usa o timestamp original.
  • Bottom notification de download do app no 7k (#471) — BottomNotification ganha suporte a navegação externa pra LP; entry.client.tsx integra; override da 7k-bet-br aponta o link.

Brand Overrides

  • Alinhamento visual fi/ng/cl-bet7k com 7k-bet-br (#492) — entrega massiva: cl-bet7k-com, fi-7k-bet e ng-7k-bet ganham FAQ próprio (faq.server.ts), composition do layout, menu, theme sizes, header secondary nav, sidebar, footer-stacked heart row, e widgets (campaign-widget, featured-game, footer-socials, game-card, post-card, sidebar-buttons). Inclui assets novos (destaque-aviator.svg, exclusivo.svg, thumbnails).
  • Stories alinhadas + busca removida da home (fi/ng-7k-bet) (#502) — fi e ng espelham a config de stories da cl, atualizam new-badge.png e removem a row de busca de home-rows.{custom,legacy,new}.ts.
  • Banner home responsivo no vera-bet-br (#500) — HomeBannerCarousel ganha tipo home-banner ampliado com sizes responsivos por breakpoint; portado direto do legado.
  • Painel de providers no vera-bet-br (#504) — novo ProviderCardBare + variant "panel" no ProvidersCarousel, com config providers-section.ts no base e override no vera reproduzindo o visual legado.

Core / SDK

  • @cactus-agents/i18n — nova chave casino:search.search_providers adicionada nos 4 locales (pt-br, pt, es, en). Suporta o input de busca de providers introduzido no refac de busca unificada do base. Changeset add-search-providers-key.