Nume Company, agência de marketing digital em São Paulo. A partir daqui, avançamos juntos.
Agência de marketing de serviço completo. Da estratégia ao resultado com marketing 360, para marcas nacionais e globais.
Falar connoscoCasos nacionais
Anos de
experiência
Presença
global
Prémio
no Mónaco
Equipa
sénior
O que podemos fazer pela sua empresa?
Deslize para ver os 11 serviços da Nume.
Casos de sucesso em destaque.
Toque num caso para ver os detalhes
acessos orgânicos ao site com SEO, em 60 dias
de retenção no site em 1 ano



pelo trabalho de redes sociais da marca
Nume Company: agência de marketing digital em São Paulo
A Nume Company é uma agência de marketing digital de serviço completo, com escritório no Itaim Bibi, em São Paulo (SP). Há mais de 18 anos que acompanha empresas, desde negócios locais a marcas globais, com mais de 180 empresas acompanhadas, equipa 100% sénior, classificação de 5,0 em 39 avaliações de clientes no Google e casos de sucesso no Brasil, Estados Unidos, Portugal, Alemanha, Austrália e Mónaco, incluindo um caso de redes sociais premiado no 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 orador convidado oficial do Parque Tecnológico e da Câmara Municipal.
Somos uma agência de marketing para empresas que procuram crescer: 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 na mesma equipa.
Serviços da agência de marketing
- Análise de dados reais do mercado
- Segmentação e personas
- Estratégia de marketing de serviço completo
- 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 logótipo 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 procura qualificada
- Automação de e-mail
- Criação de conteúdo relevante
- Criação de sites e apps de alta performance
- Gestão de marketing de influência para marcas
Casos com resultados
- Jardineira Grill (São Paulo): 12 mil visitas orgânicas ao site em 60 dias com SEO, 4.609 itinerários pedidos e 1.815 chamadas através do Perfil da Empresa no Google, e reels orgânico com mais de 600 mil visualizações.
- Oliveira Trust: com a Nume em Google Ads, num ano, +90% de impressões, custo por clique 41% inferior, investimento 42,5% inferior e tempo médio no site 472% superior.
- Wheaton: projeto de branding e redes sociais premiado no Mónaco.
- Wheaton: caso de sucesso premiado no Mónaco (Redes Sociais)
- Beflex: app e benefícios num único cartão (Sites e Apps)
- Melten: Soft-Service Experience (Branding e Social Media)
- Água Dias D'Ávila: gama 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 como o sol (Social Media)
- Serigy: energia em alta (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 office (Social Media)
- VaBene: sobremesa extra (Social Media)
- Serigy: ativação de marca (Branding e Social Media)
- JA Solar: stand em feira (Social Media)
- JAH: gelado 0% lactose (Branding e Social Media)
- Conheça o projeto criado com foco na usabilidade para a HD (Sites e Apps)
- Beflex: todos os benefícios num único cartão (Sites e Apps)
- Refresque-se neste 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)
Testemunhos de clientes
- Lorena Coltro, Coordenadora de Marketing Yesbank: “Há quatro meses a trabalhar com a Nume, já avançámos 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. Em termos de design e estética, fomos muito surpreendidos com o trabalho incrível que fizeram! Não tenho dúvidas de que fiz a melhor escolha entre todas as empresas de publicidade que pesquisei, eles têm realmente muito talento! Agradeço todo o carinho e atenção dos envolvidos!”
- Esmeralda Angelita, CEO Costatt Clinic Austrália: “Obrigada por estarem a fazer um bom trabalho, estamos muito felizes, há muita gente a ligar-nos e a procurar-nos através dos advertising, o que é muito positivo, sinal de que está a funcionar bem, por isso quero agradecer. Muito bom!”
- Alexandre Fernandes, CEO da NX Capital: “A Nume foi o nosso ponto de viragem depois de muitas tentativas com outras agências. O conhecimento técnico, a expertise e o know-how na área da publicidade são impressionantes e elevaram o nível de excelência da nossa marca. Destaca-se o seu modelo de relacionamento, sempre muito próximo do cliente, esclarecendo todas as dúvidas e sugerindo ideias nunca antes imaginadas, de forma a otimizar os nossos investimentos. Recomendo vivamente e tenho a convicção de que a Nume é a melhor a atuar no mercado.”
- Felipe Pregnolatto, Gamers Club: “Uma empresa especializada naquilo a que se propõe, com um conhecimento ímpar e preocupada com a excelência no atendimento, que entende que o cliente é o centro do negócio e o valoriza.”
- Roberta Furniel, Diretora de Marketing Fidati e Beflex: “A Nume é mais do que uma agência, é uma parceira de negócios da Fidati. Contribuiu, além do nosso rebranding, para a nossa estratégia e execução do plano 360º de marketing, abrangendo os principais pilares, sempre disponível para ir além, a par da proatividade em propor novidades!”
- Talita Aurani, Futuro House: “Atendimento extremamente eficiente, proativo e humanizado, atento a cada detalhe e necessidade que sinalizámos para o nosso projeto.”
Blog da Nume
- Como Posicionar o Seu Site nas Pesquisas 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 a Sua Empresa Aparecer a Quem Está Perto de Si
- Marketing Digital B2B: Como Vender a Outras Empresas Sem Complicações
- Agência de Tráfego Pago: o Segredo para Atrair Mais Clientes e Vender Mais
- Agência de Marketing Digital de Serviço Completo: a Solução Completa de que a Sua Empresa Precisa
- As 50 Maiores Agências de Marketing do Mundo: Conheça os Gigantes da Publicidade
- Os 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 para Escolher
- As Melhores Agências de Marketing Digital do Brasil
39 avaliações de clientes no Google
Classificação máxima nas avaliações.
Deslize para acender · clique para celebrar
Sim, a sua marca pode ser referência no mercado.

