Pular para o conteúdo principal
← Voltar ao changelog

Changelog — 03/05/2026

CASSINO_MODE — front_custom removido (breaking change)

  • @cactus-agents/games 2.0.0 — CASSINO_MODE=front_custom deixou de existir. Antes desta data havia 3 modes (legacy, api_new, front_custom); agora são apenas 2 (legacy, api_new). O front_custom era usado só pelo sandbox interno stage1 — stage1 migrou pra legacy e nenhuma brand de cliente consumia o mode. Em vez de manter código morto como surface area pública, o package removeu de vez.
  • Exports públicos removidos: createCustomCategoriesGamesFromClient, createCustomCategoriesGamesService, CustomCategoriesGamesOptions, CustomCategoryDef, CustomCategoriesConfig, CustomCategorySource, filterExplicitCategory, resolveCategoryGames, customCategoryDefToRaw. Tipo LegacyHomeRowConfig.type deixou de aceitar "custom-category".
  • Sobrevive intacto: HomeRow.type runtime ainda inclui "custom-category" / "custom-section" — esses são emitidos pelo BFF page pipeline em legacy e api_new e continuam funcionando. Curadoria por overlay (categories.personalize.ts) também continua válida nos dois modes.
  • Refactor interno: src/custom-categories.ts virou src/stats-ordering.ts; orderByStats, CustomCategoryOrderBy, DisplayPriority, StatDisplayKey continuam exportados do root do package (API pública preservada).
  • Documentação atualizada em conjunto: docs-internal/template/env-vars.md, docs-internal/template/games.md, docs-internal/forking/override-files.md, docs-external/customization/games.md e docs-external/deployment/environment.md reescritos para descrever apenas os 2 modes restantes. CASSINO_FRONT_CUSTOM_BASE removido das tabelas de env vars; regra de "paridade obrigatória" pra .new.ts/.custom.ts foi droppada (não existem mais). Guia de personalização aponta agora pra categories.personalize.ts em vez de categories.custom.ts.

Busca — Diacritic-insensitive

  • filterGames agora ignora diacríticos simetricamente. Buscar "aviao" (sem acento) retorna "aviãozinho"; "cabeca" bate com "cabeça"; cedilha, til, agudo, grave, circunflexo, trema cobertos sem custo de manutenção por caractere. Cobre português, espanhol, francês, alemão e qualquer diacrítico do bloco combining Unicode.
  • Estratégia canônica: normalize("NFD") separa caractere base do diacrítico, regex [\u0300-\u036f] remove os combining marks. normalize é nativo C++ em V8 — overhead de ~5ms pra ~10k normalizações por query (2k jogos × 5 tags), imperceptível.
  • Helper foldForSearch(s) exportado pelo package @cactus-agents/games — consumido pelo base nas páginas de categoria/provedor/mini-games onde a busca é client-side local (fora do filterGames), garantindo paridade com a search global.
  • 9 testes novos cobrindo: sem acento → com acento, com acento → sem acento, cedilha nos dois lados, til em nome + provider, case + diacrítico combinados, filter tags separado.

Page Rows — Multi-página vindo do BFF

  • Novo método getPageRows(page) na GamesService bate em 3 endpoints canônicos curados por brand via ORIGIN_DOMAIN: GET /casino-games/page/home, /casino-games/page/cassino, /casino-games/page/cassino_live. Substitui a necessidade de hardcoded row configs no base — backend vira fonte única de ordem, widgets e curadoria per-brand.
  • PageSlug = "home" | "cassino" | "cassino_live" exportado. createGamesService (api_new) implementa direto; createLegacyGamesService delega "home" pro getHome() legado e dá throw nos outros (rowsConfig[page] cobre os demais em legacy mode).
  • Non-breaking em wire-level: bases antigos bumpando o package continuam chamando os mesmos endpoints. getHome() segue intocado e marcado @deprecated com TODO de remoção pra quando dev → main/stage/prod for mergeado.

