@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.
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.
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);
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.
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 veraSectionTitle 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.
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.
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.
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".
@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/payments — buildDepositPayload agora forwarda src, subid, utmExtras wildcard, todos os clicked-ids individuais e o par derivado mediaSource/mediaClid. Backward-compatible: campos novos opcionais.