Nume Company, agência de marketing digital em São Paulo. A partir daqui, nós avançamos juntos.
Agência de marketing full service. Da estratégia ao resultado com marketing 360, para marcas nacionais e globais.
Falar agoraCases nacionais
Anos de
experiência
Presença
global
Premiação
em Mônaco
Time
sênior
Gastronomia que conecta.
Conteúdo que aproxima e SEO que leva o cliente até a mesa.
Ver case completo ↗visitas orgânicas ao site em 60 dias
rotas pedidas pelo Google em 60 dias
ligações direto pelo Google em 60 dias


Mais alcance, menos custo.
Aumento expressivo nas impressões, 42,5% a menos no custo e visitantes que ficam 472% mais tempo no site. Um público muito mais qualificado.
Ver case completo ↗De 42s para 4,22 min por visitante
Antes R$ 0,82 por visitante
Menos cliques, visitas de muito mais qualidade
Wheaton
Estratégia que transforma
Projeto de branding e redes sociais que rendeu prêmio em Mônaco para a Wheaton.
Ver case completo ↗





Nume Company: agência de marketing digital em São Paulo
A Nume Company é uma agência de marketing digital full service com escritórios no Itaim Bibi, em São Paulo (SP), e em Sorocaba (SP). Há mais de 18 anos atende empresas de negócios locais a marcas globais, com mais de 180 empresas atendidas, time 100% sênior, nota 5,0 em 39 avaliações de clientes no Google e cases no Brasil, Estados Unidos, Portugal, Alemanha, Austrália e Mônaco, incluindo um case de redes sociais premiado em Mônaco para a Wheaton. A agência foi fundada e é liderada por Pedro Bruder, CEO, autor do livro Domine o Marketing 5.0, distribuído pela Amazon, e palestrante convidado oficial do Parque Tecnológico e da Prefeitura.
Somos uma agência de marketing para empresas que buscam crescimento: agência de redes sociais, agência de tráfego pago, agência de SEO e GEO, branding e criação de sites e apps, com estratégia e execução no mesmo time.
Serviços da agência de marketing
- Análise de dados reais do mercado
- Segmentação e personas
- Estratégia de marketing full-service
- Gestão de redes sociais
- Gestão de tráfego pago (Google Ads, Meta Ads, LinkedIn Ads)
- Branding para marcas e empresas
- Criação de logo e identidade visual
- Design UX/UI e criação de peças
- Gestão de tráfego orgânico SEO e GEO (otimização para Google, ChatGPT e Gemini)
- Geração de demanda qualificada
- Automação de email
- Criação de conteúdo relevante
- Criação de sites e apps de alta performance
- Gestão de marketing de influência para marcas
Cases de resultado
- Jardineira Grill (São Paulo): 12 mil visitas orgânicas ao site em 60 dias com SEO, 4.609 rotas solicitadas e 1.815 ligações pelo Perfil da Empresa no Google, e reels orgânico com mais de 600 mil visualizações.
- Oliveira Trust: com a Nume em Google Ads, em um ano, +90% de impressões, custo por clique 41% menor, investimento 42,5% menor e tempo médio no site 472% maior.
- Wheaton: projeto de branding e redes sociais premiado em Mônaco.
- Wheaton: case premiado em Mônaco (Redes Sociais)
- Beflex: app e benefícios em um único cartão (Sites e Apps)
- Melten: Soft-Service Experience (Branding e Social Media)
- Água Dias D'Ávila: linha completa (Branding e Social Media)
- JAH: ser feliz é regra (Branding e Social Media)
- Summit Cosmetics: inovação em cores (Social Media)
- JA Solar: tão presente quanto o sol (Social Media)
- Serigy: energia lá em cima (Branding e Social Media)
- VaBene na FIPAN 2026 (Social Media)
- Lynx Biological: ouro verde do Brasil (Social Media)
- Fulya Guaraná (Branding e Social Media)
- Conteúdo com Erick Jacquin (Studio Nume)
- Wheaton: gente que transforma (Redes Sociais)
- JAH: açaí que é regra (Branding e Social Media)
- Dias D'Ávila com gás (Branding e Social Media)
- Summit Cosmetics: home off (Social Media)
- VaBene: sobremesa extra (Social Media)
- Serigy: ativação de marca (Branding e Social Media)
- JA Solar: estande em feira (Social Media)
- JAH: picolé 0% lactose (Branding e Social Media)
- Conheça o projeto criado com foco em usabilidade para a HD (Sites e Apps)
- Beflex: todos os benefícios em um único cartão (Sites e Apps)
- Refresque-se nesse novo site criado para a Água Dias D'Ávila (Sites e Apps)
- Site de alta performance criado para a Prime Veículos (Sites e Apps)
- Amica Systems: precisão, velocidade e tecnologia (Sites e Apps)
Depoimentos de clientes
- Lorena Coltro, Coordenadora de Marketing Yesbank: “Há quatro meses trabalhando com a Nume já avançamos em vários pontos na YESPAY. Muita dedicação e concentração na hora de realizar o projeto e sempre com as entregas em dia. Falando em questão de design e beleza fomos muito surpreendidos com o trabalho incrível que fizeram! Não tenho dúvidas de que fiz a melhor escolha dentre todas as empresas de publicidade que pesquisei, eles realmente têm muito talento! Agradeço todo carinho e atenção dos envolvidos!”
- Esmeralda Angelita, CEO Costatt Clinic Austrália: “Obrigada por estarem fazendo um bom trabalho, a gente está muito feliz, tem muita gente ligando e procurando a gente pelos advertising, isso é muito positivo, sinal de que está funcionando bem, então quero agradecer. Muito bom!”
- Alexandre Fernandes, CEO da NX Capital: “A Nume foi nosso divisor de águas após muitas tentativas com outras agências. O conhecimento técnico, expertise e know-how sobre a área de publicidade é espantosa, elevando o nível de excelência para nossa marca. Chama atenção seu modelo de relacionamento, sempre muito próximo ao cliente, aparando todas as dúvidas e sugerindo ideias antes nunca imaginadas de forma a otimizar nossos investimentos. Recomendo fortemente e tenho convicção que a Nume é a melhor em atuação no mercado.”
- Felipe Pregnolatto, Gamers Club: “Uma empresa especializada no que se propõe a fazer, com conhecimento ímpar e preocupada com a excelência no atendimento, entende que o cliente é o centro do negócio e o valoriza.”
- Roberta Furniel, Diretora de Marketing Fidati e Beflex: “A Nume é mais que uma Agência, é uma parceira de negócios pra Fidati. Contribui, além do nosso rebranding, para nossa estratégia e execução do plano 360º de marketing, contemplando os principais pilares e sempre disponíveis a fazer além, junto da proatividade em propor coisas novas!”
- Talita Aurani, Futuro House: “Atendimento extremamente eficiente, propositivo e humanizado, atento a cada detalhe e necessidade que sinalizamos para nosso projeto.”
Blog da Nume
- Como Posicionar Seu Site Nas Buscas Por “Perto de Mim” Em São Paulo e Atrair Clientes Todos os Dias
- As Melhores Estratégias de Marketing Digital para Pequenas Empresas Que Realmente Funcionam
- Quanto custa contratar uma agência de marketing em São Paulo, SP?
- Marketing Médico: O Guia Definitivo para Atrair Mais Pacientes de Forma Ética e Eficiente
- SEO local: Como Fazer Sua Empresa Aparecer Para Quem Está Perto de Você
- Marketing Digital B2B: Como Vender Para Outras Empresas Sem Complicar
- Agência de Tráfego Pago: O Segredo Para Atrair Mais Clientes e Vender Mais
- Agência de Marketing Digital Full Service: A Solução Completa Que Sua Empresa Precisa
- As 50 Maiores Agências de Marketing do Mundo: Conheça os Gigantes da Publicidade
- As Gigantes da Criatividade: Quem Manda nas Maiores Agências de Publicidade do Brasil?
- Melhores Agências de Marketing Digital em São Paulo: Guia Completo pra Você Escolher
- As Melhores Agências de Marketing Digital do Brasil
39 avaliações de clientes no Google
Nota máxima em avaliações.
Role para acender · clique para comemorar
Sim, a sua marca pode ser referência no mercado.

