Changelog - 29/04/2026
Dia pesado: 25 PRs no front-web-base cobrindo um empurrão grande de performance (CSS, ícones, modal), refatoração do header secundário com gating de rota, novas features de cassino e pagamentos, e ajustes finos de SEO/mobile/auth. Plus 4 mudanças de CI/CD em front-ops pra suportar o novo modelo de cache por device/country/buildId.
Performance — empurrão grande
- Drop
important: truedo Tailwind (tailwind.config.js). Removido globalmente — precedência CSS volta ao normal (inline style vence class). Resultado: CSS −23,5KB raw (−14,4%). Componentes que usavam o pattern condicionalbgStyle ? "" : "bg-..."(omitir classe quando havia inline style) foram simplificados — agora basta sempre emitir a classe que ostyleinline sobrescreve quando presente. Atualizados:GameCardStacked,GameStats,GameWinners,MainLeaguesSquare,SidebarButtonsGradient,SidebarButtonsGrid. - Migração
react-modal-sheet→vaul(app/components/base/Modal.tsx). Modal chunk caiu de ~158KB pra ~65KB raw — −93KB (−59%). Mesma API externa, drop-in pelos consumers. (PR #405 fez ajustes finos depois pra resolver bugs de input-focus em mobile e espaço fantasma no footer.) - Remoção do
@tailwindcss/typography. Plugin não justificava o custo — uso restrito a 4 lugares (FaqSingleContent,WpPostContent,page.$slug,vip/levels) substituído por classes utilitárias inline.package.jsonenxuga uma dep + 22 linhas depnpm-lock.yaml. - Ícones direct-imports + lazy
MainLeagues(app/widgets/home-leagues/). Drop do registry intermediário — agora cada componente fazimport Icon from "~icons/<set>/<name>"direto.MainLeaguesSquarevirou lazy chunk separado. 25 arquivos tocados, −564 linhas vs +454. Atualiza configs dehome-leaguesem 7 brands (7k-bet-br, cassino-bet-br, fi-7k-bet, ng-7k-bet, pb-bet, vera-bet-br, state77-com, x2b-bet). - CI Lighthouse manual (
.github/workflows/lighthouse.yml). Workflow caller dispatchável viaworkflow_dispatchpra rodar Lighthouse on-demand contra preview/prod sem precisar de schedule fixo. Útil pra validar PRs pesados de UI antes de mergear.
Cache, SSR e Worker — modelo per-device/country/buildId
PR #390 (umbrella performance → stage, 25 arquivos, +840/−172) reescreveu o middleware do Worker pra fazer cache mais inteligente:
workers/middleware.tsganhou +306 linhas implementando cache de SSR particionado por(device, country, bot, brand, buildId). Antes a chave de cache era global por path — agora bot crawler vê uma versão, mobile-pt-BR-7k vê outra, desktop-es-state77 vê outra. Bot detection isolado emapp/utils/bot.server.ts(+24 linhas) e device detection emapp/utils/device-detect.ts.- Service Worker (
public/sw.js) atualizado (+92 linhas) pra propagar a nova chave de cache no client e respeitar invalidações porbuildId. - Nova rota
/api/clear-cache(app/routes/api/clear-cache.ts) pra purge manual da edge cache de uma rota específica. app/root.tsxajustado com viewport correto pra acessibilidade + headers SSR alinhados ao novo modelo.
Layout — header secundário refatorado
- Refresh do
HeaderSecondaryNavButtons(PR #425) com ícones e items ricos por seção. Adicionadoapp/config/layout/header-secondary-nav.ts(config base) +app/utils/sports-icons.ts(registry de ícones por modalidade esportiva).useSidebarSectionsajustado pra reutilizar a mesma estrutura. Tests doresolvereescritos pra cobrir os novos shapes. Brands com override próprio:state77-com,vera-bet-br. - Route gating do
headerSecondary(PR #426). O slot agora só renderiza nas rotashome,casinoesports— antes aparecia em todas as páginas, poluindo views de gamification, user, payments, etc. Resolução emapp/layouts/variants/header-secondary/resolve.ts(+6 linhas) com 31 linhas de testes novos.
UI e Componentes
- Mouse drag em tempo real + setas no hover no
BannerSlidemulti-scroll (PR #407).app/components/ui/Carousel.tsxganhou +184 linhas: drag responde durante o gesto (não só no release), setas aparecem em hover do desktop, e snap continua respeitado. Brandcl-bet7k-comjá liga a feature. - Fix carousel
group-hovercollision (PR #410). Ogroupdo carousel disparava hover em cards filhos que também usavamgroup-hover— escopado pra named group (group/carousel), evitando que mover o mouse pelo carrossel ative o overlay de cards. - Card de favoritos / recentemente jogados com call-to-action quando vazio (PR #420).
EmptyRowPlaceholderganhou variant clicável;FavoritesRoweRecentlyPlayedRowagora mostram um placeholder que leva o usuário pra adicionar jogos. Config emapp/config/widgets/favorites-row.ts. - Variants configuráveis pra
TournamentCardeMissionCard(PR #406, +1059/−381). Cada card ganhou 2 variants (classicestacked) seguindo o pattern de domain primitives (mesmo deGameCard/ProviderCard). Internals compartilhados emtournament-internals.tsx. Brand controla viaapp/config/widgets/tournament-card.ts+app/config/widgets/mission-card.ts. Brands 7k-bet-br e cassino-bet-br ganharam overrides próprios. - Setas de overflow no
MethodSelectorde depósito/saque (PR #414). Quando há mais métodos do que cabe na faixa visível, aparecem setas pra navegar lateralmente — substitui o scroll horizontal puro. - Título do torneio movido pra baixo do banner (PR #423) em
vip/tournaments/$id— antes overlapava o banner em mobile.
Cassino / Jogos
- Esconder search trigger do header em listings (PR #412). Em
/games/category/:sluge/games/providers/:slugo ícone de search do header some, e em vez disso aparece um pill de search dentro da página (SearchPill.tsx). Mesmo comportamento em/sports/*. Centralizou a regra emapp/utils/routes.ts(+24 linhas). - Roleta do Craque Neto (PR #411, brand 7k-bet-br). Sidebar buttons ganharam suporte mais robusto a custom items — variants
Colored,GradienteGridagora aceitam shapes ricos com mais campos opcionais. Brand 7k-bet-br adicionou item custom apontando pra/lp/craque-neto-roulettee novastrategy.tsde 21 linhas.
Pagamentos
- Pré-seleção de shortcut default no depósito (PR #415). Ao abrir o
DepositModal, o shortcut marcado como default na config da brand já vem selecionado (e o input já vem preenchido com o valor).app/types/deposit.tsganha o flagdefault?: boolean. Brand 7k-bet-br configurou emoverrides/7k-bet-br/app/config/payments/deposit.ts. - Mensagem de cupom inválido limpa (PR #418).
app/routes/api/payments/coupon.tsparou de propagar a mensagem raw do BFF (que vinha em inglês ou com detalhes técnicos) pro UI — agora cai num fallback i18n controlado pelo front.
SEO
- Redirect 301 de URL com letra maiúscula → minúscula (PR #419).
workers/middleware.ts(+8 linhas) detecta paths com upper-case (ex:/Casino/Slots) e responde 301 pra versão lowercase. Evita conteúdo duplicado pro Google e bate com canonical. og:imageagora usa o ícone PWA da brand como fallback (PR #422), em vez do logo do BFF (que era visualmente fraco em previews de WhatsApp/Twitter). Mudança de 1 linha emapp/routes/_layout.tsx.- Footer: URLs do YouTube normalizadas pra
www.(PR #417). Evita o 301 que o YouTube faz em links semwww, melhorando crawl e performance percebida no clique.
Auth e Recovery
- Recovery options com botão de live support (PR #427, fix
cant-recover-password). Quando o usuário não consegue receber o e-mail/SMS de recovery, oRecoverOptionsStepagora mostra um botão direto pro chat ao vivo — antes ficava num beco sem saída.
Mobile — fixes
- Espaço fantasma no footer + revert temporário do vaul (PR #405).
Modal.tsxajustado pra não criarpadding-bottomparasita no body em iOS quando aberto.app/entry.server.tsxeapp/root.tsx(+76 linhas) com fixes de viewport. PR também isola bot detection emapp/utils/bot.server.ts.
Brand Overrides
- 7k-bet-br: nova landing
/lp/download-app(PR #384). Página dedicada de download do APK Android com 3 backgrounds responsivos (bg-banner-desktop.png,bg-banner-mobile.png,bg-experience.png) e redirect configurado emroutes/lp-redirects.ts+routes/lps.ts. 337 linhas no template da LP emroutes/lps/download-app.tsx. - release-gobbo (PR #404, +6425/−58, brand mega-bundle): integra estratégia de autenticação configurável + enhances do
campaign-widgetem várias brands ao mesmo tempo.- 7k-bet-br: novo
config/strategy/strategy.ts(402 linhas), novoconfig/ftd-checkin/ftd-checkin.ts(14 linhas), atualizagamification.tsecampaign-widget.ts. - cassino-bet-br: novo
config/strategy/strategy.ts(402 linhas),gamification.tsatualizado,campaign-widget.ts(+11 linhas), novo assetmini-games-gift-icon.png. - vera-bet-br: novo
config/strategy/strategy.ts(218 linhas), novoftd-checkin/ftd-checkin.ts(12 linhas),campaign-widget.ts(+8 linhas), troca asset (payday.pngremovido,mini-games-gift-icon.pngadicionado). - fi-7k-bet, ng-7k-bet: ajustes pequenos em
campaign-widget.ts. - Docs internos da feature:
docs/features/ftd-checkin/overview.md(366 linhas) +docs/features/strategy/overview.md(797 linhas).
- 7k-bet-br: novo
- 7k-bet-br: deposit shortcut default marcado em
overrides/7k-bet-br/app/config/payments/deposit.ts(PR #415, +22 linhas). - 7k-bet-br: sidebar-buttons custom item Craque Neto + nova
strategy.ts(PR #411, +40 linhas combinadas). - state77-com, vera-bet-br: header-secondary-nav config própria (PR #425) — ambas brands declaram
overrides/<brand>/app/config/layout/header-secondary-nav.ts. - 7k-bet-br, cassino-bet-br: tournament-card e mission-card variants declaradas (PR #406).
- cl-bet7k-com: home-banner ativa o multi-scroll variant (PR #407).
Infra / CI (front-ops)
feat(deploy): send files to r2— workflow de deploy ganhou step pra subir assets pro R2 da Cloudflare (+13 linhas emdeploy.yml).feat(repos): cl-bet7k-com environment— nova entrada emrepos.ymlpro deploy da brandcl.bet7k.com. Cache config legada emenvironments/stage-cl-bet7k-com/cache.ymlremovida (a config nova vai inline emrepos.yml).fix(deploy): resolve CF zone via explicit cf_zone field— o step de SSR cache purge usavaorigin_domainpra queryGET /zones?name=, que é strict-match. Pra subdomain deploys (cl.bet7k.com,fi.7k.bet,pt.state77.com) o apex zone nunca resolvia e o purge era silenciosamente skipado. Agora cada environment declaracf_zoneexplícito (com fallback compound-TLD-aware:bet.br,com.br,co.uk, etc) e o workflow usa esse campo direto.refactor(deploy): wrangler.toml patching com BUILD_ID + runtime vars— o patch agora injetaBUILD_IDderivado do deploy ref (garante cache key invalidada a cada deploy, alinhado com o novo modelo de cache por buildId do middleware) e consolida runtime vars num único bloco[vars]. Cache policy e KV binding são apendados condicionalmente conforme disponibilidade.