/* Interactive & supplementary components for Palmilha Inteligente */ /* eslint-disable react/no-unescaped-entities */ const { useState: useStateI, useEffect: useEffectI, useRef: useRefI } = React; // ============================================================ // 1. Stats counter strip (animated on enter) // ============================================================ function StatsStrip() { const stats = [ { value: 14000, prefix: '+', suffix: '', label: 'Atendimentos realizados' }, { value: 4.8, prefix: '', suffix: '★', label: 'Avaliação no Google', decimals: 1 }, { value: 98, prefix: '', suffix: '%', label: 'Satisfação dos pacientes' }, { value: 34, prefix: '', suffix: ' anos', label: 'De experiência clínica' }, ]; const [vis, setVis] = useStateI(false); const ref = useRefI(null); useEffectI(() => { const io = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) { setVis(true); io.disconnect(); } }); }, { threshold: 0.3 }); if (ref.current) io.observe(ref.current); return () => io.disconnect(); }, []); return (
{stats.map((s, i) => ( ))}
); } function Counter({ value, prefix = '', suffix = '', label, decimals = 0, active }) { const [n, setN] = useStateI(0); useEffectI(() => { if (!active) return; const dur = 1400; const start = performance.now(); let raf; const tick = (t) => { const k = Math.min(1, (t - start) / dur); const eased = 1 - Math.pow(1 - k, 3); setN(value * eased); if (k < 1) raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, [active, value]); const formatted = decimals ? n.toFixed(decimals) : Math.round(n).toLocaleString('pt-BR'); return (
{prefix}{formatted}{suffix}
{label}
); } // ============================================================ // 2. Body chain (foot → knees → spine ripple) // ============================================================ const BODY_ZONES = [ { id: 'feet', label: 'Pés', y: 1500, desc: 'Tudo nasce aqui. Quando a pisada é desalinhada, o peso se concentra em pontos errados da sola — calcanhar, antepé ou borda lateral. Esse excesso de pressão gera dor local, calosidades e abre caminho para problemas como fascite plantar e esporão de calcâneo.', sol: 'Feita sob medida para o seu pé, a palmilha redistribui a pressão por toda a superfície plantar — aliviando os pontos sobrecarregados e devolvendo apoio onde o pé mais precisa.' }, { id: 'knees', label: 'Joelhos', y: 1120, desc: 'O joelho é a primeira articulação a pagar a conta. Uma pisada que gira para dentro ou para fora muda o ângulo de impacto a cada passo, sobrecarregando cartilagem e ligamentos. Com o tempo, isso se traduz em tensão, estalos e dor ao subir escadas ou caminhar mais.', sol: 'Ao corrigir a base do apoio, a palmilha melhora o alinhamento da perna e reduz o impacto que chega ao joelho — diminuindo a tensão sobre cartilagem e ligamentos a cada passo.' }, { id: 'hips', label: 'Quadril', y: 830, desc: 'Para compensar o desequilíbrio que sobe dos pés e joelhos, o quadril se ajusta e trabalha de forma assimétrica. Um lado passa a fazer mais força que o outro, gerando rigidez, desconforto ao sentar ou levantar e uma sensação de cansaço na lateral da bacia.', sol: 'Com os pés bem apoiados e simétricos, o quadril para de compensar e volta a trabalhar de forma equilibrada — reduzindo a sobrecarga de um lado e a sensação de rigidez na bacia.' }, { id: 'lumbar',label: 'Lombar', y: 710, desc: 'A região lombar absorve todo o esforço extra que se acumula na cadeia. Sem uma base estável nos pés, a curvatura natural da coluna se altera e os músculos ficam em tensão constante — uma das causas mais comuns de dor nas costas no fim do dia.', sol: 'Uma base estável nos pés ajuda a coluna a manter sua curvatura natural — aliviando a tensão muscular acumulada na lombar e a dor que costuma aparecer no fim do dia.' }, { id: 'back', label: 'Coluna', y: 500, desc: 'No topo da cadeia, a postura inteira se reorganiza para equilibrar tudo o que veio de baixo. Ombros tensos, coluna desalinhada e fadiga muscular generalizada são o reflexo final de um problema que, na maioria das vezes, começou lá embaixo: na pisada.', sol: 'Ao tratar a origem do desequilíbrio na pisada, a palmilha favorece uma postura mais alinhada de baixo para cima — aliviando a tensão nos ombros e a fadiga muscular generalizada.' }, ]; function BodyChain() { const [active, setActive] = useStateI('feet'); const z = BODY_ZONES.find((b) => b.id === active); return (
Tudo começa na pisada} lede="Uma pisada desalinhada gera reflexos que sobem por toda a cadeia muscular. Toque em cada região para entender o impacto." />
{/* Body silhouette */}
Corpo humano — cadeia do movimento {/* Animated chain — pulsing waves going up from active zone */} {[0, 1, 2, 3].map((i) => ( ))} {/* Active zone hot dot */} {/* Pin markers for each zone */} {BODY_ZONES.map((b) => ( setActive(b.id)}> {BODY_ZONES.indexOf(b) + 1} ))}
{/* Zone selector + description */}
{BODY_ZONES.map((b, i) => ( ))}
{z.label}

