Nume Company,圣保罗数字营销公司。 从这里开始, 我们携手 前行。
一站式营销公司。以360度营销,从策略到成果,服务国内外品牌。
立即咨询国内外
年
从业经验
全球
布局
摩纳哥
获奖
资深
团队
精选案例。
点击案例查看详情
次SEO自然访问,60天内
网站留存提升,1年内



表彰品牌的社交媒体运营成果
Nume Company:圣保罗数字营销公司
Nume Company 是一家一站式数字营销公司,办公室位于圣保罗(SP)的 Itaim Bibi。18年以上来,我们服务从本地企业到全球品牌的各类客户,累计服务180多家企业,团队100%资深,在谷歌上获得39条客户评价、评分5.0,案例遍布巴西、美国、葡萄牙、德国、澳大利亚和摩纳哥,其中包括为 Wheaton 打造的摩纳哥获奖社交媒体案例。公司由 Pedro Bruder 创立并领导,他是 CEO、《Domine o Marketing 5.0》一书作者(亚马逊发行),并受科技园区和市政府官方邀请担任演讲嘉宾。
我们是面向追求增长的企业的营销公司:社交媒体运营、付费投放、SEO与GEO、品牌塑造以及网站与App开发,策略与执行出自同一个团队。
营销公司服务
- 真实市场数据分析
- 客群细分与用户画像
- 全案营销策略
- 社交媒体运营
- 付费投放管理(Google Ads、Meta Ads、LinkedIn Ads)
- 品牌与企业的品牌塑造
- 标志与视觉识别设计
- UX/UI设计与物料创作
- SEO与GEO自然流量管理(面向谷歌、ChatGPT和Gemini的优化)
- 优质需求获取
- 邮件自动化
- 优质内容创作
- 高性能网站与App开发
- 品牌网红营销管理
成果案例
- Jardineira Grill(圣保罗):通过SEO,60天内网站自然访问量达1.2万次,谷歌商家档案获得4,609次路线请求和1,815个来电,自然流量Reels播放量超过60万。
- Oliveira Trust:与 Nume 合作 Google Ads,一年内曝光量增长90%以上,单次点击成本降低41%,投入减少42.5%,网站平均停留时间增加472%。
- Wheaton:荣获摩纳哥奖项的品牌塑造与社交媒体项目。
- Wheaton:摩纳哥获奖案例(社交媒体)
- Beflex:App与福利合于一张卡(网站与App)
- Melten:Soft-Service Experience(品牌塑造与社交媒体)
- Água Dias D'Ávila:完整产品线(品牌塑造与社交媒体)
- JAH:快乐就是规则(品牌塑造与社交媒体)
- Summit Cosmetics:色彩创新(社交媒体)
- JA Solar:如阳光般无处不在(社交媒体)
- Serigy:活力满格(品牌塑造与社交媒体)
- VaBene 亮相 FIPAN 2026(社交媒体)
- Lynx Biological:巴西的绿色黄金(社交媒体)
- Fulya Guaraná(品牌塑造与社交媒体)
- 与 Erick Jacquin 合作的内容(Studio Nume)
- Wheaton:改变世界的人(社交媒体)
- JAH:就是规则的açaí(品牌塑造与社交媒体)
- Dias D'Ávila 气泡满满(品牌塑造与社交媒体)
- Summit Cosmetics:居家休息日(社交媒体)
- VaBene:加料甜点(社交媒体)
- Serigy:品牌活动(品牌塑造与社交媒体)
- JA Solar:展会展位(社交媒体)
- JAH:0%乳糖冰棒(品牌塑造与社交媒体)
- 了解为 HD 打造的、以易用性为核心的项目(网站与App)
- Beflex:所有福利合于一张卡(网站与App)
- 为 Água Dias D'Ávila 打造的清爽新网站(网站与App)
- 为 Prime Veículos 打造的高性能网站(网站与App)
- Amica Systems:精准、高速与技术(网站与App)
客户评价
- Lorena Coltro,Yesbank 营销协调员:“与 Nume 合作四个月,我们在 YESPAY 的多个方面都取得了进展。他们执行项目时非常投入、专注,交付始终准时。说到设计和美感,他们的出色作品让我们大为惊喜!我毫不怀疑,在我调研过的所有广告公司中,我做出了最好的选择,他们真的很有才华!感谢所有参与者的用心与关照!”
- Esmeralda Angelita,澳大利亚 Costatt Clinic CEO:“感谢你们出色的工作,我们非常满意。现在有很多人因为广告打电话来找我们,这是非常积极的信号,说明效果很好,所以我想表达感谢。非常棒!”
- Alexandre Fernandes,NX Capital CEO:“在尝试过其他多家机构之后,Nume 成为我们的转折点。他们在广告领域的专业知识、专长和实战经验令人惊叹,为我们的品牌树立了更高的卓越标准。他们的合作模式尤其令人印象深刻:始终与客户紧密沟通,解答所有疑问,并提出我们从未想到过的创意,从而优化我们的投资。我强烈推荐,并坚信 Nume 是市场上表现最好的公司。”
- Felipe Pregnolatto,Gamers Club:“这家公司专注于自己承诺的业务,专业知识无可比拟,并且重视卓越的服务。他们明白客户是业务的核心,并给予客户应有的重视。”
- Roberta Furniel,Fidati 与 Beflex 营销总监:“Nume 不只是一家营销公司,更是 Fidati 的商业伙伴。除了我们的品牌重塑之外,他们还为我们的营销战略以及360度营销方案的执行贡献良多,涵盖各大核心支柱,总是愿意做得更多,并主动提出新想法!”
- Talita Aurani,Futuro House:“服务极其高效、积极主动且有人情味,对我们为项目提出的每一个细节和需求都关注入微。”
Nume博客
39条谷歌客户评价
评价获得满分。
滚动点亮 · 点击庆祝
是的,您的品牌可以成为行业标杆。

