Orbit Site 🌐
O site do Orbit hospeda a landing page institucional (React) e os jogos integrados ao aplicativo Flutter via WebView. Os jogos são feitos no Godot 4 e publicados aqui como exportação Web.
Deploy: Cloudflare Pages (automático em push para stable)
🚀 Stack Tecnológica
| Tecnologia | Uso |
|---|---|
| React 19 + TypeScript | Framework da landing page |
| Godot 4 (GDScript) | Engine dos jogos (exportados para Web) |
| Vite | Build tool e dev server |
| Tailwind CSS v4 | Estilização (CSS-first configuration) |
| Framer Motion | Animações |
| Cloudflare Pages | Deploy e hospedagem |
📂 Estrutura
site/
├── src/
│ ├── components/ # Componentes de UI reutilizáveis
│ ├── pages/ # Páginas da landing page
│ └── assets/ # Recursos visuais
│
├── games/ # Saída dos jogos Godot (um index.html + .js/.wasm/.pck por pasta, servidos via WebView no app)
│ ├── sudoku/ # Puzzle de números
│ ├── minesweeper/ # Campo Minado
│ ├── memory/ # Jogo da Memória
│ ├── tictactoe/ # Jogo da Velha
│ ├── space/ # Jogo espacial
│ ├── runner/ # Endless Runner
│ ├── combat/ # Combate entre personagens
│ └── master/ # Mini-game master
│
├── public/ # Arquivos estáticos (favicon, robots.txt)
├── package.json
├── vite.config.js
└── tailwind.config.js🎮 Jogos (Godot → Web)
Os jogos não são escritos em Flutter nem em React. São projetos Godot 4 (pasta /games na raiz do monorepo), exportados para Web e rodando dentro do app via flutter_inappwebview. Isso permite:
- ✅ Atualizar jogos em produção sem nova versão nas lojas
- ✅ Corrigir bugs sem ciclo de revisão da Apple/Google
- ✅ Engine de jogos de verdade (física, partículas, áudio)
Publicar um jogo
- No Godot: Projeto → Exportar → Web (Orbit WebView) → Exportar Projeto (saída:
games/<Nome>/build/web/— a pasta precisa existir, o Godot não a cria) - Apague o conteúdo React antigo de
site/games/<nome>/(inclusivepackage.json— se sobrar, o CI tentanpm run builde o deploy quebra) - Copie todos os arquivos de
build/web/(index.html,index.js,index.wasm,index.pck) parasite/games/<nome>/ - Push na branch
stable→ obuild:gamescopia a pasta crua paradist/games/<nome>e o Cloudflare Pages publica emredeorbit.com/games/<nome>
Atenção: Os jogos exigem suporte a
SharedArrayBufferpara rodar na web. Por conta disso, a landing page serve os arquivos estáticos com os headersCross-Origin-Opener-PolicyeCross-Origin-Embedder-Policy(COOP/COEP) habilitados no Cloudflare Pages através do arquivosite/public/_headers.
Comunicação Flutter ↔ Jogo
# Jogo → Flutter (enviar pontuação p/ o ranking)
JavaScriptBridge.eval("window.flutter_inappwebview.callHandler('onScoreSubmit', %d)" % score)// Flutter → Jogo (via URL params)
// https://redeorbit.com/games/sudoku?lang=pt&minimal=trueInternacionalização dos Jogos
O idioma chega via parâmetro de URL ?lang=pt|en|es — cada jogo Godot lê e aplica suas próprias traduções. (O engine.ts com traduções/áudio padronizados é legado da época React.)
🛠️ Desenvolvimento
npm install
# Dev server da landing page
npm run dev # → http://localhost:5173
# Build dos jogos
npm run build:games🚀 Deploy
O deploy é contínuo via Cloudflare Pages. Cada push na branch stable dispara um build automático.
NOTE
Este projeto usa as novas funcionalidades do Tailwind v4 (configuração CSS-first). Evite usar a API JS do tailwind.config.js para configurações — prefira as variáveis CSS nativas do v4.