{z.desc}

{z.sol}

); } // ============================================================ // 3. Before / After pressure toggle // ============================================================ function BeforeAfter() { const [after, setAfter] = useStateI(false); // Two heatmap configurations const before = [ { x: 530, y: 1190, rx: 190, ry: 160, c: '#D73045', o: 0.8 }, { x: 435, y: 380, rx: 140, ry: 120, c: '#D73045', o: 0.75 }, { x: 650, y: 440, rx: 100, ry: 90, c: '#FFB347', o: 0.6 }, ]; const afterMap = [ { x: 530, y: 1190, rx: 175, ry: 145, c: '#1EC7E6', o: 0.55 }, { x: 435, y: 390, rx: 120, ry: 100, c: '#1EC7E6', o: 0.5 }, { x: 650, y: 440, rx: 100, ry: 90, c: '#1EC7E6', o: 0.5 }, { x: 430, y: 820, rx: 115, ry: 165, c: '#1EC7E6', o: 0.45 }, { x: 650, y: 780, rx: 105, ry: 145, c: '#1EC7E6', o: 0.45 }, ]; const data = after ? afterMap : before; return (
Veja a diferença antes e depois} lede="Sem apoio adequado, a pressão se concentra em poucos pontos. Com a Palmilha Inteligente, o peso passa a se distribuir de forma mais equilibrada." />
{after ? 'COM PALMILHA' : 'SEM PALMILHA'} {after ? 'Distribuído' : 'Concentrado'}
{/* Toggle */}
{[ { k: false, label: 'Sem palmilha' }, { k: true, label: 'Com palmilha' }, ].map((opt) => ( ))}
Sem palmilha
  • Sobrecarga concentrada no calcâneo e antepé
  • Fadiga muscular em jornadas longas
  • Pouco apoio na região do arco
