Disponível para novos projetos
Transformamos
Ideias em
Resultados Reais
Estratégia, design e tecnologia unidos para levar seu negócio
ao próximo nível com soluções que realmente funcionam.
Projetos entregues
Clientes satisfeitos
Anos de experiência
Otimizando resultados…
em conversões
há 2 minutos
Role para explorar
Empresas que confiam no nosso trabalho
Microsoft
Nubank
iFood
Shopify
Stripe
Figma
Notion
Microsoft
Nubank
iFood
Shopify
Stripe
Figma
Notion
Soluções completas para
seu crescimento
Design & UX
Interfaces que encantam e convertem. Design centrado no usuário com foco em resultados mensuráveis.
Performance Web
Sites ultra-rápidos com Core Web Vitals perfeitos. Velocidade que impacta diretamente seu SEO e conversão.
Growth & Marketing
Estratégias orientadas por dados para aumentar tráfego orgânico, leads qualificados e receita.
Automação & IA
Integração de inteligência artificial e automações que economizam tempo e escalam seu negócio.
Vamos criar algo
extraordinário juntos
Agende uma conversa gratuita de 30 minutos e descubra como podemos transformar seu negócio.
/* ═══════════════════════════════════
CANVAS PARTICLES
═══════════════════════════════════ */
(function(){
const canvas = document.getElementById(‘hero-canvas’);
const ctx = canvas.getContext(‘2d’);
let particles = [], W, H, mouse = {x: -999, y: -999};
function resize(){ W = canvas.width = window.innerWidth; H = canvas.height = window.innerHeight; }
resize();
window.addEventListener(‘resize’, resize);
window.addEventListener(‘mousemove’, e => { mouse.x = e.clientX; mouse.y = e.clientY; });
class Particle {
constructor(){
this.x = Math.random() * W;
this.y = Math.random() * H;
this.size = Math.random() * 2 + 0.5;
this.speedX = (Math.random() – 0.5) * 0.4;
this.speedY = (Math.random() – 0.5) * 0.4;
this.opacity = Math.random() * 0.5 + 0.1;
}
update(){
this.x += this.speedX; this.y += this.speedY;
if(this.x W) this.speedX *= -1;
if(this.y H) this.speedY *= -1;
}
draw(){
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fillStyle = `rgba(139,92,246,${this.opacity})`;
ctx.fill();
}
}
for(let i=0; i<80; i++) particles.push(new Particle());
function connectParticles(){
for(let a=0; a<particles.length; a++){
for(let b=a+1; b<particles.length; b++){
const dx = particles[a].x – particles[b].x;
const dy = particles[a].y – particles[b].y;
const dist = Math.sqrt(dx*dx + dy*dy);
if(dist { p.update(); p.draw(); });
connectParticles();
requestAnimationFrame(animate);
}
animate();
})();
/* ═══════════════════════════════════
COUNTER ANIMATION
═══════════════════════════════════ */
function animateCounter(el){
const target = parseInt(el.dataset.target);
const duration = 2000;
const start = performance.now();
function update(now){
const progress = Math.min((now – start) / duration, 1);
const eased = 1 – Math.pow(1 – progress, 3);
el.textContent = Math.round(eased * target);
if(progress {
entries.forEach(entry => {
if(entry.isIntersecting){
entry.target.classList.add(‘visible’);
}
});
}, { threshold: 0.15 });
document.querySelectorAll(‘.reveal’).forEach(el => observer.observe(el));
const counterObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if(entry.isIntersecting){
entry.target.querySelectorAll(‘.stat-number’).forEach(animateCounter);
counterObserver.unobserve(entry.target);
}
});
}, { threshold: 0.5 });
const statsSection = document.querySelector(‘.hero-stats’);
if(statsSection) counterObserver.observe(statsSection);