Wheaton:摩纳哥获奖案例
招牌 专长
打造高性能网站与App。
如何选对营销公司?
找有作品可展示的公司
好的作品集能直观展示公司的实际交付能力。
行业年限很重要
经验,是区分冒险者与专业人士的分水岭。
品牌网红营销管理。
超过 +200 名网红已纳入我们的资源库。
了解我们的人,热爱我们的工作,推荐并信赖我们。
Nume博客
还有疑问吗?
为什么要聘请数字营销公司?+
真正专业的数字营销公司会深入了解客户的潜力,根据品牌在不同发展阶段的目标制定有效策略:品牌建设、潜在客户获取或转化。
聘请数字营销公司需要多少费用?+
营销公司的服务费用应按项目或按月服务费计算。费用差异取决于目标以及所需的专业人员。例如,是否需要视频制作、社交媒体运营、营销自动化、SEO?覆盖到什么程度?一切都取决于目标的“规模”。
如何选择数字营销公司?+
首先要明确贵公司的目标:是想获得更多客户、提高客单价,还是提升品牌知名度?明确这一点后,要寻找既了解整个数字营销领域、又清楚表明自身专长的公司。因为号称样样精通的公司,很难把您的工作做到完美。至少听取三家不同公司的意见,选择最契合品牌目标和预算的那一家。
所有数字营销公司都一样吗?+
绝非如此,每家公司都有自己的专长和经验水平。
聘请数字营销公司,还是自建内部团队?+
把整个营销流程放在内部完成,就像自己做鞋:您或许能穿着出门,但很可能没走多远就会磨破。营销管理的细节与经验,才能让策略扎实而持续。不过,内部配备一位专员与营销公司对接也很重要,这样沟通才能顺畅。








`;
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=[
['资深经验','c-wheaton2','100%资深团队,从本地企业到全球品牌。'],
['Multiplataformas','c-beflex','Marketing Omnichannel.'],
['创意与叙事','c-jah1','我们打造能促成转化的品牌故事。'],
['资源优化','c-jasolar1','让预算真正产生成果的策略。']];
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],'网站与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='网站与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],'网站与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)