Com Palmilha Inteligente
  • Pressão distribuída em toda a superfície
  • Apoio anatômico na região do arco
  • Mais conforto e menos fadiga ao longo do dia
); } // ============================================================ // 4. Exploded layers (camadas técnicas) // ============================================================ function ExplodedLayers() { const layers = [ { id: 'top', title: 'Tecido superior', desc: 'Toque macio, anti-atrito e respirável.', color: '#E6FAFE', stroke: '#1EC7E6' }, { id: 'eva', title: 'EVA de conforto', desc: 'Camada de amortecimento progressivo.', color: '#F0FAFC', stroke: '#7EE2F2' }, { id: 'arch', title: 'Suporte anatômico', desc: 'Modelado para sustentar o arco plantar.', color: '#DDF4FA', stroke: '#49D7EE' }, { id: 'base', title: 'Base estrutural', desc: 'Estabilidade e durabilidade para o uso diário.', color: '#0A5B7E', stroke: '#062F44' }, ]; const [hover, setHover] = useStateI(null); return (
Camadas pensadas para o seu conforto} lede="Cada camada cumpre uma função específica — combinadas, formam uma palmilha completa, anatômica e durável." />
{/* Stack visual */}
{/* Exploded stack viewed at slight isometric */} {layers.map((l, i) => ( ))} {/* Connect dashed lines between layers (axis) */} {layers.map((l, i) => { const baseY = 80 + i * 90; const isHover = hover === l.id; const offsetY = isHover ? -8 : 0; const offsetX = isHover ? 12 : 0; // skew transform for isometric feel return ( setHover(l.id)} onMouseLeave={() => setHover(null)} > {/* shadow */} ); })} {/* Layer label pills */}
{layers.map((l, i) => { const top = 60 + i * 22; // percentage scale return (
setHover(l.id)} onMouseLeave={() => setHover(null)} >
0{i+1} {l.title}
); })}
{/* Layer list */}
{layers.map((l, i) => (
setHover(l.id)} onMouseLeave={() => setHover(null)} className={`p-5 rounded-2xl border transition-all cursor-pointer ${ hover === l.id ? 'bg-white border-petrol shadow-card -translate-y-0.5' : 'bg-white/60 border-ink-100' }`} >
0{i+1}
{l.title}
{l.desc}
))}
); } // ============================================================ // 5. Comparison table // ============================================================ function Comparison() { const rows = [ ['Distribuição de pressão', 'limited', 'partial', 'full'], ['Suporte anatômico do arco', 'none', 'partial', 'full'], ['Personalização ao seu pé', 'none', 'none', 'full'], ['Materiais técnicos', 'none', 'partial', 'full'], ['Acompanhamento profissional','none', 'none', 'full'], ['Conforto prolongado', 'limited', 'partial', 'full'], ]; const headers = [ { label: 'Sem palmilha', sub: 'Calçado padrão', tone: 'muted' }, { label: 'Palmilha de prateleira', sub: 'Tamanho único', tone: 'muted' }, { label: 'Palmilha Inteligente', sub: 'Sob medida + acompanhamento', tone: 'feature' }, ]; const sym = { none: { icon: 'x', cls: 'bg-ink-100 text-ink-400' }, limited: { icon: 'x', cls: 'bg-accent-50 text-accent' }, partial: { icon: 'check', cls: 'bg-turq-100 text-petrol opacity-60' }, full: { icon: 'check', cls: 'bg-grad-turq text-white' }, }; return (
Por que a Palmilha Inteligente
é diferente} lede="Personalização, materiais técnicos e acompanhamento profissional fazem a diferença na rotina e no resultado." />
{/* Top-left empty */}
{headers.map((h, i) => (
{h.label}
{h.sub}
))} {rows.map(([label, ...cells], rIdx) => (
{label}
{cells.map((c, cIdx) => { const s = sym[c]; const isFeature = cIdx === 2; return (
); })}
))}
); } // ============================================================ // 6. Calculator (tempo em pé) // ============================================================ function Calculator() { const [hours, setHours] = useStateI(8); // crude estimates for storytelling const stepsPerHour = 900; const steps = Math.round(hours * stepsPerHour); const loadKg = (hours * 18).toFixed(0); // tons of accumulated impact const fatigue = Math.min(100, Math.round(hours * 7)); const tier = hours < 4 ? 'leve' : hours < 8 ? 'moderada' : 'intensa'; const tierColor = hours < 4 ? '#1EC7E6' : hours < 8 ? '#FFB347' : '#D73045'; return (
Quanta carga seus pés absorvem por dia?} lede="Mova o controle para ver uma estimativa do impacto acumulado. Quanto mais tempo em pé, mais sua pisada precisa de apoio." />
Tempo em pé / caminhando {hours}h por dia
setHours(Number(e.target.value))} className="w-full h-2 bg-ink-100 rounded-full appearance-none cursor-pointer accent-petrol" style={{ background: `linear-gradient(to right, ${tierColor} 0%, ${tierColor} ${(hours/14)*100}%, #EEF1F4 ${(hours/14)*100}%, #EEF1F4 100%)` }} />
0h4h8h14h
Passos/dia
{steps.toLocaleString('pt-BR')}
Impacto acum.
{loadKg} ton·passo
Carga
{tier}
Nível de fadiga estimada {fatigue}%
Sua pisada precisa de apoio

Aproximadamente {loadKg} toneladas-passo passam pelos seus pés por dia.

