Pular para o conteúdo principal

Config map

app/config/ é a superfície brand-editável do template: só dados e config, nenhum maquinário. Está organizada em 22 subpastas semânticas por domínio, mais 4 arquivos soltos de escopo global.

Convenção de import

import { themeColors } from "~/config/theme/colors";
import { routePaths } from "~/config/routes/paths";
import { featuresConfig } from "~/config/features/features";
import { sportsConfig } from "~/config/sports/sports";
import { sidebarButtonsConfig } from "~/config/widgets/sidebar-buttons";

Três regras:

  1. O caminho é sempre ~/config/<dir>/<arquivo> — o diretório de domínio é obrigatório.
  2. Não existe sufixo .config. ~/config/theme.config, app/config/sports.config.ts, ~/config/routes.paths e afins são caminhos pré-reorg e não resolvem.
  3. O sufixo .server, quando existe, é semântico: aquele config só pode ser importado de código server-side (ex: ~/config/gamification/gamification.server, ~/config/seo/page-descriptions.server, ~/config/legal/pages-content.server).

Como o override de brand funciona

O brandOverridesPlugin (vite-plugins/brand-overrides.ts) intercepta cada import "~/config/<dir>/X". Se existir overrides/<brand-key>/app/config/<dir>/X.ts, ele usa esse arquivo inteiro. O <brand-key> vem do ORIGIN_DOMAIN com .-.

:::danger Substituição de arquivo, nunca deep-merge Não há merge campo a campo. Ao adicionar um campo novo num config que tem overrides, propague para todos os overrides existentes — senão aquela brand recebe undefined. Dois padrões escapam disso de propósito: defineLayoutConfig() (que faz deep merge com os defaults dentro do arquivo) e tokens com fallback explícito no consumidor (ex: themeColors.money ?? themeColors.success no tailwind.config.js). Ver Forking — Override Files. :::

Três arquivos de routes/ são especiais: além do plugin, eles são lidos em config time por app/router/routes.ts (via vite-plugins/brand-resolver.mjs), porque geram rotas antes do build da árvore — paths.ts, lp-redirects.ts e legacy-redirects-cross-brand.ts. Ver Routing.

Os três arquivos parseados pelo tailwind.config.js (theme/colors.ts, theme/sizes.ts, theme/fonts.ts) têm uma restrição extra de forma literal — ver Theming.

Os 22 domínios

A coluna "override" indica se alguma brand em overrides/ sobrescreve algum arquivo do domínio hoje. Para o estado exato, ls overrides/<brand-key>/app/config/.