Wheaton: caso de sucesso premiado no Mónaco
Especialidades da casa
Ideias e narrativas
Criamos storytelling que converte.
Otimização de recursos
Estratégias que fazem o orçamento dar resultado.
Receba uma consultoria gratuita para a sua marca ou empresa.
Marcar agoraOs nossos clientes recomendam-nos pelo mundo fora.
Equipa sénior, com mais de 18 anos de experiência em negócios locais, nacionais e globais.
EspecialistasMultiplataforma
Marketing omnicanal.
Criação de sites e APPs de alta performance.
Como acertar na escolha da agência?
Procure quem tem o que mostrar
Um bom portefólio mostra, na prática, o que a agência entrega.
O tempo de mercado conta
A experiência separa os aventureiros dos profissionais.
Estratégia e execução, em conjunto.
Equipa 100% sénior, marketing 360 e especialistas nas maiores plataformas.
Consultoria gratuitaEquipa 100%
sénior
Gestores de alta performance a conduzir 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 registados na nossa base.
Quem conhece, adora o nosso trabalho, recomenda e confia.
Blog da Nume
Ficou com alguma dúvida?
Porquê contratar uma agência de marketing digital?+
Uma agência de marketing digital a sério percebe o potencial do cliente e traça estratégias eficazes, em função do objetivo da marca num determinado momento do seu percurso: brand, captação de leads ou conversão.
Quanto custa 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 resulta dos objetivos e da necessidade de determinados profissionais. Por exemplo, haverá produção de vídeo, gestão de redes sociais, automação de marketing, SEO? Com que nível de abrangência? Tudo depende da "dimensão" do objetivo.
Como escolher uma agência de marketing digital?+
Em primeiro lugar, é preciso definir o objetivo da sua empresa. Pretende mais clientes, aumentar o ticket médio, aumentar o reconhecimento da marca? Definida esta questão, é necessário procurar agências que compreendam o universo do marketing digital como um todo, mas que deixem claras as suas especialidades. Quem se diz bom em tudo dificilmente fará o seu trabalho na perfeição. Procure pelo menos três opiniões diferentes e escolha a que fizer mais sentido face ao objetivo da marca e ao orçamento.
Todas as agências de marketing digital são iguais?+
De forma alguma: cada agência tem a sua especialidade e o seu nível de experiência.
Contratar uma agência de marketing digital ou internalizar?+
Internalizar todo o processo de marketing é como fabricar os próprios sapatos: até se sai de casa, mas provavelmente não se vai longe até ao primeiro furo. Os detalhes e a experiência na gestão do marketing dão solidez e constância às estratégias. No entanto, ter um profissional interno que faça a ponte com a agência é importante para que a comunicação seja fluida.
O nosso escritório no Itaim Bibi
Um espaço pensado para receber clientes, criar e planear em conjunto, em São Paulo.








`;
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])});
const __cloud=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','Equipa 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 orçamento 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('')+'
`}
`;g.appendChild(d)}return g};f.className='tm3';const t=document.createElement('div');t.className='tm3-track';t.appendChild(mk());t.appendChild(mk());f.appendChild(t)})();
/* ---------------- count up ---------------- */
const cio=new IntersectionObserver(es=>es.forEach(e=>{if(!e.isIntersecting||RM)return;cio.unobserve(e.target);const el=e.target,to=+el.dataset.count,pre=el.dataset.prefix||'',suf=el.dataset.suffix||'';const t0=performance.now();
(function f(n){const k=clamp((n-t0)/1600,0,1),v=Math.round(to*(1-Math.pow(1-k,4)));el.textContent=pre+v+suf;if(k<1)requestAnimationFrame(f)})(t0)}),{threshold:.6});
$$('[data-count]').forEach(e=>cio.observe(e));
/* ---------------- sites & apps 3-card scroll ---------------- */
(function(){const box=$('#cf'),sec=$('#sites'),tt=$('#cfTitle'),tc=$('#cfCat'),pill=$('#cfPill');const N=SITES.length;let pos=0,drag=null,dragOff=0;
const items=SITES.map((s,i)=>{const d=document.createElement('div');d.className='cf-item';d.innerHTML=`
`;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 ---------------- */
const __globe=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)