Uma palmilha sob medida pode ajudar a distribuir essa carga e reduzir desconfortos acumulados.

); } // ============================================================ // 7. Quiz diagnóstico // ============================================================ const QUIZ = [ { q: 'Onde você sente desconforto com mais frequência?', key: 'dor', options: [ { v: 'pes', label: 'Nos pés', icon: 'foot' }, { v: 'joelhos', label: 'Nos joelhos', icon: 'knee' }, { v: 'lombar', label: 'Na lombar/coluna', icon: 'spine' }, { v: 'nenhuma', label: 'Sem dor, busco prevenção', icon: 'shield' }, ], }, { q: 'Quanto tempo você passa em pé ou caminhando por dia?', key: 'tempo', options: [ { v: 'pouco', label: 'Menos de 2 horas', icon: 'clock' }, { v: 'medio', label: 'Entre 2 e 6 horas', icon: 'clock' }, { v: 'muito', label: 'Mais de 6 horas', icon: 'clock' }, ], }, { q: 'Você pratica atividade física com frequência?', key: 'atividade', options: [ { v: 'nao', label: 'Não pratico', icon: 'heart' }, { v: 'leve', label: 'Caminhadas leves', icon: 'walk' }, { v: 'forte', label: 'Esporte ou treino regular', icon: 'activity' }, ], }, { q: 'Qual sua faixa etária?', key: 'idade', options: [ { v: '18-34', label: '18–34 anos', icon: 'sparkle' }, { v: '35-54', label: '35–54 anos', icon: 'sparkle' }, { v: '55+', label: '55 anos ou mais', icon: 'sparkle' }, ], }, ]; function Quiz() { const [step, setStep] = useStateI(0); const [answers, setAnswers] = useStateI({}); const total = QUIZ.length; const done = step >= total; const current = QUIZ[step]; const select = (v) => { const next = { ...answers, [current.key]: v }; setAnswers(next); setTimeout(() => setStep(step + 1), 250); }; const reset = () => { setAnswers({}); setStep(0); }; // Build whatsapp message const labelFor = (key, v) => { const q = QUIZ.find(qq => qq.key === key); return q.options.find(o => o.v === v)?.label || v; }; const summary = Object.entries(answers).map(([k, v]) => { const qLabel = { dor: 'Desconforto', tempo: 'Tempo em pé', atividade: 'Atividade física', idade: 'Faixa etária' }[k]; return `${qLabel}: ${labelFor(k, v)}`; }).join(' | '); const message = encodeURIComponent(`Olá! Fiz o diagnóstico no site. Quero agendar uma avaliação.\n\nMeu perfil: ${summary}`); const whatsapp = `${WHATSAPP_URL.split('?')[0]}?text=${message}`; // Recommendation logic const rec = (() => { const { dor, tempo, atividade } = answers; if (dor === 'lombar' || dor === 'joelhos') return { tag: 'Cadeia muscular', title: 'Recomendamos uma avaliação completa da pisada', desc: 'Como o desconforto reflete em joelhos ou coluna, é importante entender a base — sua pisada — para um apoio personalizado.' }; if (tempo === 'muito') return { tag: 'Jornadas longas', title: 'Apoio reforçado para o seu dia', desc: 'Quem fica mais de 6h em pé costuma se beneficiar bastante de um apoio anatômico bem ajustado.' }; if (atividade === 'forte') return { tag: 'Performance', title: 'Apoio com foco em movimento', desc: 'Para a prática de esportes, uma palmilha personalizada pode auxiliar no conforto e na estabilidade.' }; if (dor === 'nenhuma') return { tag: 'Prevenção', title: 'Ótimo momento para um diagnóstico preventivo', desc: 'Manter uma pisada bem apoiada ajuda a prevenir desconfortos futuros e mantém a qualidade do seu movimento.' }; return { tag: 'Conforto diário', title: 'Vamos te indicar a melhor solução', desc: 'Com uma avaliação personalizada, indicamos a palmilha ideal para o seu perfil.' }; })(); return (
Descubra a palmilha ideal
para o seu perfil} lede="Responda 4 perguntas curtas. Em menos de 1 minuto, te indicamos um próximo passo personalizado." tone="dark" />
{/* Progress */}
{QUIZ.map((_, i) => (
))}
{!done && (
Pergunta {step + 1} de {total}

{current.q}

{current.options.map((o) => { const sel = answers[current.key] === o.v; return ( ); })}
Suas respostas são confidenciais
)} {done && (
{rec.tag}

{rec.title}

{rec.desc}

Seu perfil
{Object.entries(answers).map(([k, v]) => (
{labelFor(k, v)}
))}
)}
); } // ============================================================ // 8. Gallery (image-slot grid) // ============================================================ function Gallery() { const slots = [ { id: 'gal-1', label: 'Atendimento na clínica', shape: 'rounded' }, { id: 'gal-2', label: 'Análise da pisada', shape: 'rounded' }, { id: 'gal-3', label: 'Palmilha pronta', shape: 'rounded' }, { id: 'gal-4', label: 'Equipe', shape: 'rounded' }, { id: 'gal-5', label: 'Espaço da clínica', shape: 'rounded' }, { id: 'gal-6', label: 'Resultado do paciente', shape: 'rounded' }, ]; return (
Nosso dia a dia em imagens} lede="Atendimento humanizado, ambiente acolhedor e tecnologia a serviço do seu conforto." />
{slots.map((s, i) => (
))}
); } // ============================================================ // 9. Sticky mobile CTA bar // ============================================================ function StickyMobileBar() { const [show, setShow] = useStateI(false); useEffectI(() => { const onScroll = () => setShow(window.scrollY > 500); onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); return (
Ligar WhatsApp
); } Object.assign(window, { StatsStrip, BodyChain, BeforeAfter, ExplodedLayers, Comparison, Calculator, Quiz, Gallery, StickyMobileBar });