/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useEffect, useRef, useState } from 'react'; // Interfaces para os tipos de dados do formulário e estados interface FormData { nome: string; whatsapp: string; segmento: string; precisa: string; mensagem: string; } export default function App() { const [menuOpen, setMenuOpen] = useState(false); const [scrolled, setScrolled] = useState(false); // Custom Custom-Selects State const [selectSegmentoOpen, setSelectSegmentoOpen] = useState(false); const [selectPrecisaOpen, setSelectPrecisaOpen] = useState(false); // Form Values const [formData, setFormData] = useState({ nome: '', whatsapp: '', segmento: 'Selecione seu segmento', precisa: 'O que você precisa?', mensagem: '' }); const [isSubmitting, setIsSubmitting] = useState(false); const [submitStatus, setSubmitStatus] = useState<'idle' | 'loading' | 'success'>('idle'); const [activePackageTab, setActivePackageTab] = useState(0); // Refs de Animação e Canvas const threeContainerRef = useRef(null); const scrollIndicatorRef = useRef(null); const cursorDotRef = useRef(null); const cursorRingRef = useRef(null); const timelineSvgRef = useRef(null); const testimonialsTrackRef = useRef(null); const floatingWidgetRef = useRef(null); // Carousel Drag State const isDraggingRef = useRef(false); const startXRef = useRef(0); const scrollLeftRef = useRef(0); const [carouselCursorText, setCarouselCursorText] = useState<'drag' | 'dragging' | ''>(''); // Logo Error Fallback state const [logoError, setLogoError] = useState(false); // 1. Efeito para acompanhar o Scroll Global useEffect(() => { const handleScroll = () => { const scrollPos = window.scrollY; if (scrollPos > 80) { setScrolled(true); } else { setScrolled(false); } // Desaparece indicador de scroll após 300px if (scrollIndicatorRef.current) { if (scrollPos > 300) { scrollIndicatorRef.current.style.opacity = '0'; scrollIndicatorRef.current.style.pointerEvents = 'none'; } else { scrollIndicatorRef.current.style.opacity = '1'; scrollIndicatorRef.current.style.pointerEvents = 'auto'; } } // Desaparece Widget do WhatsApp quando na seção #contato if (floatingWidgetRef.current) { const contatoSection = document.getElementById('contato'); if (contatoSection) { const rect = contatoSection.getBoundingClientRect(); if (rect.top <= window.innerHeight) { floatingWidgetRef.current.style.opacity = '0'; floatingWidgetRef.current.style.pointerEvents = 'none'; } else { floatingWidgetRef.current.style.opacity = '1'; floatingWidgetRef.current.style.pointerEvents = 'auto'; } } } }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, []); // 2. Custom Cursor Follower Logic (apenas desktops) useEffect(() => { const isMobile = window.innerWidth < 1024; if (isMobile) return; let targetX = 0; let targetY = 0; let currentRingX = 0; let currentRingY = 0; const onMouseMove = (e: MouseEvent) => { targetX = e.clientX; targetY = e.clientY; if (cursorDotRef.current) { cursorDotRef.current.style.left = `${targetX}px`; cursorDotRef.current.style.top = `${targetY}px`; } }; const updateRingPosition = () => { // Lerp para o anel para lag inercial premium (fator 0.12) currentRingX += (targetX - currentRingX) * 0.12; currentRingY += (targetY - currentRingY) * 0.12; if (cursorRingRef.current) { cursorRingRef.current.style.left = `${currentRingX}px`; cursorRingRef.current.style.top = `${currentRingY}px`; } requestAnimationFrame(updateRingPosition); }; window.addEventListener('mousemove', onMouseMove); const animFrame = requestAnimationFrame(updateRingPosition); // Eventos de Hover em botões e links const handleMouseOver = (e: MouseEvent) => { const target = e.target as HTMLElement; const isInteractive = target.closest('a, button, select, input, textarea, [role="button"], .platform-badge, .stack-card'); const isCarousel = target.closest('.testi-carousel-outer'); if (isInteractive) { if (cursorDotRef.current) { cursorDotRef.current.style.width = '0px'; cursorDotRef.current.style.height = '0px'; } if (cursorRingRef.current) { cursorRingRef.current.style.width = '64px'; cursorRingRef.current.style.height = '64px'; cursorRingRef.current.style.borderColor = 'var(--c-orange)'; cursorRingRef.current.style.backgroundColor = 'rgba(232, 137, 26, 0.05)'; } } if (isCarousel) { if (cursorRingRef.current) { cursorRingRef.current.style.width = '64px'; cursorRingRef.current.style.height = '64px'; cursorRingRef.current.style.backgroundColor = 'rgba(232, 137, 26, 0.1)'; cursorRingRef.current.style.borderColor = 'var(--c-orange)'; } setCarouselCursorText(isDraggingRef.current ? 'dragging' : 'drag'); } }; const handleMouseOut = (e: MouseEvent) => { const target = e.target as HTMLElement; const isInteractive = target.closest('a, button, select, input, textarea, [role="button"], .platform-badge, .stack-card'); const isCarousel = target.closest('.testi-carousel-outer'); if (isInteractive) { if (cursorDotRef.current) { cursorDotRef.current.style.width = '8px'; cursorDotRef.current.style.height = '8px'; } if (cursorRingRef.current) { cursorRingRef.current.style.width = '40px'; cursorRingRef.current.style.height = '40px'; cursorRingRef.current.style.borderColor = 'var(--c-white)'; cursorRingRef.current.style.backgroundColor = 'transparent'; } } if (isCarousel) { setCarouselCursorText(''); } }; window.addEventListener('mouseover', handleMouseOver); window.addEventListener('mouseout', handleMouseOut); return () => { window.removeEventListener('mousemove', onMouseMove); cancelAnimationFrame(animFrame); window.removeEventListener('mouseover', handleMouseOver); window.removeEventListener('mouseout', handleMouseOut); }; }, []); // 3. Three.js - Inicialização da Cena 3D de Cuboides Listrados useEffect(() => { const isMobile = window.innerWidth < 768; const container = threeContainerRef.current; if (!container) return; // Verificar se Three existe globalmente const THREE = (window as any).THREE; if (!THREE) return; // Obter dimensões do container let width = container.clientWidth; let height = container.clientHeight; // Criar Cena, Câmera e Renderer, com alpha:true para fundo transparente const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(50, width / height, 0.1, 100); camera.position.set(0, 0, 5); const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); renderer.setSize(width, height); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); container.appendChild(renderer.domElement); // Objeto Principal: Cuboides Longos e Finos (DNA de Listras) const stripeInstances = isMobile ? 24 : 45; const stripeGroup = new THREE.Group(); const stripes: any[] = []; for (let i = 0; i < stripeInstances; i++) { // largura aleatória entre 1.5 e 3.2 const stWidth = 1.6 + Math.random() * 1.6; const geom = new THREE.BoxGeometry(stWidth, 0.065, 0.065); const mat = new THREE.MeshStandardMaterial({ color: 0xE8891A, metalness: 0.35, roughness: 0.55 }); const mesh = new THREE.Mesh(geom, mat); // Dispostos em grade 3D esparsa com profundidade Z variável const x = (Math.random() - 0.5) * 3.4; const y = (Math.random() - 0.5) * 3.4; const z = (Math.random() - 0.5) * 0.8; // Z var ±0.4 mesh.position.set(x, y, z); // Meta dados da animação individual mesh.userData = { speed: 1.2 + Math.random() * 1.6, offset: Math.random() * Math.PI * 2, startY: y }; stripeGroup.add(mesh); stripes.push(mesh); } scene.add(stripeGroup); // Partículas de Fundo Estrelares (desligadas no mobile para desempenho superior) let stars: any; if (!isMobile) { const pointsGeom = new THREE.BufferGeometry(); const numStars = 800; const positions = new Float32Array(numStars * 3); for (let i = 0; i < numStars * 3; i += 3) { // Distribuídas aleatoriamente em esfera de raio 8 const u = Math.random(); const v = Math.random(); const theta = u * 2 * Math.PI; const phi = Math.acos(2 * v - 1); const r = 8 * Math.cbrt(Math.random()); positions[i] = r * Math.sin(phi) * Math.cos(theta); positions[i + 1] = r * Math.sin(phi) * Math.sin(theta); positions[i + 2] = r * Math.cos(phi); } pointsGeom.setAttribute('position', new THREE.BufferAttribute(positions, 3)); const pointsMat = new THREE.PointsMaterial({ color: 0xffffff, size: 0.012, transparent: true, opacity: 0.55 }); stars = new THREE.Points(pointsGeom, pointsMat); scene.add(stars); } // Iluminação const ambientLight = new THREE.AmbientLight(0xffffff, 0.45); scene.add(ambientLight); const pointLightOrange = new THREE.PointLight(0xE8891A, 2.5, 12); pointLightOrange.position.set(2.5, 3.5, 4); scene.add(pointLightOrange); const pointLightContrastBlue = new THREE.PointLight(0x1A2A4A, 1.2, 8); pointLightContrastBlue.position.set(-3.5, -2, 2.5); scene.add(pointLightContrastBlue); // Mouse tilt mapping let mouseX = 0; let mouseY = 0; const handleMouseMoveTilt = (e: MouseEvent) => { mouseX = (e.clientX / window.innerWidth) - 0.5; mouseY = (e.clientY / window.innerHeight) - 0.5; }; window.addEventListener('mousemove', handleMouseMoveTilt); // Loop de Animação Principal const clock = new THREE.Clock(); let animId: number; const animate = () => { animId = requestAnimationFrame(animate); const time = clock.getElapsedTime(); // Oscilação de câmera respiratória sutil camera.position.x = Math.sin(time * 0.3) * 0.15; // Ondulação orgânica coletiva nos cuboides stripes.forEach((stripe) => { stripe.position.y = stripe.userData.startY + Math.sin(time * stripe.userData.speed + stripe.userData.offset) * 0.04; }); // Rotação lenta de estrelas de fundo if (stars) { stars.rotation.y += 0.0003; stars.rotation.x += 0.00015; } // Mouse interactive tilt (fator lerp 0.05) const targetRotationX = mouseY * 0.14; // max ~8 graus de inclinação const targetRotationY = mouseX * 0.14; stripeGroup.rotation.x += (targetRotationX - stripeGroup.rotation.x) * 0.05; stripeGroup.rotation.y += (targetRotationY - stripeGroup.rotation.y) * 0.05; renderer.render(scene, camera); }; animate(); // Redimensionamento const handleResize = () => { if (!container) return; width = container.clientWidth; height = container.clientHeight; camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize(width, height); }; window.addEventListener('resize', handleResize); return () => { window.removeEventListener('mousemove', handleMouseMoveTilt); window.removeEventListener('resize', handleResize); cancelAnimationFrame(animId); if (container && renderer.domElement) { container.removeChild(renderer.domElement); } }; }, []); // 4. GSAP & Lenis Smooth Scroll Engine Setup useEffect(() => { // Declarar globais GSAP e Lenis const gsap = (window as any).gsap; const ScrollTrigger = (window as any).ScrollTrigger; const Lenis = (window as any).Lenis; if (!gsap || !ScrollTrigger || !Lenis) return; // Registrar plugin ScrollTrigger gsap.registerPlugin(ScrollTrigger); // Inicializar Lenis Smooth Scroll const lenis = new Lenis({ duration: 1.4, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), direction: 'vertical', smooth: true, smoothTouch: false, }); function raf(time: number) { lenis.raf(time); ScrollTrigger.update(); requestAnimationFrame(raf); } requestAnimationFrame(raf); // ANIMANDO PRÉ-LOADER (2.2 segundos) const loaderTl = gsap.timeline({ onComplete: () => { // Habilitar rolagem na página pós-carregamento document.body.style.overflowY = 'auto'; } }); // Desabilitar rolagem inicialmente no loader document.body.style.overflowY = 'hidden'; // Barra de progresso laranja esticando loaderTl.to('.loader-progress-bar', { width: '100%', duration: 1.8, ease: 'power2.inOut' }); // Stagger clippath nas listras do logo (efeito de "desenho" da esquerda para a direita) loaderTl.fromTo('.loader-logo-strip', { clipPath: 'inset(0 100% 0 0)' }, { clipPath: 'inset(0 0% 0 0)', stagger: 0.08, duration: 0.6, ease: 'power3.out' }, 0.2); // inicia junto com o preenchimento // Escala final do loader e Wipe Vertikal loaderTl.to('.loader-logo-container', { scale: 1.03, duration: 0.2, ease: 'power1.inOut' }); loaderTl.to('.loader-logo-container', { scale: 1, duration: 0.2, ease: 'power1.inOut' }); // Wipe vertical da tela do loader usando clip-path inset loaderTl.to('#loader', { clipPath: 'inset(0 0 100% 0)', duration: 0.6, ease: 'power4.inOut' }, '+=0.1'); // Revelação dos Elementos do Hero loaderTl.fromTo('.hero-eyebrow', { opacity: 0, y: 12 }, { opacity: 1, y: 0, duration: 0.6, ease: 'power2.out' }, '-=0.1'); // Split-line effect para a headline do Hero (staggered entries) loaderTl.fromTo('.headline-line', { y: '120%', opacity: 0 }, { y: '0%', opacity: 1, stagger: 0.12, duration: 1.2, ease: 'power4.out' }, '-=0.5'); loaderTl.fromTo('.hero-subtext', { opacity: 0, y: 20 }, { opacity: 1, y: 0, duration: 0.7, ease: 'power2.out' }, '-=0.8'); loaderTl.fromTo('.hero-ctas', { opacity: 0, y: 20 }, { opacity: 1, y: 0, duration: 0.7, ease: 'power2.out' }, '-=0.6'); // ANIMAÇÕES DE TRANSREVELAÇÃO POR SCROLL // Parágrafos e blocos Globais gsap.utils.toArray('.reveal-on-scroll').forEach((el: any) => { gsap.fromTo(el, { opacity: 0, y: 24 }, { opacity: 1, y: 0, duration: 0.8, ease: 'power2.out', scrollTrigger: { trigger: el, start: 'top 85%', toggleActions: 'play none none none' } }); }); // Cards de Serviços: Staggered Fade Up gsap.fromTo('.service-card', { opacity: 0, y: 60 }, { opacity: 1, y: 0, stagger: 0.08, duration: 0.8, ease: 'power2.out', scrollTrigger: { trigger: '.services-grid', start: 'top 80%', toggleActions: 'play none none none' } }); // Ativar Glow da Borda do card de serviços quando visível no centro da tela gsap.utils.toArray('.service-card').forEach((card: any) => { gsap.to(card, { borderColor: 'rgba(232, 137, 26, 0.25)', // Var glow ativo sutil duration: 0.4, scrollTrigger: { trigger: card, start: 'top 65%', end: 'bottom 45%', toggleActions: 'play reverse play reverse' } }); }); // LINHA DO TEMPO: Desenhar SVG Line conforme rola const timelineSvg = timelineSvgRef.current; if (timelineSvg) { // Obter comprimento do path e atribuir a dasharray/offset const len = timelineSvg.getTotalLength(); timelineSvg.style.strokeDasharray = `${len}`; timelineSvg.style.strokeDashoffset = `${len}`; gsap.to(timelineSvg, { strokeDashoffset: 0, ease: 'none', scrollTrigger: { trigger: '.timeline-container', start: 'top 60%', end: 'bottom 40%', scrub: 1.2, onUpdate: (self: any) => { // Ativação dos nós da timeline de acordo com o progresso const steps = document.querySelectorAll('.timeline-step'); const progress = self.progress; steps.forEach((step: any, index: number) => { const stepTriggerThreshold = (index) / (steps.length - 1); if (progress >= stepTriggerThreshold * 0.95) { step.classList.add('active'); } else { step.classList.remove('active'); } }); } } }); } // Parallax de Texto no Background da seção METRICS ("CRESCIMENTO") gsap.fromTo('.parallax-bg-text', { y: '20%' }, { y: '-20%', ease: 'none', scrollTrigger: { trigger: '.parallax-split-section', start: 'top bottom', end: 'bottom top', scrub: true } }); // Efeito Parallax de velocidade alterada no Marquee em scroll gsap.to('.marquee-track-1', { x: '-=150', scrollTrigger: { trigger: '.marquee-container', start: 'top bottom', end: 'bottom top', scrub: true } }); gsap.to('.marquee-track-2', { x: '+=80', scrollTrigger: { trigger: '.marquee-container', start: 'top bottom', end: 'bottom top', scrub: true } }); // CONTADOR DE NÚMEROS (CountUp manual com ScrollTrigger) const metricsValues = document.querySelectorAll('.countup-value'); metricsValues.forEach((item: any) => { const targetValStr = item.getAttribute('data-target') || '0'; const isPercentage = targetValStr.includes('%'); const isPlus = targetValStr.includes('+'); const targetNum = parseInt(targetValStr.replace(/[^0-9]/g, ''), 10); const obj = { val: 0 }; gsap.to(obj, { val: targetNum, scrollTrigger: { trigger: '.parallax-split-section', start: 'top 75%' }, duration: 2.2, ease: 'power2.out', onUpdate: () => { let output = Math.floor(obj.val).toString(); if (isPlus) output = `+${output}`; if (isPercentage) output = `${output}%`; // Tratar métricas específicas if (targetValStr.includes('ANOS')) output = `+${Math.floor(obj.val)} ANOS`; if (targetValStr.includes('CANAIS')) output = `${Math.floor(obj.val)} CANAIS`; if (targetValStr.includes('RESULTADO')) output = `${Math.floor(obj.val)}% RESULTADO`; if (targetValStr.includes('VISÃO')) output = `${Math.floor(obj.val)}° VISÃO`; item.textContent = output; } }); }); return () => { // Destruir todas as rotas e instâncias no descarregamento ScrollTrigger.getAll().forEach((t: any) => t.kill()); }; }, []); // 5. Interação Manual com tilt 3D nos Badges das Plataformas const handleBadgeMouseMove = (e: React.MouseEvent) => { const badge = e.currentTarget as HTMLDivElement; const rect = badge.getBoundingClientRect(); // Calcular as coordenadas X e Y relativas dentro da pill const x = e.clientX - rect.left; const y = e.clientY - rect.top; // Converter para valores percentuais (-50% a 50%) const pctX = (x / rect.width) - 0.5; const pctY = (y / rect.top) - 0.5; // Atribuir as variáveis CSS para o Specular Glow que segue o ponteiro badge.style.setProperty('--shine-x', `${(x / rect.width) * 100}%`); badge.style.setProperty('--shine-y', `${(y / rect.height) * 100}%`); // Calcular rotações suaves (limite de 12 graus) const rotateX = pctY * -12; const rotateY = pctX * 12; // Aplicar transformações 3D aceleradas badge.style.transform = `rotateX(${rotateX}deg) rotateY(${rotateY}deg) translateZ(6px) scale(1.03)`; badge.style.transition = 'transform 0.05s ease'; }; const handleBadgeMouseLeave = (e: React.MouseEvent) => { const badge = e.currentTarget as HTMLDivElement; // Reset suave das rotações com transition lerp de volta ao estado plano badge.style.transform = 'rotateX(0deg) rotateY(0deg) translateZ(0px) scale(1)'; badge.style.transition = 'transform 0.38s cubic-bezier(0.25, 1, 0.5, 1)'; }; // 6. Testimonials Carousel Draggable Swipe Logic const handleCarouselMouseDown = (e: React.MouseEvent) => { isDraggingRef.current = true; startXRef.current = e.pageX - (testimonialsTrackRef.current?.offsetLeft || 0); scrollLeftRef.current = testimonialsTrackRef.current ? getScrollX(testimonialsTrackRef.current) : 0; setCarouselCursorText('dragging'); // Aplicar leve scale down 0.97 aos cards do carrossel ao arrastar (profundidade de interface) const cards = testimonialsTrackRef.current?.querySelectorAll('.testi-node-card'); cards?.forEach((card: any) => { card.style.transform = 'scale(0.97)'; card.style.transition = 'transform 0.3s ease'; }); }; const handleCarouselMouseMove = (e: React.MouseEvent) => { if (!isDraggingRef.current || !testimonialsTrackRef.current) return; e.preventDefault(); const x = e.pageX - (testimonialsTrackRef.current.offsetLeft || 0); const walk = (x - startXRef.current) * 1.5; // multiplicador de fricção de scroll testimonialsTrackRef.current.style.transform = `translateX(${scrollLeftRef.current + walk}px)`; }; const handleCarouselMouseUpOrLeave = () => { if (!isDraggingRef.current) return; isDraggingRef.current = false; setCarouselCursorText('drag'); // Restaurar escala normal dos cards const cards = testimonialsTrackRef.current?.querySelectorAll('.testi-node-card'); cards?.forEach((card: any) => { card.style.transform = 'scale(1)'; }); // Snap opcional ao card mais próximo if (testimonialsTrackRef.current) { const currentTranslate = getScrollX(testimonialsTrackRef.current); // Limites de scroll const containerWidth = testimonialsTrackRef.current.parentElement?.clientWidth || window.innerWidth; const trackWidth = testimonialsTrackRef.current.scrollWidth; const maxTranslate = -(trackWidth - containerWidth + 48); let targetTranslate = Math.round(currentTranslate / 384) * 384; // largura de card (360) + gap (24) = 384 if (targetTranslate > 0) targetTranslate = 0; if (targetTranslate < maxTranslate) targetTranslate = maxTranslate; testimonialsTrackRef.current.style.transform = `translateX(${targetTranslate}px)`; testimonialsTrackRef.current.style.transition = 'transform 0.4s cubic-bezier(0.25, 1, 0.5, 1)'; } }; // Funções Auxiliares para ler posições matriciais do Translate do CSS const getScrollX = (el: HTMLElement) => { const style = window.getComputedStyle(el); const matrix = new WebKitCSSMatrix(style.transform); return matrix.m41; }; const handleFormInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, ...{ [name]: value } })); }; const triggerEmailRedirect = (data: FormData) => { const subject = `Novo Lead de Diagnóstico - ${data.nome}`; const baseText = `Olá Huyus Growth! Gostaria de solicitar um diagnóstico gratuito para a minha empresa: • Nome: ${data.nome} • WhatsApp: ${data.whatsapp} • Segmento: ${data.segmento} • Canal desejado: ${data.precisa} Comentários adicionais: "${data.mensagem}"`; const mailtoUrl = `mailto:contato@huyus.com?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(baseText)}`; window.location.href = mailtoUrl; }; const handleFormSubmit = (e: React.FormEvent) => { e.preventDefault(); // Validação básica if (!formData.nome || !formData.whatsapp) { alert('Por favor, preencha os campos obrigatórios (Nome e WhatsApp).'); return; } setIsSubmitting(true); setSubmitStatus('loading'); // Simulação de submissão fake com loading de 1s para feedback visual interativo setTimeout(() => { setIsSubmitting(false); setSubmitStatus('success'); // Abre o gerenciador de e-mail com os dados preenchidos triggerEmailRedirect(formData); // Limpa formulário após sucesso setTimeout(() => { setSubmitStatus('idle'); setFormData({ nome: '', whatsapp: '', segmento: 'Selecione seu segmento', precisa: 'O que você precisa?', mensagem: '' }); }, 3000); }, 1200); }; return ( <> {/* 0. TELA DE PRÉ-LOADER (2.2 segundos) */}
{logoError ? (
HUYUS
) : ( setLogoError(true)}> HUYUS )}
{/* CURSOR PERSONADO ATIVO APENAS GIGANTE */}
{carouselCursorText}
{/* 1. NAVEGAÇÃO SUPERIOR */} {/* NAVIGATION MOBILE OVERLAY */} {/* 2. HERO — CENA PRINCIPAL COM THREEJS */}
{/* COLUNA ESQUERDA - INFRAESTRUTURA DE TEXTO */}
HUYUS GROWTH · SOLUÇÕES DIGITAIS
SEU NEGÓCIO
VENDENDO
MAIS.