DomínioConfiguraArquivosOverride
analytics/Trackers e o contrato de eventos: analytics.ts (GTM/Pixel, com undefined caindo nos valores da API), analayer.ts (subsistema GA4), appsflyer.ts, hotjar.ts, pendo.ts, schema.ts (fonte de verdade do dataLayer)6
auth/legal-texts.ts — bloco de informativos legais nos modais de auth (default desligado)1
cashback/eligible-games.ts — IDs de jogos elegíveis ao fluxo FTD Cashback (D0)1
catalog/Curadoria do catálogo: categories.personalize.ts (personalize das categorias do BFF), category-chip-order.ts (ordem curada dos chips), game-thumbs.ts (thumbs custom por slug), smart-related.ts (exclusões da sidebar de sugestões)4
content/Conteúdo estático/curado: faq.server.ts, game-details.server.ts (SEO + descrição por jogo), help-category-icons.ts, promocode.ts4
features/Feature flags por escopo: features.ts (geral), account.ts, auth.ts, contents.ts (áreas de conteúdo), remarketing.ts, phone-outage-notice.ts6
ftd-checkin/ftd-checkin.ts — check-in diário pós-FTD (desligado no base)1
gamification/Smartico: gamification.ts (client), gamification.server.ts (chaves server, incl. salt do hash), gamification-ui.ts (aparência por superfície)3
layout/Composição e navegação: composition.ts (shell/estrutura/slots), header.ts, header-secondary-nav.ts, sidebar.ts, sidebar-sports.ts, bottomnav.ts, footer.ts, menu.ts, user-tabs.ts9
legal/pages.ts (quais páginas legais existem + chaves i18n), pages-content.server.ts (fallback HTML), licenses.ts, extra-legal-links.ts, hidden-footer-slugs.ts e a pasta html/ com o conteúdo por documento5 + html/
payments/deposit.ts (atalhos de valor e badges por moeda), methods.ts (filtro sobre o que o BFF devolve), kushki.ts, testers.ts (user IDs que veem métodos is_test)4
profiles/index.ts + pasta profiles/ — perfis de influenciadores. O base não traz nenhum1 + profiles/
referral/v1.ts e v2.ts (as duas variantes do fluxo "Indique e ganhe") + eligible-games.ts3
routes/paths.ts (o Route Registry), legacy-redirects.ts, legacy-redirects-cross-brand.ts, lp-redirects.ts, lps.ts + pasta lps/, live-hub-redirect.ts6 + lps/
scripts/Injeção e delivery: scripts.ts (tags <script> arbitrárias em head/body), images.ts (Cloudflare Images, incl. useProxy), games.ts3
search/popular-terms.ts — chips de termos populares no estado idle de /search1
sections/Rows das páginas: home-rows.legacy.ts, casino-rows.legacy.ts, casino-live-rows.legacy.ts (usados nos modos legacy/mixed) e home-row-overrides.ts (apresentação por slug das rows vindas do BFF)4
seo/seo.ts (tokens de verificação, OG fallback, perfis sociais), hreflang.ts, sibling-route-paths-7k.ts, sitemap.ts (grupos extras), page-descriptions.server.ts, games-seo.server.ts, sports-seo.ts, branded-home-links.ts8
sports/sports.ts (sportsbook principal + o de teste), provider.ts (helper do override por ambiente FORCE_SPORTBOOK)2
strategy/strategy.ts — campanhas em iframe disparadas por UTM (desligado no base)1
theme/colors.ts, fonts.ts, sizes.ts, font-preloads.ts, header.ts, mobile-bottom-nav.ts, search-input.ts — ver Theming7
widgets/37 configs de widget — ver Widgets catalog37

Arquivos soltos (escopo global)

ArquivoConfiguraOverride
app-install.tsTodo o fluxo "Baixar App" da brand (substituiu o campo único brand.appearance.links.appDownload)
brand-appearance.tsForça campos de brand.appearance no front, ignorando o valor do BFF
brand-links.tsForça campos de brand.appearance.links no front, ignorando o BFF
version-panel.tsPainel de versão/cache + window.__forceClearCache — diagnóstico e recuperação de cache preso

O que toda brand nova precisa sobrescrever

Estes 15 arquivos são sobrescritos por todas as 13 brands em overrides/ hoje. Trate como o mínimo de um fork novo:

analytics/appsflyer.ts
features/account.ts
features/auth.ts
features/contents.ts
features/features.ts
features/remarketing.ts
gamification/gamification.ts
sections/casino-live-rows.legacy.ts
sections/casino-rows.legacy.ts
sections/home-rows.legacy.ts
sports/sports.ts
theme/colors.ts
theme/sizes.ts
widgets/bottom-notifications.ts
widgets/stories.ts

Quase universais (12 de 13): routes/paths.ts, layout/sidebar.ts, legal/licenses.ts, scripts/images.ts, seo/page-descriptions.server.ts.

:::info Só 13 brands vivem no base cassino.bet.br e vera.bet.br foram removidos do base em 2026-07 e não têm mais override nem environment de deploy neste workspace. :::

Adicionando um config novo

  1. Escolha o domínio existente que melhor descreve o assunto. Domínio novo só quando nada serve.
  2. Crie app/config/<dir>/<nome>.ts exportando uma const nomeada e tipada.
  3. Declare o tipo em app/types/ quando ele for consumido em mais de um lugar.
  4. Se o config precisar rodar só no server, use o sufixo .server.
  5. Se um campo novo entra num arquivo que já tem overrides, propague para todos eles.

Convenção geral: o base traz o default desligado/vazio e a brand liga via override. Isso é o que mantém o template neutro e cada fork explícito sobre o que usa.