/* ================================================== STOCK, App ================================================== */ const { useState, useEffect, useRef } = React; /* ---------- LOGO ---------- */ function Logo() { return ( Stock, Sistema de armazenagem e construtivos ); } /* ---------- HEADER + MEGA MENU ---------- */ const NAV_LINKS = [ { label: 'HOME', href: '#top' }, { label: 'SOLUÇÕES', href: '#solucoes', mega: true }, { label: 'CLIENTES', href: '#clientes' }, { label: 'INSTITUCIONAL', href: 'Stock - Institucional.html' }, { label: 'CONTATO', href: '#contato' }, ]; const PAGE_PRODUTO = 'Stock - Produto.html'; const MEGA_PRODUCTS = [ { name: 'Porta Pallet', group: 'Estáticos', featured: true, href: 'porta-pallet.html', img: 'assets/produtos/porta-pallet.webp', desc: 'Seletividade total e layout flexível para qualquer operação.' }, { name: 'Mini Porta Pallet', group: 'Estáticos', href: 'mini-porta-pallet.html', img: 'assets/produtos/mini-porta-pallet.webp', desc: 'Compacto, ideal para cargas leves e fracionadas.' }, { name: 'Cantilever', group: 'Estáticos', href: 'cantilever.html', img: 'assets/produtos/cantilever.webp', desc: 'Para cargas longas e volumosas, sem colunas frontais.' }, { name: 'Mezanino', group: 'Estáticos', href: 'mezanino.html', img: 'assets/produtos/mezanino.webp', desc: 'Multiplica a área útil do galpão em novos pavimentos.' }, { name: 'Rack Pallet', group: 'Estáticos', href: 'rack-pallet.html', img: 'assets/produtos/porta-pallet.webp', desc: 'Paletização modular, robusta e de fácil movimentação.' }, { name: 'Drive In', group: 'Dinâmicos', href: 'drive-in.html', img: 'assets/produtos/drive-in.webp', desc: 'Alta densidade de estocagem sem corredores intermediários.' }, { name: 'Push Back', group: 'Dinâmicos', href: 'push-back.html', img: 'assets/produtos/push-back.webp', desc: 'Densidade com múltiplas posições por corredor.' }, { name: 'Flow Rack', group: 'Dinâmicos', href: 'flow-rack.html', img: 'assets/produtos/flow-rack.webp', desc: 'Separação ágil de pedidos com abastecimento por gravidade.' }, { name: 'Dinâmico', group: 'Dinâmicos', href: 'dinamico.html', img: 'assets/produtos/dinamico.webp', desc: 'Sistema FIFO: primeiro a entrar, primeiro a sair.' }, { name: 'Carro Satélite', group: 'Dinâmicos', href: 'carro-satelite.html', img: 'assets/produtos/carro-satelite.webp', desc: 'Movimentação semiautomática de alta densidade.' }, ]; const MEGA_SERVICES = [ { name: 'Projeto', href: 'Stock - Institucional.html#projeto' }, { name: 'Fabricação', href: 'Stock - Institucional.html#fabricacao' }, { name: 'Instalação', href: 'Stock - Institucional.html#instalacao' }, ]; function HexIcon() { return ( ); } function MegaPanel({ onClose }) { const [hov, setHov] = useState(0); useEffect(() => { const onKey = (e) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [onClose]); const cols = [ { title: 'Estruturas Estáticas', items: MEGA_PRODUCTS.filter(p => p.group === 'Estáticos') }, { title: 'Estruturas Dinâmicas', items: MEGA_PRODUCTS.filter(p => p.group === 'Dinâmicos') }, ]; const idxOf = (p) => MEGA_PRODUCTS.indexOf(p); const cur = MEGA_PRODUCTS[hov]; return (

Soluções Stock

Estruturas sob medida para cada tipo de operação.

{cols.map(c => (
{c.title}
))}
Serviços
Quero fazer meu projeto
{MEGA_PRODUCTS.map((p, i) => (
))}
Estruturas {cur.group}

{cur.name}

{cur.desc}

Ver detalhes
); } function Header() { const [scrolled, setScrolled] = useState(false); const [active, setActive] = useState('#top'); const [progress, setProgress] = useState(0); const [megaOpen, setMegaOpen] = useState(false); const closeTimer = useRef(null); useEffect(() => { const onScroll = () => { setScrolled(window.scrollY > 40); const h = document.documentElement.scrollHeight - window.innerHeight; setProgress(h > 0 ? (window.scrollY / h) * 100 : 0); }; window.addEventListener('scroll', onScroll); onScroll(); return () => window.removeEventListener('scroll', onScroll); }, []); const openMega = () => { clearTimeout(closeTimer.current); setMegaOpen(true); }; const closeMega = () => { clearTimeout(closeTimer.current); setMegaOpen(false); }; useEffect(() => { document.body.style.overflow = megaOpen ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [megaOpen]); return (
Faça um orçamento
setMegaOpen(false)} />
); } /* ---------- HERO with sliding carousel ---------- */ // Each slide: title lines (one line flagged orange) + description. const HERO_SLIDES = [ { lines: [ { t: "Estrutura" }, { t: "sob medida", orange: true }, { t: "para otimizar" }, { t: "seu espaço" }, ], desc: "Sistemas projetados para maximizar a capacidade de estocagem, melhorar o fluxo logístico e reduzir custos operacionais.", }, { lines: [ { t: "A Stock", orange: true }, { t: "desenvolve" }, { t: "projeta, produz" }, { t: "e implementa" }, ], desc: "Da engenharia à instalação, uma equipe só cuida de todo o seu projeto de armazenagem.", }, { lines: [ { t: "Soluções" }, { t: "inteligentes em" }, { t: "armazenagem", orange: true }, { t: "industrial" }, ], desc: "Maximize o espaço e a eficiência do seu armazém com nossas estruturas de alta performance.", }, ]; const HERO_VIDEO_ID = 'YbAX9QJgqyc'; function Hero() { const [idx, setIdx] = useState(0); const [paused, setPaused] = useState(false); const videoRef = useRef(null); // Autoplay carousel useEffect(() => { if (paused) return; const t = setInterval(() => setIdx(i => (i + 1) % HERO_SLIDES.length), 7000); return () => clearInterval(t); }, [paused]); // YouTube IFrame API, reliable autoplay + loop background useEffect(() => { let player; function build() { player = new window.YT.Player(videoRef.current, { videoId: HERO_VIDEO_ID, playerVars: { autoplay: 1, mute: 1, controls: 0, loop: 1, playlist: HERO_VIDEO_ID, showinfo: 0, rel: 0, modestbranding: 1, playsinline: 1, disablekb: 1, iv_load_policy: 3, fs: 0, }, events: { onReady: (e) => { e.target.mute(); e.target.playVideo(); }, onStateChange: (e) => { if (e.data === window.YT.PlayerState.ENDED) e.target.playVideo(); }, }, }); } if (window.YT && window.YT.Player) { build(); } else { const tag = document.createElement('script'); tag.src = 'https://www.youtube.com/iframe_api'; document.head.appendChild(tag); window.onYouTubeIframeAPIReady = build; } return () => { if (player && player.destroy) player.destroy(); }; }, []); const go = (dir) => setIdx(i => (i + dir + HERO_SLIDES.length) % HERO_SLIDES.length); return (
{HERO_SLIDES.map((s, i) => (

{s.lines.map((ln, j) => ( {ln.t} ))}

))}
{HERO_SLIDES.map((_, i) => (
); } /* ---------- FLOATING WHATSAPP ---------- */ function WhatsAppFloat() { return ( ); } /* ---------- SOLUTIONS FEATURE + SLIDER ---------- */ const SOLUTIONS = [ { name: "Porta Pallet", img: "assets/produtos/porta-pallet.webp", desc: "Favorecem a busca e seletividade por mercadorias e são adaptáveis às mudanças de layout em relação ao espaço em que estão inseridos." }, { name: "Drive In", img: "assets/produtos/drive-in.webp", desc: "Sem corredores, os produtos são armazenados em profundidade, possibilitando alta taxa de ocupação e volume de armazenagem." }, { name: "Cantilever", img: "assets/produtos/cantilever.webp", desc: "Sistema de armazenagem versátil, possibilita o armazenamento de diversos tipos e dimensões de mercadorias, como cargas longas." }, { name: "Mezanino", img: "assets/produtos/mezanino.webp", desc: "Sistema multifuncional, ideal para criar escritórios ou estoque. Também pode aumentar a área útil para ampliar a operação." }, { name: "Mini Porta Pallet", img: "assets/produtos/mini-porta-pallet.webp", desc: "Estrutura compacta ideal para cargas leves e fracionadas, com fácil montagem e máximo aproveitamento de altura." }, { name: "Flow Rack", img: "assets/produtos/flow-rack.webp", desc: "Aumento de produtividade e precisão na separação de pedidos e na organização da montagem de pedidos fracionados." }, { name: "Push Back", img: "assets/produtos/push-back.webp", desc: "Permite alta densidade em armazenagem e ótimo aproveitamento em volume de cargas armazenadas." }, { name: "Dinâmico", img: "assets/produtos/dinamico.webp", desc: "As mercadorias são abastecidas de um lado e retiradas do outro, garantindo que o primeiro palete armazenado seja o primeiro a sair." }, { name: "Sistema para Carro Satélite", img: "assets/produtos/carro-satelite.webp", desc: "Carga e descarga realizadas de forma semiautomática, por empilhadeiras convencionais ou automatizadas." }, { name: "Rack Pallet", img: "assets/produtos/porta-pallet.webp", desc: "Solução robusta e modular para paletização, garantindo organização, segurança e agilidade na movimentação de cargas." }, ]; function SolutionsFeature() { const [idx, setIdx] = useState(0); const go = (dir) => setIdx(i => (i + dir + SOLUTIONS.length) % SOLUTIONS.length); const cur = SOLUTIONS[idx]; // Preload all images so slide changes never wait on a network load useEffect(() => { SOLUTIONS.forEach(s => { const im = new Image(); im.src = s.img; }); }, []); return (
Conheça nossos

Sistemas e Soluções

Saiba mais

{cur.name}

{cur.desc}

Solicitar orçamento
{cur.name}
); } /* ---------- PRODUCTS ---------- */ const PRODUCTS = [ { name: "Porta Palete", img: "uploads/soluções/PORTA PALLET.png", desc: "Favorecem a busca e seletividade por mercadorias e são adaptáveis às mudanças de layout em relação ao espaço que estão inseridos." }, { name: "Mini Porta Palete", img: "uploads/soluções/MINI PORTA PALLET.png", desc: "Estrutura compacta ideal para cargas leves e fracionadas, com fácil montagem e máximo aproveitamento de altura." }, { name: "Drive-in", img: "uploads/soluções/DRIVE IN.png", desc: "Sem corredores, os produtos são armazenados em profundidade, possibilitando alta taxa de ocupação e volume de armazenagem." }, { name: "Dinâmico", img: "uploads/soluções/DINAMICO.png", desc: "As mercadorias são abastecidas de um lado e retiradas do outro, garantindo que o primeiro palete armazenado seja o primeiro a sair." }, { name: "Push Back", img: "uploads/soluções/PUSH BACK.png", desc: "Permite alta densidade em armazenagem e ótimo aproveitamento em volume de cargas armazenadas." }, { name: "Cantilever", img: "uploads/soluções/CANTILEVER.png", desc: "Sistema com armazenagem versátil, possibilita o armazenamento de diversos tipos e dimensões de mercadorias." }, { name: "Carro Satélite", img: "uploads/soluções/sistema para carro satelite.png", desc: "Carga e descarga realizada de forma semiautomática, por empilhadeiras convencionais ou automatizadas." }, { name: "Flow Rack", img: "uploads/soluções/FLOW RACK.png", desc: "Aumento de produtividade e precisão na separação de pedidos e organização da montagem de pedidos fracionados." }, { name: "Mezanino", img: "uploads/soluções/MEZANINO.png", desc: "Sistema multifuncional, ideal para criar escritórios ou estoque. Também pode aumentar a área útil para ampliar a operação." }, ]; function ProductCard({ p, i }) { return (

{p.name}

{p.desc}

Saiba mais
); } function Products() { return (
SOLUÇÕES E SISTEMAS
Conheça nossos

Produtos.

{PRODUCTS.map((p, i) => )}
); } /* ---------- COUNTER (animated on scroll-into-view) ---------- */ function Counter({ to, duration = 2000, prefix = '', suffix = '' }) { const [val, setVal] = useState(0); const [started, setStarted] = useState(false); const ref = useRef(null); useEffect(() => { const obs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting && !started) { setStarted(true); const start = performance.now(); const tick = (now) => { const p = Math.min(1, (now - start) / duration); const eased = 1 - Math.pow(1 - p, 3); setVal(Math.round(to * eased)); if (p < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); } }); }, { threshold: 0.3 }); if (ref.current) obs.observe(ref.current); return () => obs.disconnect(); }, [to, duration, started]); return ( {prefix}{val.toLocaleString('pt-BR')}{suffix} ); } /* ---------- EXCELLENCE ---------- */ function StatBlock({ to, prefix, suffix, label }) { return (
{label}
); } function Excellence() { return (
Stock

Excelência em
armazenagem

Com anos de experiência, a Stock projeta e implementa soluções inovadoras em movimentação e armazenagem, utilizando materiais de alta resistência e tecnologia de ponta.

Saiba mais
Especialista Stock
); } /* ---------- VIDEO BLOCK ---------- */ function VideoBlock() { const [playing, setPlaying] = useState(false); return (
{playing ? ( ) : ( )}

A Stock desenvolve, projeta, produz e implementa.

Armazenagem e construtivos

Soluções em movimentação e armazenagem com estruturas de aço de alta resistência mecânica, projetadas sob medida para maximizar capacidade, otimizar fluxo logístico e reduzir custos operacionais. Mais de 200 clientes em todo o Brasil confiam na nossa engenharia.

Saiba mais
); } /* ---------- CTA BLUE ---------- */ function CtaBlue() { return (
Consultores Stock

Transforme seu
estoque com
nossas soluções

Descubra como nossas estruturas podem revolucionar sua logística.

Faça um orçamento
); } /* ---------- CONTACT ---------- */ function Contact() { const [sent, setSent] = useState(false); const onSubmit = (e) => { e.preventDefault(); setSent(true); setTimeout(() => setSent(false), 3000); }; return (
Entre em contato

Fale com nossos consultores

Solicite seu orçamento ou tire suas dúvidas. Nosso time responde rápido, geralmente no mesmo dia.

); } /* ---------- CLIENTS ---------- */ const REVIEWS = [ { name: "Brivaldo Moura", when: "4 meses atrás", initial: "B", color: "#5B6470", text: "Atendimento com excelência! As estruturas são muito bem acabadas na qual supriu nossa necessidade de armazenagem com total segurança." }, { name: "Leila Rendall", when: "4 meses atrás", initial: "L", color: "#2A73E8", text: "Excelente experiência do início ao fim! O atendimento foi ágil e muito profissional, o projeto foi desenvolvido exatamente como precisávamos." }, { name: "João Pedro", when: "4 meses atrás", initial: "J", color: "#1F9E52", text: "Sem palavras para o atendimento! Entrega dentro do prazo, suporte rápido, as estruturas são de altíssima qualidade. Recomendo demais." }, { name: "Ana Carolina", when: "5 meses atrás", initial: "A", color: "#C4392B", text: "Equipe extremamente atenciosa e comprometida. Do projeto à instalação, tudo impecável. Nosso armazém ficou muito mais organizado." }, { name: "Marcos Vinícius", when: "6 meses atrás", initial: "M", color: "#8E44AD", text: "Profissionais competentes e produto de primeira linha. A montagem foi rápida e sem transtornos. Superou nossas expectativas." }, { name: "Fernanda Lima", when: "7 meses atrás", initial: "F", color: "#E67E22", text: "Melhor decisão que tomamos para nossa logística. Estruturas robustas, prazo cumprido e um pós-venda excelente. Nota 10!" }, ]; function GoogleG({ size = 22 }) { return ( ); } function Stars() { return (
{[0,1,2,3,4].map(i => ( ))}
); } function ReviewCard({ r }) { return (
{r.initial}
{r.name}
{r.when}

{r.text}

Leia mais
); } function Clients() { const [start, setStart] = useState(0); const perView = 3; const maxStart = Math.max(0, REVIEWS.length - perView); const go = (dir) => setStart(s => Math.min(maxStart, Math.max(0, s + dir))); return (

Temos orgulho de atender a uma ampla gama de
clientes em todo o país

EXCELENTE
{[0,1,2,3,4].map(i => ( ))}
Com base em 17 avaliações
Google
{REVIEWS.map((r, i) => (
))}
); } /* ---------- LOGOS MARQUEE ---------- */ const LOGOS = Array.from({ length: 27 }, (_, i) => `assets/logos/${String(i + 1).padStart(2, '0')}.webp`); function LogoMarquee() { const rowA = LOGOS.slice(0, 14); const rowB = LOGOS.slice(14); return (
{[...rowA, ...rowA].map((src, i) => (
))}
{[...rowB, ...rowB].map((src, i) => (
))}
Mais de 200 parceiros espalhados pelo Brasil
); } const IG_URL = "https://www.instagram.com/stock.armazenagem/"; /* ==================================================================== FEED AUTOMÁTICO DO INSTAGRAM (modo seguro, proxy PHP) -------------------------------------------------------------------- O token NÃO fica aqui no front-end. Ele mora no arquivo instagram-feed.php, no servidor (Hostinger), que executa server-side e nunca é baixado pelo navegador. Este site apenas chama esse PHP, que devolve os posts já prontos (sem expor o token). >> Para ativar (uma vez): << 1. Faça upload do arquivo instagram-feed.php junto do site na Hostinger. 2. Abra instagram-feed.php e cole o token na linha $IG_TOKEN = '...'; 3. Pronto. O feed passa a puxar os 3 posts mais recentes sozinho. Enquanto o PHP não estiver no ar (ex.: preview local), o feed mostra as imagens estáticas de fallback (GALLERY), o site nunca quebra. ==================================================================== */ const IG_FEED_ENDPOINT = "instagram-feed.php"; const GALLERY = [ { img: "assets/produtos/porta-pallet.webp", caption: "Estrutura bem planejada é lucro no curto prazo." }, { img: "assets/produtos/drive-in.webp", caption: "Seu estoque resolve, ou esconde problemas?" }, { img: "assets/produtos/cantilever.webp", caption: "Organizar é o primeiro passo." }, { img: "assets/produtos/flow-rack.webp", caption: "Stock 360°: estratégia e conexão." }, { img: "assets/produtos/mezanino.webp", caption: "Alguns sinais são claros: hora de mudar." }, { img: "assets/produtos/push-back.webp", caption: "Armazenar não é o suficiente." }, ]; function Gallery() { const [posts, setPosts] = useState(null); useEffect(() => { fetch(IG_FEED_ENDPOINT) .then(r => r.ok ? r.json() : Promise.reject()) .then(data => { if (data && data.data && data.data.length) { setPosts(data.data.map(p => ({ img: p.media_type === 'VIDEO' ? (p.thumbnail_url || p.media_url) : p.media_url, caption: (p.caption || '').split('\n')[0].slice(0, 90), link: p.permalink, video: p.media_type === 'VIDEO', }))); } }) .catch(() => {}); }, []); const items = posts || GALLERY.slice(0, 3).map(g => ({ ...g, link: IG_URL, video: false })); return (
@stock.armazenagem Segue a gente no Instagram
{items.map((g, i) => ( {g.video && }
{g.caption}
))}
); } /* ---------- NEWS ---------- */ const NEWS = [ { date: "20 fev 2026", img: "assets/blog/estantes.webp", title: "Sistema de estantes: principais tipos e como escolher a melhor solução" }, { date: "20 fev 2026", img: "assets/blog/estoque.webp", title: "A redução de estoque, o inimigo silencioso do armazém" }, { date: "20 fev 2026", img: "assets/blog/sop.webp", title: "O que é o S&OP e qual seu impacto na logística" }, ]; function News() { return (
Últimas Notícias

Fique por Dentro das Novidades em Armazenagem

Acesse nossos artigos e mantenha-se atualizado sobre as melhores práticas e inovações do setor.

Ver mais
{NEWS.map((n, i) => ( ))}
); } /* ---------- MAP ---------- */ function MapSection() { return (
); } /* ---------- CTA ORANGE ---------- */ function CtaOrange() { return (

Transforme seu galpão em uma
operação de alta performance.

Do projeto ao fornecimento, soluções estruturais para cada tipo de operação.

Fale com um consultor
); } /* ---------- FOOTER ---------- */ function Footer() { return ( ); } /* ---------- REVEAL ON SCROLL HOOK ---------- */ function useScrollReveal() { useEffect(() => { const obs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('in'); obs.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: '0px 0px -60px 0px' }); document.querySelectorAll('.reveal').forEach(el => obs.observe(el)); return () => obs.disconnect(); }, []); } /* ---------- APP ---------- */ function App() { useScrollReveal(); return ( <>