Tráfego pago, marketplaces, automações e presença digital — tudo integrado para quem quer crescer de verdade, sem atalho e sem enrolação.

{/* COLUNA DIREITA - INTERAÇÃO DA MÁQUINA 3D */}
{/* INDICADOR DE ROLAGEM */}
SCROLL
{/* 3. MARQUEE STRIP (ENTRE HERO E SERVIÇOS) */}
TRÁFEGO PAGO · MARKETPLACES · AUTOMAÇÃO IA · ERP BLING · META ADS · GOOGLE ADS · WHATSAPP BOT · LANDING PAGES · SHOPEE · MERCADO LIVRE · AMAZON ·
TRÁFEGO PAGO · MARKETPLACES · AUTOMAÇÃO IA · ERP BLING · META ADS · GOOGLE ADS · WHATSAPP BOT · LANDING PAGES · SHOPEE · MERCADO LIVRE · AMAZON ·
MERCADO LIVRE · AUTOMAÇÃO IA · WHATSAPP BOT · TRÁFEGO PAGO · METAS & METRICAS · GOOGLE ADS · ERP BLING · SHOPEE · GROWTH DIGITAL ·
MERCADO LIVRE · AUTOMAÇÃO IA · WHATSAPP BOT · TRÁFEGO PAGO · METAS & METRICAS · GOOGLE ADS · ERP BLING · SHOPEE · GROWTH DIGITAL ·
{/* 4. SEÇÃO DO GRID DE SERVIÇOS */}
O QUE FAZEMOS