Wheaton: case premiado em Mônaco
O que podemos fazer pela sua empresa?
Role para passar pelos 12 serviços da Nume.
Especialidades da casa
Ideias e narrativas
Criamos storytelling que converte.
Otimização de recursos
Estratégias que fazem o budget dar resultado.
Receba uma consultoria sem custos para sua marca ou empresa.
Marcar agoraNossos clientes indicam mundo afora.
Time sênior, com mais de 18 anos de experiência em negócios locais, nacionais e globais.
EspecialistasMultiplataformas
Marketing omnichannel.
Criação de sites e APPs de alta performance.
Como acertar na escolha da agência?
Busque quem tem o que mostrar
Um bom portfólio mostra, na prática, o que a agência entrega.
Tempo de mercado conta
A experiência separa os aventureiros dos profissionais.
Estratégia e execução, juntas.
Time 100% sênior, marketing 360 e especialistas nas maiores plataformas.
Consultoria sem custosTime 100%
sênior
Gestores de alta performance comandando cada conta, de negócios locais a marcas globais.
Fale com um especialistaGestão de marketing de influência para marcas.
Mais de +200 influenciadores cadastrados na nossa base.
Quem conhece, ama o nosso trabalho, indica e confia.
Blog da Nume
Ficou com alguma dúvida?
Por que contratar uma agência de marketing digital?+
Uma agência de marketing digital, de verdade, vai entender o potencial do cliente. Traçando estratégias eficazes, de acordo com o objetivo da marca num determinado momento de sua jornada: brand, captação de leads ou conversão.
Quanto custa para contratar uma agência de marketing digital?+
O valor do trabalho de uma agência deve ser medido por projeto ou por fee mensal. A variação decorre de objetivos e demandas por determinados profissionais. Por exemplo, haverá produção de vídeos, gestão de redes sociais, automação de marketing, SEO? Em qual nível de abrangência? Tudo depende do "tamanho" do objetivo.
Como escolher uma agência de marketing digital?+
Primeiramente é preciso definir o objetivo da sua empresa. Deseja mais clientes, aumentar o ticket médio, aumentar o reconhecimento de marca? Definindo essa primeira questão é necessário buscar agências que entendam o universo do marketing digital como um todo, mas que deixem claro suas especialidades. Pois quem se diz bom em tudo, dificilmente fará o seu trabalho com perfeição. Busque por pelo menos três opiniões diferentes e defina aquela que faça mais sentido com o objetivo da marca e budget.
Toda agência de marketing digital é igual?+
De forma alguma, cada agência tem sua especialidade e seu nível de experiência.
Contratar uma agência de marketing digital ou internalizar?+
Internalizar o processo de marketing como um todo é o mesmo que confeccionar os próprios sapatos, você até sairá de casa, mas provavelmente não irá longe até o primeiro furo. Os detalhes e experiência na gestão do marketing possibilitam solidez e constância nas estratégias. Porém ter um profissional interno para intermediar a agência é importante para que a comunicação seja fluida.
`;
const show=()=>{cap.textContent=c[1]+' · '+c[2];a._h=1};const hide=()=>{a._h=0};a.addEventListener('pointerenter',show);a.addEventListener('focus',show);a.addEventListener('pointerleave',hide);a.addEventListener('blur',hide);arc.appendChild(a);return a});
cap.textContent=L[0][1]+' · '+L[0][2];
let R=600,cy=660;const sec=box.closest('section');
const fit=()=>{const w=box.clientWidth,H=box.clientHeight;const cw=(cards[0]&&cards[0].offsetWidth)||200;R=Math.max(460,Math.min(w*.56,880));cy=Math.max(R+cw*.85+70,H*.5+R*.5);arc.style.top=cy+'px';ctr.style.top=Math.min(H-ctr.offsetHeight-40,cy-R*.5)+'px'};
new ResizeObserver(fit).observe(box);fit();
const seen=watch(sec);const st=Math.max(16,(cards[0].offsetWidth*1.08)/R*57.3),N=cards.length;let pS=0;
onTick(()=>{if(!seen())return;const r=sec.getBoundingClientRect();const p=clamp(-r.top/Math.max(1,sec.offsetHeight-innerHeight),0,1);pS=lerp(pS,p,RM?1:.1);
const lead=-95+pS*(190+(N-1)*st);
cards.forEach((el,i)=>{const a=lead-i*st;const o=1-clamp((Math.abs(a)-72)/18,0,1);const s=el._h?1.1:1;el.style.transform=`rotate(${a}deg) translateY(${-R}px) scale(${s})`;el.style.opacity=o;el.style.visibility=o<.02?'hidden':'visible';el.style.zIndex=el._h?5:1})});
})();
/* ---------------- together we make (built while scrolling) ---------------- */
(function(){const sec=$('#juntos'),strip=$('#twm'),end=$('#twEnd');let pS=0;const seen=watch(sec);
const parts=$$('.tb',strip),rings=$$('.ring:not(.dash)',strip),dash=null;
const mk=$('.tw-word.make',strip);const letters=[...mk.textContent].map(c=>{const sp=document.createElement('span');sp.className='ch';sp.textContent=c;return sp});mk.textContent='';letters.forEach(l=>mk.appendChild(l));
const ease=x=>1-Math.pow(1-x,3),back=x=>{const c=1.7;return 1+(c+1)*Math.pow(x-1,3)+c*Math.pow(x-1,2)};
onTick((dt,t)=>{if(!seen())return;const r=sec.getBoundingClientRect();const p=clamp(-r.top/Math.max(1,sec.offsetHeight-innerHeight),0,1);pS=lerp(pS,p,RM?1:.12);
const W=innerWidth;const e=end.offsetLeft+end.offsetWidth/2,sw=strip.scrollWidth;
const a=clamp(pS/.7,0,1),b=clamp((pS-.66)/.34,0,1);
const off=(el)=>{let x=0,y=0,n=el;while(n&&n!==strip){x+=n.offsetLeft;y+=n.offsetTop;n=n.offsetParent}return [x,y]};const la=letters[1],[ax,ay]=off(la),aX=ax+la.offsetWidth*.5,aY=ay+la.offsetHeight*.66;const tx=lerp(W*.92,W/2-e,ease(a))+(e-aX)*Math.min(1,b*1.6);const need=Math.hypot(W,innerHeight)/(la.offsetWidth*.32);const sc=Math.exp(Math.log(need)*Math.pow(b,1.5));
strip.style.setProperty('--tx',tx+'px');strip.style.setProperty('--ox',aX+'px');strip.style.setProperty('--oy',aY+'px');const fd=RM?0:clamp((b-.5)/.3,0,1);strip.style.opacity=(1-fd).toFixed(3);strip.style.setProperty('--ts',sc.toFixed(3));
const K=new Map();parts.forEach(el=>{const bx=el.getBoundingClientRect();const cx=bx.left+bx.width/2;const k=RM?1:clamp((W*.98-cx)/(W*.32),0,1);K.set(el,k);el.style.setProperty('--k',back(k).toFixed(3));el.style.setProperty('--o',Math.min(1,k*2).toFixed(2));el.style.setProperty('--rr',((1-k)*-25)+'deg')});
rings.forEach((rg,i)=>{const k=RM?1:clamp((K.get(rg.closest('.tb'))-.5)/.5,0,1);rg.style.setProperty('--d',(1-ease(k)).toFixed(3))});
const km=K.get(mk.closest('.tb'));
letters.forEach((l,i)=>{const k=RM?1:clamp((km-.35-i*.1)/.35,0,1);const e2=back(k);l.style.setProperty('--cy',((1-e2)*.6)+'em');l.style.setProperty('--cr',((1-k)*-14)+'deg');l.style.setProperty('--co',Math.min(1,k*1.5))})});
})();
/* ---------------- lightbox ---------------- */
const lb=$('#lb');
const CPG={'c-wheaton':['case-wheaton','/case-wheaton-redes-sociais-premiado-monaco/'],'c-beflex':['case-beflex','/case-beflex-branding-site-app/'],'c-diasdavila':['case-dias','/case-agua-dias-davila-branding-redes-sociais/'],'c-serigy':['case-serigy','/case-serigy-branding-redes-sociais/']};
function openCase(img,title,cat,url){$('#lbImg').src='/img/case-'+img+'.webp';$('#lbTitle').textContent=title;$('#lbCat').textContent=cat;const L=$('#lbLink'),pg=CPG[img.replace(/\d+$/,'')];if(pg){L.href=pg[1];L.dataset.pg=pg[0];L.removeAttribute('target')}else{L.href=U+url;delete L.dataset.pg;L.target='_blank'}lb.classList.add('open');setTimeout(()=>$('#lbClose').focus(),200)}
$('#lbClose').addEventListener('click',()=>lb.classList.remove('open'));
lb.addEventListener('click',e=>{if(e.target===lb)lb.classList.remove('open')});
addEventListener('keydown',e=>{if(e.key==='Escape'){lb.classList.remove('open');mf.classList.remove('open');sheet.classList.remove('open')}});
/* ---------------- cases cloud (Three.js) ---------------- */
const ccImg=$('#ccImg'),ccTitle=$('#ccTitle'),ccCat=$('#ccCat'),ccIdx=$('#ccIdx'),cdots=$('#cdots');
CASES.forEach(()=>cdots.appendChild(document.createElement('i')));
let focus=-1;
function setFocus(i){if(i===focus)return;focus=i;const c=CASES[i];ccImg.style.opacity=0;setTimeout(()=>{ccImg.src='/img/case-'+c[0]+'.webp';ccImg.style.opacity=1},180);ccTitle.textContent=c[1];ccCat.textContent=c[2];ccIdx.textContent=String(i+1).padStart(2,'0')+' / '+String(CASES.length).padStart(2,'0');$$('i',cdots).forEach((d,k)=>d.classList.toggle('on',k===i))}
setFocus(0);
$('#ccOpen').addEventListener('click',()=>{const c=CASES[focus];openCase(c[0],c[1],c[2],c[3])});
(function cloud(){
const sec=$('#cases'),stick=$('#cloudStick'),cv=$('#cloud'),cprog=$('#cprog');
const scroll=()=>{const r=sec.getBoundingClientRect();return clamp(-r.top/Math.max(1,sec.offsetHeight-innerHeight),0,1)};
if(!HAS3){onTick(()=>setFocus(Math.round(scroll()*(CASES.length-1))));return}
let renderer;try{renderer=new THREE.WebGLRenderer({canvas:cv,antialias:true,alpha:true,premultipliedAlpha:false,powerPreference:'high-performance'})}catch(e){onTick(()=>setFocus(Math.round(scroll()*(CASES.length-1))));return}
renderer.setPixelRatio(Math.min(devicePixelRatio||1,1.75));renderer.setClearColor(0x000000,0);
const scene=new THREE.Scene(),cam=new THREE.PerspectiveCamera(48,1,.1,120);
const loader=new THREE.TextureLoader();const texCache={};const tex=s=>texCache[s]||(texCache[s]=loader.load(s,t=>{t.minFilter=THREE.LinearFilter;t.generateMipmaps=false}));
const geo=new THREE.PlaneGeometry(1,1);
const vsh='varying vec2 vUv;varying float vD;void main(){vUv=uv;vec4 mv=modelViewMatrix*vec4(position,1.);vD=-mv.z;gl_Position=projectionMatrix*mv;}';
const fsh=`uniform sampler2D uTex;uniform float uAsp,uR,uDim,uMode,uLA;uniform vec3 uCol;uniform vec2 uFog;varying vec2 vUv;varying float vD;
float sdr(vec2 p,vec2 b,float r){vec2 q=abs(p)-b+r;return length(max(q,0.))+min(max(q.x,q.y),0.)-r;}
void main(){vec2 p=(vUv-.5)*vec2(uAsp,1.);float d=sdr(p,vec2(uAsp,1.)*.5,uR);float a=1.-smoothstep(-.004,.004,d);if(a<.02)discard;vec3 c;
if(uMode<.5){c=texture2D(uTex,vUv).rgb;}
else if(uMode<1.5){vec2 l=(vUv-.5)*vec2(1.25,1.25*uLA)+.5;float inb=step(0.,l.x)*step(l.x,1.)*step(0.,l.y)*step(l.y,1.);vec4 t=texture2D(uTex,clamp(l,0.,1.));c=mix(vec3(1.),t.rgb,t.a*inb);}
else{vec4 t=texture2D(uTex,vUv);c=mix(uCol,t.rgb,t.a);}
vec3 bg=vec3(.945,.949,.925);c=mix(bg,c,uDim);float f=smoothstep(uFog.x,uFog.y,vD);gl_FragColor=vec4(c,a*(1.-f));}`;
const mk=(t,mode,asp,col,la)=>new THREE.ShaderMaterial({uniforms:{uTex:{value:t},uAsp:{value:asp},uR:{value:.075},uDim:{value:1},uMode:{value:mode},uLA:{value:la||1},uCol:{value:new THREE.Color(col||'#D7FF0F')},uFog:{value:new THREE.Vector2(14,46)}},vertexShader:vsh,fragmentShader:fsh,transparent:true});
// lime dot-pattern texture (brand tile)
const dc=document.createElement('canvas');dc.width=dc.height=256;const dx=dc.getContext('2d');dx.fillStyle='#0c0d0b';[[80,96,14],[128,84,22],[184,92,30],[70,150,18],[130,148,28],[192,160,22],[104,200,12],[158,206,16],[210,214,10]].forEach(([x,y,r])=>{dx.beginPath();dx.arc(x,y,r,0,7);dx.fill()});
const dotTex=new THREE.CanvasTexture(dc);
const N=CASES.length,DZ=9,H=3.3,ASP=504/696;
const mains=[],decos=[];let seed=7;const rnd=()=>((seed=(seed*16807)%2147483647)/2147483647);
CASES.forEach((c,i)=>{const m=new THREE.Mesh(geo,mk(tex('/img/case-'+c[0]+'.webp'),0,ASP));m.scale.set(H*ASP,H,1);const side=i%2?1:-1;m.userData={i,side,bx:side*(1.5+rnd()*.7),by:(rnd()-.5)*1.1,k:0};m.position.set(m.userData.bx,m.userData.by,-i*DZ);scene.add(m);mains.push(m)});
const pool=[...CASES.map(c=>['c','/img/case-'+c[0]+'.webp']),...['harley','byd','runsolar','oiti','platinum','barbahall'].map(s=>['c','/img/case-'+s+'.webp']),...CLIENTS.map(c=>['l','/img/cli-'+c+'.webp'])];
const span=N*DZ+16;
for(let i=0;i<140;i++){const it=pool[i%pool.length];let m,s;
if(it[0]==='c'){m=new THREE.Mesh(geo,mk(tex(it[1]),0,ASP));s=.9+rnd()*1.1;m.scale.set(s*ASP,s,1)}
else if(it[0]==='l'){m=new THREE.Mesh(geo,mk(tex(it[1]),1,1,null,320/220));s=.7+rnd()*.6;m.scale.set(s,s,1);m.material.uniforms.uR.value=.16}
else{m=new THREE.Mesh(geo,mk(dotTex,2,1,'#D7FF0F'));s=.9+rnd()*.9;m.scale.set(s,s,1);m.material.uniforms.uR.value=.1}
const ang=rnd()*Math.PI*2,rad=3.6+rnd()*6;m.userData={bx:Math.cos(ang)*rad*1.35,by:Math.sin(ang)*rad*.75,ph:rnd()*6,sp:.2+rnd()*.4,ry:(rnd()-.5)*.8};
if(it[0]==='c')m.userData.cs=s;m.position.set(m.userData.bx,m.userData.by,8-rnd()*span);m.rotation.y=m.userData.ry;scene.add(m);decos.push(m)}
let W=1,Hh=1,camX=0,camY=0,camZ=7,narrow=false;
const fit=()=>{const r=stick.getBoundingClientRect();W=r.width;Hh=r.height;renderer.setSize(W,Hh,false);cam.aspect=W/Hh;narrow=cam.aspect<.9;cam.fov=narrow?62:48;cam.updateProjectionMatrix()};
new ResizeObserver(fit).observe(stick);fit();
const seen=watch(stick);const ray=new THREE.Raycaster(),v2=new THREE.Vector2();
const pick=e=>{const r=cv.getBoundingClientRect();v2.set((e.clientX-r.left)/r.width*2-1,-(e.clientY-r.top)/r.height*2+1);ray.setFromCamera(v2,cam);const h=ray.intersectObjects(mains)[0];return h?h.object:null};
let down=null;
stick.addEventListener('pointerdown',e=>{down=[e.clientX,e.clientY]});
stick.addEventListener('pointerup',e=>{if(!down||e.target.closest('.cloud-card'))return;if(Math.hypot(e.clientX-down[0],e.clientY-down[1])>8)return;const m=pick(e);if(m){const c=CASES[m.userData.i];openCase(c[0],c[1],c[2],c[3])}});
stick.addEventListener('pointermove',e=>{if(e.pointerType!=='mouse')return;cv.style.cursor=pick(e)?'pointer':'default'});
let pS=0;
onTick((dt,t)=>{if(!seen())return;const p=scroll();pS=lerp(pS,p,RM?1:.07);cprog.style.setProperty('--cp',p.toFixed(4));const fi=pS*(N-1);const f=clamp(Math.round(fi),0,N-1);setFocus(f);
const spread=narrow?.45:1;
mains.forEach(m=>{const u=m.userData;const k=Math.max(0,1-Math.abs(u.i-fi));u.k=lerp(u.k,k,.12);m.position.x=u.bx*spread*(1-u.k*.35);m.position.y=u.by+(RM?0:Math.sin(t*.6+u.i)*.08);
m.rotation.y=lerp(-u.side*.42,0,u.k);m.rotation.z=lerp(u.side*.04,0,u.k);const s=1+u.k*.18;const im=m.material.uniforms.uTex.value.image;if(!u.asp&&im&&im.width){u.asp=im.width/im.height;m.material.uniforms.uAsp.value=u.asp}const A=u.asp||ASP,hh=A>1?H/A*1.25:H;m.scale.set(hh*A*s,hh*s,1);m.material.uniforms.uDim.value=.62+.38*u.k});
decos.forEach(m=>{const u=m.userData;if(u.cs&&!u.asp){const im=m.material.uniforms.uTex.value.image;if(im&&im.width){u.asp=im.width/im.height;m.material.uniforms.uAsp.value=u.asp;const hh=u.asp>1?u.cs/u.asp*1.2:u.cs;m.scale.set(hh*u.asp,hh,1)}}m.position.x=u.bx*(narrow?.7:1)+(RM?0:Math.sin(t*u.sp+u.ph)*.3);m.position.y=u.by+(RM?0:Math.cos(t*u.sp*.8+u.ph)*.25);m.rotation.y=u.ry+(RM?0:Math.sin(t*.3+u.ph)*.15);m.material.uniforms.uDim.value=.9});
const tz=7-fi*DZ+ .2, a=mains[f].userData;
camZ=tz;camX=lerp(camX,mains[f].position.x*.55+mouse.nx*.7,.06);camY=lerp(camY,a.by*.5-mouse.ny*.45,.06);
cam.position.set(camX,camY,camZ);mains.forEach(m=>{const dz=camZ-m.position.z;m.visible=dz>2.6;m.material.uniforms.uDim.value*=clamp((dz-2.6)/2.5,0,1)});decos.forEach(m=>{m.visible=camZ-m.position.z>1.2});cam.lookAt(camX*.4,camY*.4,camZ-12);
renderer.render(scene,cam)});
})();
const pars=$$('.par');
/* ---------------- services checkerboard ---------------- */
(function(){const SV=[
['Experiência sênior','c-wheaton2','Time 100% sênior, de negócios locais a marcas globais.'],
['Multiplataformas','c-beflex','Marketing Omnichannel.'],
['Ideias e narrativas','c-jah1','Criamos storytelling que converte.'],
['Otimização de recursos','c-jasolar1','Estratégias que fazem o budget dar resultado.']];
const A=$('#svcA'),B=$('#svcB'),idx=$('#svcIndex'),sec=$('#servicos');const labels=[],imgs=[];
const lb=(s,i)=>{const d=document.createElement('div');d.className='cell lbl';d.innerHTML=`
`;imgs.push(d);return d};
const sp=()=>{const d=document.createElement('div');d.className='cell sp';return d};
B.appendChild(sp());
SV.forEach((s,i)=>{const col=i%2?B:A;col.appendChild(lb(s,i));col.appendChild(im(s,i));const li=document.createElement('li');li.textContent=String(i+1).padStart(2,'0');li.title=s[0];li.addEventListener('click',()=>labels[i].scrollIntoView({behavior:'smooth',block:'center'}));idx.appendChild(li)});
A.appendChild(sp());
const lis=$$('li',idx);
const iio=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');iio.unobserve(e.target)}}),{threshold:.2});
if(RM)imgs.forEach(c=>c.classList.add('in'));else{imgs.forEach(c=>{if(c.getBoundingClientRect().top
':TRIO[x[3]]?'
`).join('')+'
`}
`;f.appendChild(d);return {d,p,ph:Math.random()*6,dp:.5+Math.random()*.8,vx:0,vy:0,ox:0,oy:0,k:0}});
let W=1,H=1,base=60;const fit=()=>{W=f.clientWidth;H=f.clientHeight;base=Math.max(52,Math.min(W*.06,94));A.forEach(o=>{if(W<640){o.p2=[(o.p[0]-.45)/.55*.9+.05,o.p[1]*.55]}else o.p2=[.72+(o.p[0]-.72)*.72,.5+(o.p[1]-.5)*.74];o.s=base*o.p[2];o.d.style.setProperty('--s',o.s+'px')})};new ResizeObserver(fit).observe(f);fit();
const seen=watch(sec);
onTick((dt,t)=>{if(!seen())return;const r=sec.getBoundingClientRect();const sp=(innerHeight/2-(r.top+r.height/2))/innerHeight;const mx=mouse.x-r.left,my=mouse.y-r.top;
A.forEach((o,i)=>{const enter=RM?1:clamp((innerHeight-r.top-i*18)/(innerHeight*.5),0,1);o.k=enter;
const bx=o.p2[0]*W,by=o.p2[1]*H+sp*40*o.dp;const fx=RM?0:Math.sin(t*.6+o.ph)*8,fy=RM?0:Math.cos(t*.5+o.ph)*10;
const dx=bx-mx,dy=by-my,dd=Math.hypot(dx,dy)||1,R=140;let px=0,py=0;if(dd
`;box.appendChild(d);
d.addEventListener('click',()=>{if(drag&&drag.moved)return;if(Math.round(pos)===i)openCase(s[0],s[1],'Sites e Apps',s[2]);else go(i)});return d});
const dots=SITES.map((s,i)=>{const b=document.createElement('button');b.setAttribute('role','tab');b.setAttribute('aria-label',s[1]);b.addEventListener('click',()=>go(i));pill.appendChild(b);return b});
function go(i){const range=sec.offsetHeight-innerHeight;scrollTo({top:sec.offsetTop+range*(i/(N-1)),behavior:RM?'auto':'smooth'})}
let shown=-1;const title=i=>{if(i===shown)return;shown=i;tt.textContent=SITES[i][1];tc.textContent='Sites e Apps · '+String(i+1).padStart(2,'0')+'/'+N;dots.forEach((d,k)=>d.setAttribute('aria-selected',k===i));tt.animate([{opacity:0,transform:'translateY(8px)'},{opacity:1,transform:'none'}],{duration:400})};
box.addEventListener('pointerdown',e=>{drag={x:e.clientX,moved:false}});
addEventListener('pointermove',e=>{if(!drag)return;const dx=e.clientX-drag.x;if(Math.abs(dx)>6)drag.moved=true;dragOff=-dx/(items[0].offsetWidth*.8)});
addEventListener('pointerup',()=>{if(!drag)return;const t=clamp(Math.round(pos+dragOff),0,N-1);dragOff=0;if(drag.moved)go(t);setTimeout(()=>drag=null,0)});
box.addEventListener('keydown',e=>{const c=Math.round(pos);if(e.key==='ArrowLeft'){e.preventDefault();go(Math.max(0,c-1))}if(e.key==='ArrowRight'){e.preventDefault();go(Math.min(N-1,c+1))}if(e.key==='Enter'){const s=SITES[c];openCase(s[0],s[1],'Sites e Apps',s[2])}});
const seen=watch(sec);let first=true;
onTick(()=>{if(!seen()&&!first)return;first=false;const r=sec.getBoundingClientRect();const p=clamp(-r.top/Math.max(1,sec.offsetHeight-innerHeight),0,1);const target=clamp(p*(N-1)+dragOff,0,N-1);pos=lerp(pos,target,RM?1:.14);
title(Math.round(pos));const w=items[0].offsetWidth;
items.forEach((el,i)=>{const d=i-pos,ad=Math.abs(d);const x=Math.sign(d)*Math.min(ad,1)*w*.86+Math.sign(d)*Math.max(0,ad-1)*w*.3;const sc=1-Math.min(ad,1)*.34-Math.max(0,ad-1)*.1;const ry=-clamp(d,-1.6,1.6)*26;const z=-Math.min(ad,2)*120;
el.style.transform=`translate(-50%,-50%) translate3d(${x}px,0,${z}px) rotateY(${ry}deg) scale(${sc})`;el.style.zIndex=100-Math.round(ad*10);el.style.opacity=ad>1.6?0:ad>1?1-(ad-1)/.6:1;el.style.filter=`brightness(${1-Math.min(ad,1)*.1})`;el.style.visibility=ad>1.6?'hidden':'visible'})});
})();
/* ---------------- liquid glass sphere ---------------- */
(function(){const wrap=$('#globeWrap'),cv=$('#globe');if(!HAS3)return;
let renderer;try{renderer=new THREE.WebGLRenderer({canvas:cv,antialias:true,alpha:true})}catch(e){return}
renderer.setPixelRatio(Math.min(devicePixelRatio||1,2));renderer.setClearColor(0x000000,0);
const scene=new THREE.Scene(),cam=new THREE.PerspectiveCamera(32,1,.1,100);cam.position.set(0,0,10);
const g=new THREE.Group();scene.add(g);const Rg=2.05;
const U={uT:{value:0},uM:{value:new THREE.Vector2()}};
const vs=`varying vec3 vN;varying vec3 vV;varying vec3 vP;void main(){vec4 wp=modelMatrix*vec4(position,1.);vP=position;vN=normalize(normalMatrix*normal);vec4 mv=viewMatrix*wp;vV=normalize(-mv.xyz);gl_Position=projectionMatrix*mv;}`;
const fs=`precision highp float;uniform float uT;uniform vec2 uM;varying vec3 vN;varying vec3 vV;varying vec3 vP;
float h(vec3 p){return fract(sin(dot(p,vec3(127.1,311.7,74.7)))*43758.5453);}
float n3(vec3 p){vec3 i=floor(p),f=fract(p);f=f*f*(3.-2.*f);return mix(mix(mix(h(i),h(i+vec3(1,0,0)),f.x),mix(h(i+vec3(0,1,0)),h(i+vec3(1,1,0)),f.x),f.y),mix(mix(h(i+vec3(0,0,1)),h(i+vec3(1,0,1)),f.x),mix(h(i+vec3(0,1,1)),h(i+vec3(1,1,1)),f.x),f.y),f.z);}
float fbm(vec3 p){float a=.5,s=0.;for(int i=0;i<4;i++){s+=a*n3(p);p*=2.02;a*=.5;}return s;}
void main(){vec3 N=normalize(vN),V=normalize(vV);float fr=1.-max(dot(N,V),0.);
vec3 q=vP*.55+vec3(0.,uT*.06,uT*.04);vec3 w=vec3(fbm(q),fbm(q+4.7),fbm(q+9.1));float f=fbm(q+w*1.6+vec3(uM*.3,0.));
vec3 pink=vec3(.97,.70,.86),lav=vec3(.72,.70,.97),sky=vec3(.70,.86,.99),butter=vec3(1.,.96,.74),mint=vec3(.74,.96,.92),white=vec3(1.);
vec2 sp=N.xy;
vec3 c=mix(lav,sky,smoothstep(-.2,.7,sp.y-sp.x*.3+(f-.5)*.6));
c=mix(c,pink,smoothstep(.55,.0,length(sp-vec2(-.05,-.2))-(f-.5)*.35)*.9);
c=mix(c,butter,smoothstep(.5,.0,length(sp-vec2(.15,.15))-(w.x-.5)*.3)*.85);
c=mix(c,mint,smoothstep(.25,.0,length(sp-vec2(.45,.05))-(w.y-.5)*.3)*.5);
c=mix(c,white,.5+smoothstep(.4,.85,fbm(q*.9+w))*.25);
/* clean curved stripes on two sides */
float st=sin((dot(sp,normalize(vec2(.8,-.6)))*1.2+length(sp)*.9+(fbm(vP*.6+uT*.03)-.5)*.25)*190.);
float lines=smoothstep(.0,.9,st*.5+.5);
float mA=smoothstep(.45,.85,length(sp))*smoothstep(.1,-.5,sp.x+sp.y);
float mB=smoothstep(.55,.9,length(sp))*smoothstep(.3,.9,sp.x+sp.y*.6)*smoothstep(-.3,.4,sp.y);
c=mix(c,c*vec3(.9,.91,.99),lines*(mA+mB)*.22);
vec3 spec=.5+.5*cos(6.2831*(fr*1.2+vec3(0.,.33,.67))+uT*.15);
c=mix(c,mix(white,spec,.15),smoothstep(.75,1.,fr)*.6);
vec3 L=normalize(vec3(-.4,.6,.7));float hl=pow(max(dot(reflect(-L,N),V),0.),8.);c=mix(c,white,hl*.25);
float a=.52-smoothstep(.9,1.,fr)*.1;gl_FragColor=vec4(c,a);}`;
const sph=new THREE.Mesh(new THREE.SphereGeometry(Rg,128,128),new THREE.ShaderMaterial({uniforms:U,vertexShader:vs,fragmentShader:fs,transparent:true}));g.add(sph);
/* thin outer halo */
const halo=new THREE.Mesh(new THREE.SphereGeometry(Rg*1.08,96,96),new THREE.ShaderMaterial({transparent:true,depthWrite:false,side:THREE.BackSide,vertexShader:vs,fragmentShader:`varying vec3 vN;varying vec3 vV;void main(){float fr=1.-abs(dot(normalize(vN),normalize(vV)));gl_FragColor=vec4(1.,1.,1.,smoothstep(.0,.9,1.-fr)*pow(fr,1.5)*.55);}`}));g.add(halo);
const PINS=[[-23.55,-46.63,'Brasil',1],[38.9,-77.0,'EUA'],[43.73,7.42,'Mônaco'],[-33.87,151.2,'Austrália'],[52.52,13.4,'Alemanha'],[38.72,-9.14,'Portugal']];const pinsEl=document.createElement('div');wrap.appendChild(pinsEl);
const PV=[];PINS.forEach((p,i)=>{const el=document.createElement('div');el.className='pin'+(p[3]?' main':'');el.innerHTML=`![${d[1]}](/img/dep-${d[0]}.webp)

![${b[2]} | Blog da Nume, agência de marketing digital em São Paulo](/img/blog-${b[0]}.webp)