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 emftd-offer-storage.tse analytics emftd-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). ComponentesCheckin,CheckinTrigger,CheckinStoreOffers. - Loop de reabertura corrigido —
useFtdCashbackFlowganha 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:
HeaderSearchInputnovo (substituiHeaderSearchTrigger) embeded direto no header, com hookuseHeaderHasEmbeddedSearchpra evitar duplicação.- Estados
IdleStateeResultsStateisolados emapp/components/search/, alimentados por novo store Zustand (app/store/search.ts) com testes dedicados. useRecentSearchesnovo hook com persistência client-side e suíte de testes.- Rota
/search/allnova pra full results, separada da busca interativa. - Idle rows turbinadas com
popular-termsconfigurável e chips reaproveitáveis. - Sync de query param via
useSearchParamSyncmantém a URL coerente com o input.
Cassino / Jogos
- Refac de cents nas estatísticas (#461 + #473) — novo hook
useStatsFormatMoney, feature flaghideStatsCentspropagada 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,GamesFilterBareProvidersGridpassam a compartilhar header + container entrecategory.$slug,providers.$slugeproviders._index. - Top Games legacy-grid (vera-bet-br) (#400) — nova variante
TopGameCardLegacyGridno widget de top-games, mais um bentoRecommendedGamesBento, registry expandido e config dedicada emoverrides/vera-bet-br/app/config/widgets/top-games.ts. - Linhas vazias colapsam (#474) —
DeferredHomeRowagora detecta widgets que retornamnulle remove o wrapper, eliminando phantom flex gap nas páginas/,/gamese/games/live. - Favoritos e recents on-demand (#479) — fim das requests globais no
_layout.tsx.useFavoritesbusca por contexto (home, sheets, search), novo hookuseFavoritesAuthSync, novorecents.server.tseuseRecentlyPlayedSeedsimplificado. Reduz overhead de cold-start em todas as páginas.
Pagamentos
- PIX random-key:
EVP→RANDOM(#472) — nome canônico corrigido emPixKeySelector,PixSection, tipoaccount-featurese propagado pras 13 brands. Kanban14a0b719. - Bancos explícitos no 7k-bet-br (#483) — desativada a agregação "Pix" no
methods.tsda 7k; cada banco aparece individualmente. - Deposit modal polish (#475) — banner do
FirstDepositBonusBannerganha cor consistente e CTA doCtaButtonSignaturedesabilitado quando o estado é inválido.
Auth e Telefone
- Textos legais config-driven no LoginModal (#491) — novo componente
AuthLegalTextslê deapp/config/auth/legal-texts.ts(override emoverrides/7k-bet-br/), substituindo strings hardcoded. - Phone save desabilitado quando não há mudança (#503) —
PhoneSectionePhoneStepcomparam state inicial vs atual antes de habilitar o save. lockDdiSelectionhonrado em todos os fluxos de telefone (#506) — flag finalmente respeitada também no edit de account e no step de validação. Brandfi-7k-betativa.
UI / Mobile / Carousels
- Edge-to-edge mobile + lateral fade (#489 + #509) —
CarouseleMarqueeganham 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-beteng-7k-betdesativam o fade no mobile. - Modal mobile sem botão de fechar (#486) —
Modalesconde 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) —
StrategyOverlayeuseStrategyAuthTriggerganham flaghasFtdpropagada pelo store; novo helperftd-encrypted-id.tssubstitui parte decampaign-widget-url.ts. - Refac do
CampaignWidget(#515) — iframe handling agora roda via strategy nomeada (app/utils/strategy/iframe.ts);app/utils/campaign-widget-url.tsdeletado, lógica e testes migrados pro namespace de strategy. Override dacassino-bet-brevera-bet-brganhamapp/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/$.tsxesports/_index.tsxagora usamrouteHref()em vez de path hardcoded; tiposports-seo.tsajustado e configs de cada brand limpas. - 301s pra rotas Nuxt legadas (#446) —
app/config/routes/legacy-redirects.tsganha entradas adicionais;legacy-redirect.tscobre o catchall de sports.
Gamificação / Recompensas
- Data real de expiração nos rewards expirados (#477) —
RewardCarddeixa de mostrar "expirado" sem data; usa o timestamp original. - Bottom notification de download do app no 7k (#471) —
BottomNotificationganha suporte a navegação externa pra LP;entry.client.tsxintegra; 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-beteng-7k-betganham 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.pnge removem a row de busca dehome-rows.{custom,legacy,new}.ts. - Banner home responsivo no vera-bet-br (#500) —
HomeBannerCarouselganha tipohome-bannerampliado com sizes responsivos por breakpoint; portado direto do legado. - Painel de providers no vera-bet-br (#504) — novo
ProviderCardBare+ variant "panel" noProvidersCarousel, com configproviders-section.tsno base e override no vera reproduzindo o visual legado.
Core / SDK
@cactus-agents/i18n— nova chavecasino:search.search_providersadicionada nos 4 locales (pt-br, pt, es, en). Suporta o input de busca de providers introduzido no refac de busca unificada do base. Changesetadd-search-providers-key.