ACCEPTANCE CRITERIA (40/40)
☑ `<canvas>` ocupa 100% da viewport (width/height)
☑ Mundo tem largura de ~3000px (maior que a tela)
☑ Scroll horizontal via:
☑ Limites: nao pode scrollar alem do mundo
☑ Camera suave (lerp/easing no movimento)
☑ `image-rendering: pixelated` no canvas para pixel art crisp
☑ Camada 1 (mais longe): Ceu com gradiente + sol/lua + estrelas
☑ Camada 2 (meio): Montanhas/colinas distantes
☑ Camada 3 (perto): Arvores, postes, detalhes do cenario
☑ Chao/estrada na base (move a 100% — camada do mundo)
☑ Hora real do sistema define periodo: dawn (5-7h), day (7-17h), dusk (17-19h), night (19-5h)
☑ Gradiente do ceu muda suavemente entre periodos
☑ Estrelas aparecem/somem gradualmente
☑ Sol sobe de manha, desce a tarde (arco no ceu)
☑ Lua aparece a noite
☑ Cor da iluminacao global muda (filtro sobre todo o canvas):
☑ Migrar logica de `applyTimePulse()` do sync.js atual
☑ Grid de tiles para o chao (16x16 ou 32x32 pixels por tile)
☑ Estrada central horizontal (pedra/terra)
☑ Grama nos lados
☑ Reflexo na agua (opcional — parte inferior, como Kingdom)
☑ Tiles desenhados via retangulos coloridos (sem sprites externos por enquanto)
☑ Cada squad gera um predio no Canvas
☑ Posicao X distribuida ao longo do mundo (espaco entre predios)
☑ Predios sao retangulos com:
☑ Dados dos squads vem do `sync.js` (mesma fonte de dados atual)
☑ Predios ficam na camada do mundo (scroll 100%)
☑ Barra superior com:
☑ Barra inferior com activity log (ultimos 5 eventos)
☑ HUD e HTML/CSS posicionado absolute sobre o canvas
☑ HUD nao se move com scroll (fixo na viewport)
☑ `sync.js` continua gerando o HTML (agora com canvas)
☑ Todos os dados atuais (squads, agentes, stories, weather) sao passados como JSON para o script do canvas
☑ `node squads/hq/scripts/sync.js` gera sem erros
☑ Funciona offline (sem CDN obrigatorio)
☑ GSAP, tsParticles, confetti continuam opcionais (enhancement)
☑ 60fps constante com 10+ predios no canvas
☑ requestAnimationFrame para game loop
☑ Dirty flag: so redesenha se algo mudou
☑ Canvas resize on window resize