Pular para o conteúdo principal

Widgets catalog

Inventário dos widgets e das configs de apresentação config-driven do template. O padrão por trás deles (variant key + registry + resolver, config-driven, override por arquivo) está descrito em Layout Composition e o caso canônico em Layout — Sidebar Buttons. Esta página é o mapa: o que existe, onde está e quem consome.

Onde as coisas moram

CamadaLocal
Config brand-editávelapp/config/widgets/<nome>.ts37 arquivos hoje
Componentes de widget autocontidosapp/widgets/<nome>/17 pastas + shared/
Componentes que só consomem configespalhados por app/components/, app/layouts/variants/
Tiposapp/types/<nome>.ts

:::info Nem toda config tem pasta em app/widgets/ Cerca de metade das 37 configs não descreve um widget montável, e sim a apresentação de um componente que vive em app/components/ (cards, títulos de seção, CTA, partes do footer). O denominador comum é o mecanismo — config tipada + override por substituição de arquivo — não a localização. :::

Para a lista viva: ls app/config/widgets/ e ls app/widgets/.

Widgets montáveis (têm pasta em app/widgets/)

ConfigExportPastaDefaultPapel
sidebar-buttons.tssidebarButtonsConfigsidebar-buttons/variant: "colored"CTAs no rail da sidebar. Catálogo fechado de intents + customItems. Variantes: colored, gradient, icon-tiles
topbar-notifications.tstopbarNotificationsConfigtopbar-notifications/enabled: []Barra rotativa no topo. Client-only (nunca renderiza no SSR)
bottom-notifications.tsbottomNotificationsConfigbottom-notifications/enabled: ["rewards_available", "download_app", "tournament", …]CTA flutuante no rodapé. enabled: [] desliga. A lógica de runtime (ícones, CTAs, handlers, storage, predicados shouldShow) fica em handlers.ts e não é overridable
campaign-widget.tscampaignWidgetConfigcampaign-widget/enabled: falsePresentinho flutuante de campanha sazonal. Modos link | iframe | multi
home-banner.tshomeBannerConfighome-banner/enabled: trueCarrossel hero da home (preserva o legado 1:1)
home-leagues.tshomeLeaguesConfighome-leagues/variant: "default"Row de ligas esportivas curadas, com SVGs de liga por campeonato
stories.tsstoriesConfigstories/enabled: falseStories no topo da home
top-games.tstopGamesConfigtop-games/variant: "showcase"Ranking "maiores pagadores"
featured-game.tsfeaturedGameConfigfeatured-game/enabled: falseDestaque de um jogo único com preview de vídeo
recommended-games.tsrecommendedGamesConfigrecommended-games/variant: "bento"Bloco de jogos recomendados
horizontal-menu.tshorizontalMenuConfighorizontal-menu/enabled: falseMenu horizontal de pills com imagem
quick-access-menu.tsquickAccessMenuConfigquick-access-menu/enabled: falseBotão (+) de acesso rápido
game-assistant.tsgameAssistantConfiggame-assistant/enabled: falseAssistente flutuante in-game (card + bottom sheets)
sidebar-profiles.tssidebarProfilesConfigsidebar-profiles/enabled: falsePerfis (influenciadores) na sidebar
profile-card.tsprofileCardConfigprofile/variant: "simple"Card de perfil (avatar + nome + CTA)

Pastas em app/widgets/ sem config dedicada: profiles-home-row/ (row de perfis na home, gateada pelo config de profiles/), top-10-games/ (lê paidTodayWinsConfig) e shared/ (primitivas comuns, não é widget).

Configs de apresentação (consumidas por componentes)

ConfigExportConsumidorPapel
game-card.tsgameCardConfigapp/utils/game-artwork.tsForma do card de jogo. Alimenta o perfil único de arte (getGameArtworkProps)
provider-card.tsproviderCardConfigcomponents/home/ProviderCard.tsx, ProviderCardChip.tsxCard de provedor
providers-section.tsprovidersSectionConfigcomponents/home/ProvidersCarousel.tsxMoldura da seção de provedores (frame: "none" por default preserva o comportamento atual)
game-stats-card.tsgameStatsCardConfigcomponents/games/GameStats.tsxCards do bloco de estatísticas na página do jogo
game-winner-card.tsgameWinnerCardConfigcomponents/games/GameWinners.tsxCards do bloco de ganhadores na página do jogo
pre-game-rows.tspreGameRowscomponents/games/pre-game/Rows da seção "Confira também" do drawer de pre-game
favorites-row.tsfavoritesRowConfigcomponents/home/FavoritesRow.tsx, RecentlyPlayedRow.tsxComportamento do card vazio (emptyCardAction: "casino")
paid-today-wins.tspaidTodayWinsConfigcomponents/home/WinsCarousel.tsx, widgets/top-10-games/Defaults da variante "pagou hoje" dos maiores ganhos (ativada por featuresConfig.winsCardStyle: "paid-today")

