Nume Company, agenzia di marketing digitale a São Paulo. Da qui, noi avanziamo insieme.
Agenzia di marketing full service. Dalla strategia al risultato con il marketing a 360°, per brand nazionali e globali.
ParliamoneCasi studio
Anni di
esperienza
Presenza
globale
Premio
a Monaco
Team
senior
Cosa possiamo fare per la tua azienda?
Scorri per vedere gli 11 servizi di Nume.
Casi studio in evidenza.
Tocca un caso studio per vedere i dettagli
visite organiche al sito con la SEO, in 60 giorni
di retention sul sito in 1 anno



per il lavoro sui social media del brand
Nume Company: agenzia di marketing digitale a São Paulo
Nume Company è un'agenzia di marketing digitale full service con sede a Itaim Bibi, a São Paulo (SP). Da oltre 18 anni segue aziende, dalle attività locali ai brand globali, con più di 180 aziende seguite, un team 100% senior, valutazione 5,0 su 39 recensioni di clienti su Google e casi studio in Brasile, Stati Uniti, Portogallo, Germania, Australia e Monaco, tra cui un caso studio di social media premiato a Monaco per Wheaton. L'agenzia è stata fondata ed è guidata da Pedro Bruder, CEO, autore del libro Domine o Marketing 5.0, distribuito da Amazon, e relatore ospite ufficiale del Parco Tecnologico e del Comune.
Siamo un'agenzia di marketing per aziende orientate alla crescita: agenzia di social media, agenzia di paid media, agenzia SEO e GEO, branding e realizzazione di siti e app, con strategia ed esecuzione nello stesso team.
Servizi dell'agenzia di marketing
- Analisi di dati reali di mercato
- Segmentazione e buyer personas
- Strategia di marketing full service
- Gestione dei social media
- Gestione del paid media (Google Ads, Meta Ads, LinkedIn Ads)
- Branding per marchi e aziende
- Creazione di logo e identità visiva
- Design UX/UI e creazione di materiali
- Gestione del traffico organico SEO e GEO (ottimizzazione per Google, ChatGPT e Gemini)
- Generazione di domanda qualificata
- Email automation
- Creazione di contenuti rilevanti
- Realizzazione di siti e app ad alte prestazioni
- Gestione dell'influencer marketing per i brand
Casi studio con risultati
- Jardineira Grill (São Paulo): 12 mila visite organiche al sito in 60 giorni con la SEO, 4.609 indicazioni stradali richieste e 1.815 chiamate dal Profilo dell'attività su Google, e un Reel organico con oltre 600 mila visualizzazioni.
- Oliveira Trust: con Nume su Google Ads, in un anno, +90% di impression, costo per clic inferiore del 41%, investimento inferiore del 42,5% e tempo medio sul sito superiore del 472%.
- Wheaton: progetto di branding e social media premiato a Monaco.
- Wheaton: caso studio premiato a Monaco (Social media)
- Beflex: app e benefit in un'unica carta (Siti e app)
- Melten: Soft-Service Experience (Branding e social media)
- Água Dias D'Ávila: la linea completa (Branding e social media)
- JAH: essere felici è la regola (Branding e social media)
- Summit Cosmetics: innovazione a colori (Social media)
- JA Solar: presente come il sole (Social media)
- Serigy: energia alle stelle (Branding e social media)
- VaBene alla FIPAN 2026 (Social media)
- Lynx Biological: l'oro verde del Brasile (Social media)
- Fulya Guaraná (Branding e social media)
- Contenuti con Erick Jacquin (Studio Nume)
- Wheaton: persone che trasformano (Social media)
- JAH: l'açaí che fa regola (Branding e social media)
- Dias D'Ávila con le bollicine (Branding e social media)
- Summit Cosmetics: home off (Social media)
- VaBene: il dolce extra (Social media)
- Serigy: attivazione di brand (Branding e social media)
- JA Solar: lo stand in fiera (Social media)
- JAH: il ghiacciolo 0% lattosio (Branding e social media)
- Scopri il progetto creato con focus sull'usabilità per HD (Siti e app)
- Beflex: tutti i benefit in un'unica carta (Siti e app)
- Rinfrescati con il nuovo sito creato per Água Dias D'Ávila (Siti e app)
- Sito ad alte prestazioni creato per Prime Veículos (Siti e app)
- Amica Systems: precisione, velocità e tecnologia (Siti e app)
Testimonianze dei clienti
- Lorena Coltro, Responsabile Marketing di Yesbank: «Dopo quattro mesi di lavoro con Nume, in YESPAY abbiamo già fatto passi avanti su molti fronti. Grande dedizione e concentrazione nella realizzazione del progetto, e consegne sempre puntuali. Per quanto riguarda design ed estetica, siamo stati davvero sorpresi dal lavoro incredibile che hanno fatto! Non ho dubbi di aver fatto la scelta migliore tra tutte le agenzie di pubblicità che ho valutato: hanno davvero molto talento! Ringrazio tutti i coinvolti per l'affetto e l'attenzione!»
- Esmeralda Angelita, CEO di Costatt Clinic Australia: «Grazie per il buon lavoro che state facendo, siamo molto contenti: tante persone ci chiamano e ci cercano grazie agli advertising, ed è molto positivo, segno che sta funzionando bene, quindi voglio ringraziarvi. Ottimo!»
- Alexandre Fernandes, CEO di NX Capital: «Nume è stata la svolta dopo molti tentativi con altre agenzie. La competenza tecnica, l'esperienza e il know-how nel campo della pubblicità sono impressionanti e hanno alzato il livello di eccellenza per il nostro brand. Colpisce il loro modo di costruire la relazione, sempre vicino al cliente, chiarendo ogni dubbio e suggerendo idee mai immaginate prima per ottimizzare i nostri investimenti. Lo consiglio caldamente e sono convinto che Nume sia la migliore sul mercato.»
- Felipe Pregnolatto, Gamers Club: «Un'azienda specializzata in ciò che propone, con una competenza unica e attenta all'eccellenza del servizio: capisce che il cliente è al centro del business e lo valorizza.»
- Roberta Furniel, Direttrice Marketing di Fidati e Beflex: «Nume è più di un'agenzia: è una partner di business per Fidati. Oltre al nostro rebranding, ha contribuito alla strategia e all'esecuzione del piano di marketing a 360°, coprendo i pilastri principali, sempre disponibile a fare di più e proattiva nel proporre novità!»
- Talita Aurani, Futuro House: «Un servizio estremamente efficiente, propositivo e umano, attento a ogni dettaglio e a ogni esigenza che abbiamo segnalato per il nostro progetto.»
Blog di Nume
- Come posizionare il tuo sito nelle ricerche «vicino a me» a São Paulo e attirare clienti ogni giorno
- Le migliori strategie di marketing digitale per le piccole imprese che funzionano davvero
- Quanto costa affidarsi a un'agenzia di marketing a São Paulo, SP?
- Marketing medico: la guida definitiva per attirare più pazienti in modo etico ed efficiente
- SEO locale: come far apparire la tua azienda a chi ti è vicino
- Marketing digitale B2B: come vendere ad altre aziende senza complicarsi la vita
- Agenzia di paid media: il segreto per attirare più clienti e vendere di più
- Agenzia di marketing digitale full service: la soluzione completa di cui la tua azienda ha bisogno
- Le 50 maggiori agenzie di marketing del mondo: i giganti della pubblicità
- I giganti della creatività: chi comanda nelle maggiori agenzie di pubblicità del Brasile?
- Le migliori agenzie di marketing digitale a São Paulo: guida completa per scegliere
- Le migliori agenzie di marketing digitale del Brasile
39 recensioni di clienti su Google
Valutazione massima nelle recensioni.
Scorri per accendere · clicca per festeggiare
Sì, il tuo brand può essere un punto di riferimento sul mercato.

