Limite etário no cadastro (PR #654) — novo app/utils/age.ts calcula idade contra now e bloqueia data de nascimento fora da faixa 18–99 anos direto no RegisterModal antes do POST. Antes o front aceitava qualquer data válida e só o BFF reclamava (round-trip + UX ruim). Erros aparecem inline com chaves i18n já existentes (auth.errors.too_young / too_old), e o parseRegisterFormData em app/modules/register/flow.ts ganhou o mesmo guard pra blindar o pipeline FormData → payload.
Validação de telefone contra máscaras do país (PR #683) — o RegisterModal agora deriva os digit lengths válidos a partir de availableMasks (ex: BR → [10, 11]) e marca o campo como INVALID_PHONE no blur quando a contagem não bate. Isso afeta automaticamente 7k-bet-br, cassino-bet-br, vera-bet-br (e qualquer brand futuro) sem mudança no override — a validação é mask-derived. Erro limpa assim que o user atinge um length válido; não dispara shake (esse fica reservado pra erros de submit), só border + mensagem inline.
Search — autofill bloqueado + tecla "Buscar" no mobile
Autofill leak corrigido (PR #754) — bug reportado em 2026-05-08: após finalizar saque com sucesso e clicar "Finalizar", o user era redirecionado pra /buscar?q=<email>. Causa raiz: HeaderDormantInput era <input type="text"> sem autoComplete, e o Chrome autofillou o campo com email salvo, disparando onChange → navigate(...). Fix aplicado nos 4 inputs de busca shared (header dormant, header active, search-pill, page input): type="search" + name="site-search" + autoComplete/autoCorrect/autoCapitalize="off" + spellCheck={false}.
Tecla "Buscar" no teclado mobile — mesmo PR adicionou enterKeyHint="search" em todos os inputs de busca (iOS 13.4+, Chrome/Firefox Android mostram lupa em vez do enter genérico) e suprimiu o ✕ nativo do type="search" via [&::-webkit-search-cancel-button]:appearance-none pra não duplicar com o botão X custom.
Guards defensivos no useSearchTriggerHandlers — handleChange agora descarta eventos cujo nativeEvent.inputType seja undefined ou "insertReplacementText" (padrões de autofill do Chrome/password managers; digitação real é "insertText") e qualquer valor contendo @ (cinto + suspensório). Suite de testes ganhou 4 cenários novos cobrindo autofill, password manager, valor com @ e happy path.
Card "Pagou Muito" redesenhado para 228×80 (PR #709) — TopGameCardCompactWatermark da cassino-bet-br ganhou layout stacked: o botão JOGAR saiu da coluna lateral e virou terceira linha full-width abaixo de nome+payout. Padding 8px ao redor + 8px de gap entre thumb e stack. Refactor adicional expôs gameNameText no TopGamesStyleOverrides: brands que adotarem o variant compact-watermark no futuro herdam automaticamente o token titles da brand; cassino-bet-br setou gameNameText: "#C7CCD1" pra preservar o tom legado exato.
Mobile game card stat layout (PR #690) — GameCardActions reduziu padding lateral de px-2 pra px-1 no bloco de conteúdo + px-1.5 no chip de stats (mais conteúdo cabe sem cortar). GameGrid na variante compact passou de grid-cols-4 pra grid-cols-3 no mobile e gap reduzido (gap-1 em vez de gap-1.5). BalloonIcon shrinkado pra w-3 h-3 em telas pequenas mantendo w-5 h-5 em desktop. GameCardStacked reduziu gap-1 → gap-0.5 no divider mobile.
Stories — swipe nav com close nas bordas (PR #711)
Drag-on-card e swipe horizontal navegam stories — o StoriesModal e StoriesModalFullScreen agora detectam swipe lateral pra avançar/voltar, e nas bordas da timeline o gesto fecha o modal em vez de tentar passar pra fora do range. Drag iniciado em qualquer ponto do card (não só nas setas) também dispara nav.
Blog / WP Post Card — aspect-ratio configurável (PR #742)
object-contain em todos os presets fixos — WpPostCard substituiu object-cover por object-contain em todos os aspect-ratio presets, então thumbnails de blog/promoções nunca mais são cropadas. Imagens fora da proporção do container ganham letterbox/pillarbox contra bg-bg-secondary (neutro).
Novo aspect 5/3 + default auto — adicionado preset "5/3" (≈1.67) ao PostCardThumbAspect. Default do base virou "auto" (sem aspect fixo, altura segue a imagem). Brand presets restaurados: 7k-bet-br + cl-bet7k-com + fi-7k-bet + ng-7k-bet → cinema (21:9); cassino-bet-br → ultrawide (5:2); vera-bet-br → novo override 5/3.
Hardening em blog.server.ts — todos os 4 helpers de fetch WP envelopam o fetch() em .catch(): TypeError: fetch failed (DNS, SSL, endpoint indisponível) degrada pra resultado vazio em vez de quebrar o loader. Cada catch emite log.warn com URL + erro pra diagnóstico.
Adição (PR #292, manhã) — workers/middleware.ts ganhou 5 headers novos no applySecurityHeaders: X-Frame-Options: SAMEORIGIN, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy: geolocation=(), microphone=(), camera=() e Content-Security-Policy-Report-Only (Phase 2 — coletando violações sem bloquear; promove pra Content-Security-Policy enforced após validar em prod sem falsos-positivos).
Revert (PR #770, hotfix da tarde) — o Permissions-Policy quebrou a permissão de câmera no fluxo de KYC (selfie/liveness). Decisão: reverter os 30 linhas inteiras do middleware.ts pra desbloquear KYC em prod. Próxima iteração precisa relaxar camera=() pra camera=(self) ou whitelist do hostname antes de re-aplicar.
casateste-com — enriquecimento pra paridade com prod (PR #761) — overrides casateste-com/app/config/** recebem espelho funcional do layout da betpontobet-bet-br pra que a casa de teste exponha as mesmas features que rodam em produção:
sections/home-rows.legacy.ts, casino-rows.legacy.ts, casino-live-rows.legacy.ts com favorites-row, recently-played, top-games ("Pagou muito"), main-leagues, biggest-wins-and-latest-bets, tournaments e missions.
catalog/categories.personalize.ts (orderBy + displayPriority por slug) e catalog/game-thumbs.ts (efeitos mp4 no hover).
widgets/sidebar-buttons.ts no variant gradient (brand-aware sem custom override).
features/features.ts ativando favoriteGames, recentlyPlayedApiSeed, rowSuggestionsInEmptyStates, headerNotifications, internalFaq, incomeReport e eagerHomeRowCount=8.
features/account.ts ativando accountSetLimits, accountTimeoutLimits e userPreferences.
Não replicado: analytics, FAQ/game-details, SEO, LPs, scripts, licenses, referral custom-v2, menu/sidebar com labels da brand. Indique-e-ganhe fica no variant default.
7k-bet-br — Webtrends account ID (PR #722) — overrides/7k-bet-br/app/config/analytics/analytics.ts recebe webtrendsAccountId: "251da524-89d9-43b5-a186-8309fea3b93f", portado de front-old/front-web-7k-bet-br/plugins/webtrends.client.ts. Habilita o A/B testing ativo do 7k.bet.br via <WebtrendsLoader /> carregado globalmente em root.tsx.
ci-deploy.yml migrado pra matrix fan-out a partir do front-ops (PRs #728, #729, #733, #745, #750, #755) — sequência grande de refactors no workflow do front-web-base: 3 jobs hardcoded substituídos por (1) quality (lint/build, filtra drafts), (2) config-lint (compara dropdown + branch filters do workflow contra scan filesystem do front-ops, falha em drift), (3) resolve-matrix (scaneia front-ops/config/web/environments/*/deploy.yml em runtime, filtra por auto_deploy + default_branch, emite matrix + GH step summary com tabelas "Deploys fan-out" e "Other environments"), (4) deploy (matrix fan-out, um job paralelo por env). Workflow extra list-environments.yml adicionado pra listar inventário sob demanda. Triggers ajustados: pull_request: branches=[main] + filtro de drafts; workflow_dispatch com dropdown alfabético; heredoc fix no glob/anchors.
Deploy summary table polida + job validate renomeado pra check (front-ops) — UI da matrix do GH Actions ficou mais legível. Auto-deploy desligado em betpontobet-bet-br, cassino-bet-br, prod-7k-bet-br e vera-bet-br (controle manual via dispatch). cl-bet7k-com aponta default branch pra stage-main-ana. react-c4ctus-com com auto_deploy off até a conta CF Teste estar configurada. Cache TTLs do react-casateste-com apertados pra ambiente de teste (rows + wins).
Ações do GitHub bumpadas pra Node 24-ready (front-ops + front-cactus-docs) — GitHub vai forçar workflows em Node 20 → Node 24 a partir de 02/06/2026. Versões mínimas com suporte explícito: actions/checkout@v4 → @v5, actions/setup-node@v4 → @v5, pnpm/action-setup@v4 → @v5. Aplicado em todos os workflows reutilizáveis do front-ops e no deploy do front-cactus-docs (que também ganhou matrix fan-out idêntica ao base). Config dos envs do docs movida pra front-ops/config/docs/environments/<env>/deploy.yml.
sdk/auth.md — TwoFactorPayload corrigido (PR docs #27) — campos do payload do 2FA sincronizados com os nomes reais do BFF (code em vez de otp, etc); doc estava descrevendo um shape divergente do que o backend aceita.
main-vera (PR #769) — merge de sincronização do branch main pro vera-bet-br, agregando todos os PRs acima + features que já estavam em main e ainda não tinham chegado na linha vera (Recover KYC steps, Cookie Consent banner, AppsFlyer/Pendo hooks reformados, useRecheckSpa, rotas internas /api/auth/recheck-spa + /api/auth/refresh, RestrictedModeAlert, SessionExpiredBanner, etc.). Conteúdo dessas features já documentado nos changelogs anteriores; este PR só aplica o cherry-pick em massa pro deploy da vera.