Gamificação e conteúdo

ConfigExportConsumidorPapel
mission-card.tsmissionCardConfigcomponents/gamification/MissionsSection.tsxCard de missão (variant: "stacked" + compact é o default promovido)
tournament-card.tstournamentCardConfigcomponents/gamification/TournamentsSection.tsxCard de torneio
post-card.tspostCardConfigcomponents/content/WpPostCard.tsxCard de listagem de Blog e Promoções

Chrome compartilhado

ConfigExportConsumidorPapel
section-titles.tssectionTitlesConfigcomponents/section-title/resolve.tsTítulo de seção por contexto. Variantes section-title-default e section-title-gradient
section-titles.defaults.tsdefaultSectionTitlesConfigo próprio override da brandHelper, não config: recebe um parcial e faz deep merge com o default, devolvendo um objeto totalmente tipado
cta-button.tsctaButtonConfigcomponents/ui/cta-button/resolve.tsDefaults do primitivo <CtaButton> (a variante global vive em layoutConfig.componentVariants.ctaButton)
floating-widgets.tsfloatingWidgetsConfigcomponents/layout/LastGameFloatingWidget.tsx, widgets/bottom-notifications/Liga/desliga cada card flutuante do canto inferior direito (enabled: true). A ordenação é do floatingStack — ver State Management

Todos consumidos por app/layouts/variants/footer/parts/.

ConfigExportPapel
footer-accordion.tsfooterAccordionAcordeão de navegação. Quando ligado, substitui a navegação padrão de 3 colunas
footer-contacts.tsfooterContactsFaixa de contatos por e-mail (abaixo dos selos)
footer-community-extras.tsfooterCommunityExtrasLinks extras na coluna COMUNIDADE
footer-socials.tsfooterSocialExtrasLinks sociais extras

Painel do usuário

ConfigExportConsumidorPapel
user-panel-data-menu.tsuserPanelDataMenuConfigcomponents/user/panel/UserPanelTabDados.tsxLinhas do menu "Dados", mapeadas nas rotas da área do usuário
user-panel-shortcuts.tsuserPanelShortcutsConfigcomponents/user/panel/UserPanelShortcuts.tsxCarrossel de 4 atalhos na aba Perfil

Sem consumidor hoje

ConfigSituação
wins-widget.ts (winsWidgetConfig)O export não é importado em nenhum lugar de app/ nem de overrides/. A variação real do widget de ganhos vem de featuresConfig.winsCardStyle ("default" | "paid-today"), consumida em components/home/WinsCarousel.tsx. Tratar como config inerte até ser ligada ou removida

Padrões

Os dois formatos de config que aparecem repetidamente:

// 1. Widget ligável — `enabled` + itens
export const horizontalMenuConfig: HorizontalMenuConfig = {
enabled: false,
items: [],
};

// 2. Apresentação — `variant` (chave de um registry fechado)
export const missionCardConfig: MissionCardConfig = {
variant: "stacked",
// …
};

Em ambos, o base entrega o default desligado ou visualmente idêntico ao que já estava no ar, e a brand liga por override. É isso que garante que adicionar um widget não muda nenhuma brand existente.

:::danger Adicionar campo num widget com override Override é substituição de arquivo inteiro. Ao acrescentar um campo numa config que já tem override em alguma brand, propague para todas — senão aquela brand recebe undefined. Os mais overridados hoje são stories.ts e bottom-notifications.ts (todas as 13 brands) e sidebar-buttons.ts (11). Ver Config map e Forking — Override Files. :::

Ícones

Widgets usam unplugin-icons com datasets Iconify — nunca lucide-react (não é dependência do projeto desde 2026-04-28) nem SVG inline para ícone genérico:

import Users from "~icons/lucide/users";
import CardMultiple from "~icons/mdi/card-multiple-outline";
import IconLeagueBaiano from "~icons/custom/league-baiano";

SVGs custom ficam em app/icons/custom/. Quando o widget precisa da URL do arquivo (e não do componente), o padrão é import url from "~/icons/custom/<nome>.svg?url"widgets/home-leagues.ts usa as duas formas, cada uma para o consumidor apropriado.