SERVIÇOS QUE
GERAM RESULTADO.

{/* Card 1 */}

Tráfego Pago

Meta Ads · Google Ads

Campanhas gerenciadas do zero: estratégia, criativo, segmentação e otimização contínua para o melhor custo por resultado.

{/* Card 2 */}

Gestão de Marketplaces

ML · Shopee · Amazon

Criação, otimização e operação completa. SEO de produto, precificação dinâmica e anúncios internos gerenciados profissionalmente.

{/* Card 3 */}

Automações & Agentes IA

N8N · Evolution API

Fluxos automáticos, assistentes integrados inteligentes de IA no WhatsApp e conexões completas de banco de dados. Seu negócio no piloto automático.

{/* Card 4 */}

ERP & Logística

Bling ERP · NF-e · Estoque

Implantação, configuração avançada e operação técnica de Bling ERP. Integrações fiscais, fluxo de faturamento e depósitos.

{/* Card 5 */}

Agente IA no WhatsApp

Atendimento 24/7 Ativo

Qualificação avançada de leads frios, agendamentos, fechamento inteligente de carrinhos e suporte automatizado. Vendedor que nunca dorme.

{/* Card 6 */}

Sites & Landing Pages

Foco em Alta Conversão

Desenvolvimento nativo customizado estruturado para performance máxima. Carregamento ultraveloz, responsividade total e SEO impecável.