Tracking de Marketing — Deposit ganha paridade total

  • POST /wallet/add-credit agora forwarda todo o sinal de atribuição que o legado Vue mandava, não só o subset que o Register já enviava:
    • src propagado no deposit (antes era register-only);
    • subid (affiliate sub-id);
    • utmExtras — wildcard utm_* (utm_oferta, utm_term, utm_placement, …) emitido flat no body;
    • cada clicked-id como campo individual: gclid, fbclid, ttclid, gbraid, wbraid, msclkid, mgclid, tclid, kwclid, obclid (paridade 7k/vera-new);
    • par derivado mediaSource / mediaClid (paridade bullsbet/jogao/mcgames).
  • Dois schemas em paralelo: os dois shapes (campos individuais E media_source+media_clid) são forwardados juntos porque diferentes BFF handlers de brand leem um ou outro. Garante atribuição independente do handler ativo.
  • Backward-compatible: todos os campos novos são opcionais — callers existentes mantêm o payload anterior intacto.

Vera-bet-br — Paridade visual com legado

  • Refatora pesada (vera-layout-legacy-parity) aproxima a vera-bet-br do legado preservando a dinamicidade e reuso por config. Todas as flags novas são opt-in, zero impacto nas outras 13 brands.
  • Infra nova reutilizável:
    • SidebarLayoutConfig.scrollBehavior: "sticky" | "page" — sidebar pode rolar junto com a página (vera) ou continuar sticky (default das demais);
    • LayoutStructureConfig.contentContainer: "full" | "contained" — linha sidebar+main+rightPanel centralizada em max-w-content (vera) ou full-width viewport (default);
    • featuresConfig.homeRightPane: "wins-list" | null — home ganha coluna direita em xl+ via HomeWinsRightColumn (não-sticky, dentro do flow);
    • featuresConfig.homeRightPaneAboveSplit: number — quantas rows sobem full-width no topo antes do split 2-col começar (banners fora do split);
    • featuresConfig.showMobileSidebarToggle: boolean — hamburger também no mobile no HeaderDefault (vera=true).
  • Novo variant sidebar-sectioned-titled — headers com gradient glow primário + pill "VER TODOS" + items com decoração diagonal + suporte a "titled" style no SidebarBottomItems (Outros Links).
  • Cleanup: variante right-panel-winners removida (única consumer era vera, agora usa HomeWinsRightColumn); RightPanelVariantKey vira never mas a slot infra fica intacta pra futuras brands. WinsListHeader + WinListCard extraídos pra components/home/wins-shared.tsx.
  • Propagação obrigatória: homeRightPane: null + homeRightPaneAboveSplit: 0 adicionados em todas as 13 outras brands seguindo a regra de overrides file-replacement (sem deep-merge).
  • Outros ajustes vera: novo vera SectionTitle variant replicando os títulos de row do legado; logo compacto V-only no mobile pequeno (<640px); GameCard variant vera específico; hamburger movido do header pro bottom-nav (drop V spike); top-games card com 2 linhas mínimas reservadas pro título evitar reflow.

Cassino-bet-br — Header + sidebar repaginados

  • sidebar-tabbed — novo variant com tabs casino/sports no topo, auto-seleção route-aware, e square colapsável que alterna tabs no clique (ícones mdi/cards + mdi/soccer + dots indicator). SidebarPillItem + SidebarBottomItems ganham prop opt-in hideChevron (default mantido nos outros variants). Brand activa via composition.ts em split-shell + sidebar-tabbed, matchando a macro-arquitetura do 7k.
  • header-split-bar + header-secondary-flat — dois headers genéricos novos. O split-bar tem logo+hamburger à esquerda da row centralizada, busca compacta 320px borderless à direita (h-9 igual aos botões, expande pra 380px no focus via focus-within), quick-access menu (+), 68px desktop height. O secondary-flat é uma submenu row transparente com hairline bottom border full-width, pills com fill sutil em rest e bg-primary/20 no active (sem ring/glow), isSecondaryNavLinkActive com longest-prefix-wins dedup.
  • Wiring cassino-bet-br: topbar notification desligada; widget search-field removido das home rows (header agora owna a busca); botões Entrar (ghost cyan) e Cadastrar (filled blue) com hierarquia clara; novo header-secondary-nav.ts (5 casino + 6 sports) + quick-access-menu.ts (6 intents, paridade 7k); theme sidebar.button-bg migra de gray #3f4142 pra navy #18436e.
  • Mobile-nav illustrated tabs: novo variant mobile-nav-illustrated-tabs com tabs ilustradas, ativado na cassino-bet-br.
  • Sidebar-buttons CTA Mini Games Diários — colored variant ganha emoji icon slot e nova strategy específica.
  • Pix — bancos individuais: disable Pix grouping na cassino-bet-br pra mostrar cards individuais por banco em vez de agrupar.
  • Login modal: texto legal específico cassino-bet-br adicionado.
  • Top Ganhos: seção migrada do legado com card style brand-configurable.
  • Fix /buscar: InternalNavBar movido pra fora do max-w-content wrapper em /buscar e /buscar/all — antes ficava clipped (bottom border full-width recortada). Fix é brand-agnostic, beneficia todas as brands.