Wheaton: caso studio premiato a Monaco
Specialità della casa
Idee e narrazioni
Creiamo storytelling che converte.
Ottimizzazione delle risorse
Strategie che fanno rendere il budget.
Ricevi una consulenza gratuita per il tuo brand o la tua azienda.
Prenota oraI nostri clienti ci raccomandano in tutto il mondo.
Team senior, con più di 18 anni di esperienza in business locali, nazionali e globali.
SpecialistiMultipiattaforma
Marketing omnichannel.
Realizzazione di siti e app ad alte prestazioni.
Come scegliere l'agenzia giusta?
Scegli chi ha qualcosa da mostrare
Un buon portfolio mostra, nei fatti, ciò che l'agenzia realizza.
L'anzianità di mercato conta
L'esperienza separa gli improvvisatori dai professionisti.
Strategia ed esecuzione, insieme.
Team 100% senior, marketing a 360° e specialisti delle principali piattaforme.
Consulenza gratuitaTeam 100%
senior
Manager ad alte prestazioni alla guida di ogni account, dalle attività locali ai brand globali.
Parla con uno specialistaGestione dell'influencer marketing per i brand.
Oltre +200 influencer registrati nella nostra base.
Chi ci conosce ama il nostro lavoro, ci raccomanda e si fida.
Blog di Nume
Hai ancora qualche dubbio?
Perché affidarsi a un'agenzia di marketing digitale?+
Una vera agenzia di marketing digitale capisce il potenziale del cliente e definisce strategie efficaci in base all'obiettivo del brand in una specifica fase del suo percorso: brand awareness, acquisizione di lead o conversione.
Quanto costa affidarsi a un'agenzia di marketing digitale?+
Il valore del lavoro di un'agenzia va misurato a progetto o con un fee mensile. La variazione dipende dagli obiettivi e dai professionisti necessari. Ad esempio: ci sarà produzione video, gestione dei social media, marketing automation, SEO? Con quale livello di copertura? Tutto dipende dalla «dimensione» dell'obiettivo.
Come scegliere un'agenzia di marketing digitale?+
Prima di tutto bisogna definire l'obiettivo della tua azienda. Vuoi più clienti, aumentare lo scontrino medio, far crescere la notorietà del brand? Chiarito questo punto, bisogna cercare agenzie che conoscano il marketing digitale nel suo insieme, ma che dichiarino con chiarezza le proprie specializzazioni: chi dice di essere bravo in tutto raramente farà un lavoro perfetto. Chiedi almeno tre proposte diverse e scegli quella che ha più senso rispetto all'obiettivo del brand e al budget.
Tutte le agenzie di marketing digitale sono uguali?+
Assolutamente no: ogni agenzia ha la sua specializzazione e il suo livello di esperienza.
Affidarsi a un'agenzia di marketing digitale o internalizzare?+
Internalizzare l'intero processo di marketing è come farsi da soli le scarpe: si riesce anche a uscire di casa, ma probabilmente non si andrà lontano prima del primo buco. I dettagli e l'esperienza nella gestione del marketing garantiscono solidità e costanza alle strategie. Tuttavia, avere un professionista interno che faccia da tramite con l'agenzia è importante per mantenere la comunicazione fluida.
Il nostro ufficio a Itaim Bibi
Uno spazio pensato per accogliere i clienti, creare e pianificare insieme, a San Paolo.








`;
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=[
['Esperienza senior','c-wheaton2','Team 100% senior, dalle attività locali ai brand globali.'],
['Multiplataformas','c-beflex','Marketing Omnichannel.'],
['Idee e narrazioni','c-jah1','Creiamo storytelling che converte.'],
['Ottimizzazione delle risorse','c-jasolar1','Strategie che fanno rendere il budget.']];
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],'Siti e app',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='Siti e app · '+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],'Siti e app',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)