{/* 5. COMO FUNCIONA (LINHA DO TEMPO PROGRAMÁTICA) */}
DIRETRIZ CLARA

PROCESSO SEM ENROLAÇÃO.

{/* Linha horizontal para animação DrawSVG simulada */}
{/* Step 1 */}
01

DIAGNÓSTICO

Análise direta e minuciosa dos gargalos, canais inativos e arquitetura comercial atual do seu negócio digital.

{/* Step 2 */}
02

ESTRATÉGIA

Modelagem do plano tático sob medida: canais de expansão prioritários, verba de tração e canais de automação.

{/* Step 3 */}
03

EXECUÇÃO

Criação técnica, codificação de fluxos de IA, configuração dos setups de anúncios e subida das páginas originais.

{/* Step 4 */}
04

ESCALA

Análise contínua de margem, campanhas escaladas progressivamente, e automações assumindo o atendimento redundante.

{/* 6. PLATAFORMAS (BADGES COM INTERAÇÃO DE INCLINAÇÃO 3D REAL) */}
INTEGRAÇÃO COMPLETA

OPERAMOS ONDE VOCÊ VENDE.

Trabalhamos de forma integrada com as tecnologias líderes do e-commerce mundial, conectando anúncios, estoque, CRM e sistemas fiscais.