Vera FTD — Paridade total com legado

  • Anúncio "Garanta sua diversão!" (variant checkin) — novo FtdCheckinAnnouncementProvider global, gated por ftdCashback.modalVariant === "vera-legacy" + useFtdCheckinAccess().canAccess. Once-per-session via sessionStorage; logout limpa flag; CTA "FAZER CHECK-IN" abre o panel diário existente.
  • Flash-offer com visual legacy vera (flash-offer)FtdOfferConfig.modalVariant?: "default" | "vera-legacy" opt-in pra renderizar FtdOfferModalContainer + thumb/trigger paridade pixel-perfect. Ports 1:1 do legado: FtdOfferFloatingTrigger (de FloatingTrigger.vue) e FtdOfferStoryThumbLegacy (cronômetro CDN + pill verde sobreposta) usado em widgetMode: "stories-first".
  • Config vera 1:1 com Login.vue legado: ftdOffer enabled + vera-legacy + stories-first + storyThumb CDN; autoDepositModal: { minBalanceCents: 10, intervalMs: 0 } replicando walletReal < 0.1 + sessionStorage showDepositModalHome.
  • Util app/utils/ftd-offer.ts — port de resolveOfferVariant, OFFER_EVENT_MAP e formatOfferCountdown pra orchestrator unificado futuro.

Outras Features

  • Página /promocode portada do legado vera/7k.
  • Mobile-nav auth-gate — itens user-specific (rewards, missions, etc.) abrem o login modal em vez de navegar quando o usuário está deslogado.
  • SEO hreflang ativado pra 7k-bet-br, cassino-bet-br e vera-bet-br + brands adicionais (compliance SEO geral).
  • Favicon Google-compliant — sizes em múltiplos de 48 pra renderizar corretamente nos resultados de busca do Google.
  • Diamond Stories — suporte ao variant diamond-neon no widget de stories da home.

Fixes

  • VerticalMarquee — container clamped pro setHeight pra loop infinito ficar seamless (antes "pulava" ao reciclar).
  • Sidebar titled-section — gradient escopado só pro header (antes vazava); spacing tweaks (mb-4, w-full no gradient, mt-2 no content).
  • Wins trophy — top offset reduzido pra impedir crop do troféu no card.

Brand Overrides

  • vera-bet-br: repaginação completa (vide seção dedicada acima) — composition sidebar-sectioned-titled + scrollBehavior: "page" + contentContainer: "contained", widths 230/70px, rightPanel removido, FTD legacy parity, GameCard variant próprio, logo compacto mobile, hamburger no bottom-nav, section-title variant próprio.
  • cassino-bet-br: split-shell + sidebar-tabbed + header-split-bar + header-secondary-flat + mobile-nav-illustrated-tabs, theme sidebar.button-bg migrado pra navy, sidebar-buttons unificado em gradient navy (#2a74bd#0a2140) com pattern fade-to-near-black-same-hue, Pix banks individuais, Top Ganhos card brand-configurable, login legal text.
  • 7k-bet-br: SEO hreflang ativado.
  • Demais 13 brands: homeRightPane: null + homeRightPaneAboveSplit: 0 propagados (regra file-replacement de overrides — Critical Rules).

Core / SDK

  • @cactus-agents/games 2.0.0 — breaking: remove CASSINO_MODE=front_custom; non-breaking: getPageRows(page) + foldForSearch + busca diacritic-insensitive em filterGames. Documentação cleanup em paralelo no front-cactus-docs (commit f675d0c).
  • @cactus-agents/paymentsbuildDepositPayload agora forwarda src, subid, utmExtras wildcard, todos os clicked-ids individuais e o par derivado mediaSource/mediaClid. Backward-compatible: campos novos opcionais.