Bottom Notification Widget (refator pra padrão topbar)
Substituição do InstallAppFloatingWidget por BottomNotification config-driven (app/components/layout/BottomNotification.tsx). O widget flutuante deixa de ser específico só pra "instalar app" e vira uma fila de tipos configuráveis, espelhando a arquitetura do topbar (types, store, handlers, definitions queue). O componente legado (InstallAppFloatingWidget.tsx, ~200 linhas) foi removido.
Seis tipos de notificação suportados:download_app, push_notify, rewards_available, referral, telegram e tournament. Cada brand define quais ficam habilitados e em qual ordem de prioridade — o primeiro que passa no shouldShow renderiza, igual à lógica do topbar.
Separação dados × runtime:app/config/bottom-notifications.config.ts carrega só dados puros (lista de enabled, rotationDelaySeconds, params por tipo) e é overrideable por brand. A lógica runtime (ícones Lucide, ctaHref/onCta, predicados shouldShow, estratégia de storage) fica em app/layouts/bottom-notification/handlers.ts — não overrideable, espelha 1:1 o buildTopbarDefinitions.
rotationDelaySeconds configurável: com 0 (default) o swap pro próximo widget elegível é instantâneo após dismiss, igual ao topbar. Valores maiores dão um "respiro" antes do próximo slide-up.
Revalidação reativa em auth/rewards: quando o usuário loga, desloga ou ganha um reward, a fila reavalia automaticamente (paridade com o topbar) — sem precisar navegar pra atualizar o estado do widget.
Novo bloco de tokens bottom-notification-* em theme.config.ts (bg, text, icon-bg, icon-text, cta-bg, cta-text, border). Registrado no tailwind.config.js e propagado pra todas as 13 brands com valores específicos, permitindo cor distinta entre topbar e bottom-notification em cada brand.
Cookie/event/data-attr keys prefixados bottom_* (vs topbar_* da counterpart). O estado de dismiss do widget flutuante é independente do topbar — usuário fechar a notificação no rodapé não some com o topbar equivalente, e vice-versa.
Floating stack registra só depois do slide-in (app/store/floatingStack.ts). Antes, o espaço era reservado prematuramente, o que podia empurrar layout em rotas que ainda não tinham decidido renderizar o widget.
Pin de largura desktop em 400px (app/components/layout/BottomNotification.tsx): substitui lg:min-w-[300px] por lg:w-[400px] pro widget manter tamanho estável em desktop ao invés de crescer com o conteúdo do CTA.
Bloco layout.bottom_notification adicionado nos 4 locales (pt-br, pt, es, en) em packages/i18n/locales/<locale>/layout.json. Estrutura: close + 6 sub-blocos (download_app, push_notify, rewards_available, referral, telegram, tournament), cada um com title, subtitle e cta. Espelha o shape existente de topbar — fica trivial reaproveitar copy entre as duas superfícies.
Variável {{appName}} preservada no título de download_app (paridade com a chave legada install_app.floating_title que já usava o pattern). Brand não precisa hard-codar o nome do app na cópia.
Bump do consumidor: o base atualizou @cactus-agents/i18n pra 0.70.2 no commit que landa o widget — sem essa versão, o componente renderiza chaves cruas.
Topbar das 7k alinhada (br/fi/ng):bg mudou de #373b5b pra #282b48 (mais escuro), icon-bg virou #a1cd3d (verde brand) e icon-text foi pra #16182a em todas as três variantes 7k (7k-bet-br, fi-7k-bet, ng-7k-bet). Os 3 brands compartilham o mesmo block de tema do topbar agora.
Config de bottom-notification propagada nas 13 brands:7k-bet-br, betpontobet-bet-br, casateste-com, cassino-bet-br, fi-7k-bet, ng-7k-bet, pb-bet, ph-state77-com, pt-state77-com, rj-bet, state77-com, vera-bet-br e x2b-bet. Cada brand recebeu seu próprio bottom-notifications.config.ts (lista enabled espelhando a lista do topbar daquela brand), features.config.ts (8 linhas adicionais por brand) e theme.config.ts (11 linhas: tokens bottom-notification-* específicos da brand).