{[ 'Mercado Livre', 'Shopee', 'Amazon', 'Magazine Luiza', 'B2W / Americanas', 'Casas Bahia', 'Meta Ads', 'Google Ads', 'Bling ERP', 'N8N', 'Evolution API', 'WhatsApp Business', 'FastAPI', 'Supabase', 'React', 'Claude AI' ].map((item, index) => (
{item}
))}
{/* 7. PACOTES PERSONALIZADOS DE PROPOSTA */}
{/* Coluna Texto */}
A REALIDADE DO SEU NEGÓCIO

NADA DE PACOTE
ENGESSADO.

“Cada negócio tem uma realidade diferente. Na conversa inicial mapeamos seus objetivos principais, gargalos e maturidade digital atual — e montamos a estratégia exata que faz sentido para o seu momento atual.”

Diagnóstico sem custo na primeira conversa comercial
Estratégia sob medida montada para o seu ERP, Ads e equipe
Sem contrato de carência abusivo ou multa de rescisão
→ Quero minha proposta
{/* Coluna Stacking de Perfis */}
{/* Tabs Selector at the top of the stack */}
{/* Card 🚀 */}
setActivePackageTab(0)} style={activePackageTab === 0 ? { zIndex: 10, opacity: 1, transform: 'translate3d(0, 0, 0) scale(1)', borderColor: 'var(--c-orange)', boxShadow: '0 15px 40px rgba(232, 137, 26, 0.15)' } : activePackageTab === 1 ? { zIndex: 1, opacity: 0.3, transform: 'translate3d(20px, 30px, 0) scale(0.92)' } : { // active === 2 zIndex: 5, opacity: 0.6, transform: 'translate3d(10px, 15px, 0) scale(0.96)' }} >
🚀

Client Starter

Ideal para validação e criação da estrutura fundacional. Ativação de primeiro canal contínuo de tração e tráfego mapeado de conversão inicial.

{/* Card 📈 */}
setActivePackageTab(1)} style={activePackageTab === 1 ? { zIndex: 10, opacity: 1, transform: 'translate3d(0, 0, 0) scale(1)', borderColor: 'var(--c-orange)', boxShadow: '0 15px 40px rgba(232, 137, 26, 0.15)' } : activePackageTab === 2 ? { zIndex: 1, opacity: 0.3, transform: 'translate3d(20px, 30px, 0) scale(0.92)' } : { // active === 0 zIndex: 5, opacity: 0.6, transform: 'translate3d(10px, 15px, 0) scale(0.96)' }} >
📈

Client Scaling

Expansão de canais multi-marketplaces, SEO avançado, minerações sistemáticas de dados de margem e campanhas unificadas em canais paralelos.

{/* Card 🤖 */}
setActivePackageTab(2)} style={activePackageTab === 2 ? { zIndex: 10, opacity: 1, transform: 'translate3d(0, 0, 0) scale(1)', borderColor: 'var(--c-orange)', boxShadow: '0 15px 40px rgba(232, 137, 26, 0.15)' } : activePackageTab === 0 ? { zIndex: 1, opacity: 0.3, transform: 'translate3d(20px, 30px, 0) scale(0.92)' } : { // active === 1 zIndex: 5, opacity: 0.6, transform: 'translate3d(10px, 15px, 0) scale(0.96)' }} >
🤖

Atendimento Automático

Soluções integradas com inteligência artificial, conexões internas por n8n com Bling ERP, agentes prontos de atendimento recurrentes 24 horas por dia.

{/* 8. IMPACTO VISUAL PARALLAX SPLIT */}
CRESCIMENTO
+4 ANOS
De Experiência
7 CANAIS
De Atuação Ativa
100%
Transparência
360°
Visão Digital
{/* 10. CTA BANNER - FULL WIDTH */} {/* 11. CONTATO & FORMULÁRIO DE CAPTAÇÃO */}
{/* Coluna Dados */}
AGENDE SUA CONVERSA

VAMOS CONVERSAR?

Uma breve avaliação técnica gratuita de 15 minutos para analisar como organizar seus marketplaces, tração fiscal no Bling e escalabilidade de anúncios.

Chamar agora no WhatsApp
OU
Sediada em Bragança Paulista, SP — Atendimento Digital Sob Demanda
{/* Coluna Formulário */}
{/* Campo Nome */}
{/* Campo WhatsApp */}
{/* Custom SELECT Segmento */}
Seu Segmento
setSelectSegmentoOpen(!selectSegmentoOpen)} > {formData.segmento}
{selectSegmentoOpen && (
{[ 'Fabricante / Indústria', 'Distribuidor Atacadista', 'E-commerce / Lojista', 'Infoprodutos / Serviços', 'Outro segmento comercial' ].map((opt) => (
{ setFormData((prev) => ({ ...prev, segmento: opt })); setSelectSegmentoOpen(false); }} > {opt}
))}
)}
{/* Custom SELECT Necessidade */}
Do que você precisa?
setSelectPrecisaOpen(!selectPrecisaOpen)} > {formData.precisa}
{selectPrecisaOpen && (
{[ 'Tráfego Pago (Ads)', 'Integração e Organização de ERP', 'Automação Inteligente de WhatsApp / IA', 'Gestão Avançada de Marketplaces', 'Preciso de uma Solução 360°' ].map((opt) => (
{ setFormData((prev) => ({ ...prev, precisa: opt })); setSelectPrecisaOpen(false); }} > {opt}
))}
)}
{/* Mensagem Livre */}
{/* 12. RODAPÉ INSTITUCIONAL */}
{logoError ? ( HUYUS ) : ( setLogoError(true)}> HUYUS )}

Huyus Growth Soluções Digitais — E-commerce estruturado e marketing focado em margem real.

© 2026 Huyus Growth. Todos os direitos reservados.

EMPRESA

Huyus Growth Soluções Digitais LTDA
Sede Administrativa: Bragança Paulista, SP

Parcerias locais qualificadas na região de Campinas, Jundiaí e Vale do Paraíba.

{/* 13. BOTÃO WHATSAPP FLUTUANTE DE SUPORTE */} Falar no WhatsApp ); }