feat(footer, header, landing): enhance UI components and improve navigation

- Updated Footer component with new links and dynamic year display.
- Refactored Header component to improve mobile navigation and theme toggling.
- Enhanced DonationSection and Features components with improved layout and animations.
- Updated HowItWorks and Impact sections for better user engagement and clarity.
- Improved product page layout and error handling in API interactions.
- General UI refinements across various components for a cohesive user experience.
This commit is contained in:
Evandro Fonseca Junior committed 2026-01-12 19:55:50 -03:00
1 parent b0f95704e1
commit f98c648311
21 files changed
+3335 -12057

No files matched your search

+92 -139
View File
@@ -1,160 +1,113 @@
"use client";
import { ArrowRight, Heart, Users, Globe } from "lucide-react";
import React from "react";
import { motion } from "framer-motion";
import { ArrowRight, Code2, Heart, Globe, Database, ShieldCheck } from "lucide-react";
import { Button } from "@/components/ui/button";
import Link from "next/link";
export function CTASection() {
return (
<section className="py-20 bg-gradient-to-br from-blue-600 via-purple-600 to-green-600 relative overflow-hidden">
{/* Background Pattern */}
<div className="absolute inset-0 bg-[url('data:image/svg+xml,%3Csvg%20width%3D%2260%22%20height%3D%2260%22%20viewBox%3D%220%200%2060%2060%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Cg%20fill%3D%22%23ffffff%22%20fill-opacity%3D%220.1%22%3E%3Ccircle%20cx%3D%2230%22%20cy%3D%2230%22%20r%3D%222%22/%3E%3C/g%3E%3C/g%3E%3C/svg%3E')] opacity-40"></div>
<section className="relative py-32 bg-[#030712] overflow-hidden transition-colors duration-500">
{/* 1. LAYER DE INFRAESTRUTURA: Background Glows Inteligentes */}
<div className="absolute inset-0 pointer-events-none">
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[500px] bg-blue-600/10 blur-[160px] rounded-full" />
<div className="absolute top-0 right-0 w-[400px] h-[400px] bg-emerald-500/5 blur-[120px] rounded-full" />
<div className="absolute inset-0 bg-[url('data:image/svg+xml,...')] opacity-[0.03] invert dark:invert-0" />
</div>
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
{/* Main CTA */}
<div className="mb-16">
<h2 className="text-4xl sm:text-5xl lg:text-6xl font-bold text-white mb-6">
Mais que uma ferramenta,
<br />
<span className="bg-gradient-to-r from-yellow-300 to-orange-300 bg-clip-text text-transparent">
um movimento
<div className="relative z-10 max-w-5xl mx-auto px-6 text-center">
{/* 2. LAYER DE CONTEXTO: Tag de Sistema */}
<motion.div
initial={{ opacity: 0, y: 10 }}
whileInView={{ opacity: 1, y: 0 }}
className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-500/5 border border-blue-500/20 text-blue-400 text-[10px] font-black uppercase tracking-[0.3em] mb-8"
>
<Database size={12} /> Open Access Protocol
</motion.div>
{/* 3. LAYER DE MENSAGEM: Headlines de Alta Densidade */}
<div className="mb-12">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
className="text-5xl md:text-7xl font-black text-white mb-8 tracking-tighter leading-[0.9]"
>
Soberania alimentar via <br />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-blue-400 via-cyan-300 to-emerald-400">
transparência algorítmica.
</span>
<br />
por transparência
</h2>
<p className="text-xl text-blue-100 max-w-3xl mx-auto mb-12 leading-relaxed">
Junte-se a milhares de pessoas que já transformaram a forma como
escolhem seus alimentos. Sua jornada por uma alimentação mais
consciente começa agora.
</motion.h2>
<p className="text-lg md:text-xl text-slate-400 max-w-3xl mx-auto leading-relaxed font-medium">
Junte-se à infraestrutura global que está devolvendo o poder de escolha ao cidadão. Dados abertos para uma vida sem processados ocultos.
</p>
{/* CTA Buttons */}
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center mb-16">
<Link href="/">
<Button
size="lg"
className="bg-white text-blue-600 hover:bg-blue-50 hover:text-blue-700 transition-all duration-300 shadow-lg hover:shadow-xl transform hover:-translate-y-1"
>
<span className="mr-2">Comece Agora</span>
<ArrowRight className="w-5 h-5" />
</Button>
</Link>
<Link
href="https://github.com/evandrodevbr/lista-compras"
target="_blank"
rel="noopener noreferrer"
>
<Button
variant="outline"
size="lg"
className="border-white text-white hover:bg-white hover:text-blue-600 transition-all duration-300"
>
<span className="mr-2">Contribua</span>
<Heart className="w-5 h-5" />
</Button>
</Link>
</div>
</div>
{/* Community Stats */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 mb-16">
<div className="bg-white/10 backdrop-blur-sm rounded-2xl p-6">
<div className="w-12 h-12 bg-white/20 rounded-lg flex items-center justify-center mx-auto mb-4">
<Users className="w-6 h-6 text-white" />
</div>
<div className="text-3xl font-bold text-white mb-2">Milhares</div>
<p className="text-blue-100">
de usuários ativos fazendo escolhas mais conscientes
</p>
</div>
{/* 4. LAYER DE EXECUÇÃO: CTAs de Alta Tração */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: 0.2 }}
className="flex flex-col sm:flex-row gap-4 justify-center items-center mb-24"
>
<Link href="/" className="w-full sm:w-auto">
<Button
size="lg"
className="w-full sm:w-auto h-16 px-10 bg-blue-600 hover:bg-blue-700 text-white rounded-2xl font-bold text-lg shadow-2xl shadow-blue-500/20 transition-all hover:scale-[1.02] active:scale-95 group"
>
<span>Executar Scan</span>
<ArrowRight className="ml-2 w-5 h-5 group-hover:translate-x-1 transition-transform" />
</Button>
</Link>
<div className="bg-white/10 backdrop-blur-sm rounded-2xl p-6">
<div className="w-12 h-12 bg-white/20 rounded-lg flex items-center justify-center mx-auto mb-4">
<Globe className="w-6 h-6 text-white" />
</div>
<div className="text-3xl font-bold text-white mb-2">Global</div>
<p className="text-blue-100">
comunidade internacional comprometida com transparência
</p>
</div>
<Link
href="https://github.com/evandrodevbr/lista-compras"
target="_blank"
className="w-full sm:w-auto"
>
<Button
variant="outline"
size="lg"
className="w-full sm:w-auto h-16 px-10 border-slate-800 text-white hover:bg-slate-900 rounded-2xl font-bold text-lg transition-all"
>
<Code2 className="mr-2 w-5 h-5 text-black" />
<span className="text-gray-800">Audit Code</span>
</Button>
</Link>
</motion.div>
<div className="bg-white/10 backdrop-blur-sm rounded-2xl p-6">
<div className="w-12 h-12 bg-white/20 rounded-lg flex items-center justify-center mx-auto mb-4">
<Heart className="w-6 h-6 text-white" />
{/* 5. LAYER DE VALIDAÇÃO: Bento Grid de Metadados */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
{[
{ icon: Globe, label: "Rede", val: "Global Node", desc: "Integridade em 100+ países" },
{ icon: ShieldCheck, label: "Segurança", val: "Privacy First", desc: "Zero tracking de dados" },
{ icon: Heart, label: "Sustentabilidade", val: "Open Source", desc: "Mantido pela comunidade" },
].map((item, i) => (
<div key={i} className="p-6 rounded-3xl bg-white/[0.02] border border-white/[0.05] backdrop-blur-sm text-left group hover:bg-white/[0.04] transition-colors">
<item.icon className="w-6 h-6 text-blue-500 mb-4" />
<div className="text-[10px] font-black uppercase tracking-widest text-slate-500 mb-1">{item.label}</div>
<div className="text-white font-bold text-lg mb-1 tracking-tight">{item.val}</div>
<p className="text-xs text-slate-500 leading-relaxed">{item.desc}</p>
</div>
<div className="text-3xl font-bold text-white mb-2">Crescendo</div>
<p className="text-blue-100">
movimento que não para de expandir e impactar vidas
</p>
</div>
))}
</div>
{/* Final Message */}
<div className="bg-white/10 backdrop-blur-sm rounded-3xl p-8 max-w-4xl mx-auto">
<blockquote className="text-2xl sm:text-3xl font-medium text-white italic mb-6">
&ldquo;Porque alimentação é mais que nutrição. É autocuidado, é
conexão, é vida.&rdquo;
</blockquote>
<cite className="block text-lg text-blue-100 mb-8">
— Filosofia NutriScan
</cite>
<div className="text-center">
<p className="text-lg text-blue-100 mb-6">
Faça parte dessa transformação. Sua próxima escolha alimentar pode
ser a mais consciente de todas.
</p>
<div className="inline-flex items-center gap-2 text-white/80">
<span>Comece sua jornada hoje</span>
<ArrowRight className="w-5 h-5" />
</div>
</div>
</div>
{/* Social Links */}
<div className="mt-16">
<p className="text-blue-100 mb-6">Conecte-se conosco</p>
<div className="flex justify-center gap-6">
<Link
href="https://github.com/evandrodevbr/lista-compras"
target="_blank"
rel="noopener noreferrer"
className="w-12 h-12 bg-white/20 rounded-full flex items-center justify-center hover:bg-white/30 transition-colors"
>
<svg
className="w-6 h-6 text-white"
fill="currentColor"
viewBox="0 0 24 24"
>
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
</svg>
</Link>
<Link
href="https://evandro.dev.br"
target="_blank"
rel="noopener noreferrer"
className="w-12 h-12 bg-white/20 rounded-full flex items-center justify-center hover:bg-white/30 transition-colors"
>
<svg
className="w-6 h-6 text-white"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9v-9m0-9v9"
/>
</svg>
</Link>
</div>
{/* 6. MENSAGEM FINAL: Minimalismo de Autoridade */}
<div className="mt-24 pt-12 border-t border-white/[0.05]">
<p className="text-[10px] font-mono font-bold text-slate-600 uppercase tracking-[0.5em] mb-6">
NutriScan Governance Protocol v2.0
</p>
<Link
href="/sobre"
className="inline-flex items-center gap-2 text-sm font-bold text-blue-500 hover:text-blue-400 transition-colors group"
>
Conheça nossa arquitetura de dados
<ArrowRight size={14} className="group-hover:translate-x-1 transition-transform" />
</Link>
</div>
</div>
</section>
);
}
}
+113 -204
View File
@@ -1,225 +1,134 @@
"use client";
import { Scan, Search, CheckCircle, ArrowRight } from "lucide-react";
import React from "react";
import { motion } from "framer-motion";
import { Scan, Search, CheckCircle, Zap, Shield, Globe, Clock } from "lucide-react";
import { cn } from "@/lib/utils";
// Tipagem para escalabilidade
interface Step {
id: number;
title: string;
description: string;
icon: React.ElementType;
color: string;
features: string[];
}
const STEPS: Step[] = [
{
id: 1,
title: "Captura de Dados",
description: "Input instantâneo via scanner óptico ou entrada manual de protocolo.",
icon: Scan,
color: "from-blue-500 to-cyan-400",
features: ["OCR de alta precisão", "Busca por SKU/EAN", "Detecção automática"],
},
{
id: 2,
title: "Análise de Base",
description: "Cruzamento com o dataset global Open Food Facts em milissegundos.",
icon: Search,
color: "from-green-500 to-emerald-400",
features: ["Nutri-Score v2.0", "Grau NOVA", "Alertas de Alérgenos"],
},
{
id: 3,
title: "Veredito Técnico",
description: "Saída de dados interpretada para uma tomada de decisão consciente.",
icon: CheckCircle,
color: "from-purple-500 to-pink-500",
features: ["Sugestões saudáveis", "Histórico local", "Comparativo de ROI nutricional"],
},
];
export function HowItWorksSection() {
return (
<section className="py-20 bg-gradient-to-br from-gray-50 to-blue-50 dark:from-gray-800 dark:to-gray-900">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white mb-6">
Como{" "}
<span className="bg-gradient-to-r from-blue-600 to-green-600 bg-clip-text text-transparent">
funciona
</span>
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Em menos de 10 segundos, você tem todas as informações que precisa
para tomar a melhor decisão.
</p>
<section className="relative py-32 bg-white dark:bg-[#030712] overflow-hidden transition-colors duration-500">
{/* Background Decor: Engenharia de Luz */}
<div className="absolute top-0 left-1/2 -translate-x-1/2 w-full h-full bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-blue-500/5 via-transparent to-transparent pointer-events-none" />
<div className="max-w-7xl mx-auto px-6 relative z-10">
<div className="text-center mb-24">
<motion.span
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
className="text-blue-600 font-mono text-sm font-black uppercase tracking-[0.3em]"
>
Pipeline de Operação
</motion.span>
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
className="text-5xl md:text-7xl font-black text-gray-900 dark:text-white mt-4 mb-8 tracking-tighter"
>
A inteligência por trás do <span className="bg-gradient-to-r from-blue-600 to-green-500 bg-clip-text text-transparent italic">scan</span>.
</motion.h2>
</div>
{/* Steps */}
<div className="relative">
{/* Connection Lines */}
<div className="hidden lg:block absolute top-1/2 left-0 right-0 h-0.5 bg-gradient-to-r from-blue-200 via-green-200 to-blue-200 transform -translate-y-1/2"></div>
<div className="grid grid-cols-1 lg:grid-cols-3 gap-12">
{/* Step 1 */}
<div className="relative text-center">
{/* Step Circle */}
<div className="relative z-10 w-20 h-20 bg-gradient-to-br from-blue-500 to-blue-600 rounded-full flex items-center justify-center mx-auto mb-6 shadow-lg">
<Scan className="w-10 h-10 text-white" />
{/* Main Pipeline Flow */}
[Image of a modern user interface flow diagram]
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-32 relative">
{STEPS.map((step, index) => (
<motion.div
key={step.id}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.2 }}
viewport={{ once: true }}
className="group relative p-8 rounded-[2.5rem] bg-gray-50 dark:bg-gray-900/50 border border-gray-100 dark:border-gray-800 hover:border-blue-500/30 transition-all duration-500"
>
{/* Step Badge */}
<div className="absolute top-8 right-8 text-4xl font-black opacity-5 dark:opacity-10 group-hover:opacity-20 transition-opacity italic">
0{step.id}
</div>
{/* Step Number */}
<div className="absolute -top-2 -right-2 w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center text-blue-600 dark:text-blue-400 font-bold text-sm">
1
<div className={cn(
"w-16 h-16 rounded-2xl bg-gradient-to-br flex items-center justify-center mb-10 shadow-xl transition-transform group-hover:scale-110 group-hover:rotate-3",
step.color
)}>
<step.icon className="w-8 h-8 text-white" />
</div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Escaneie
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4 tracking-tight">
{step.title}
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
Use seu celular para escanear o código de barras do produto ou
digite o código manualmente.
<p className="text-gray-600 dark:text-gray-400 mb-8 leading-relaxed font-medium">
{step.description}
</p>
{/* Feature List */}
<div className="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm">
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-2">
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Códigos de 8-13 dígitos
<ul className="space-y-3 border-t border-gray-200 dark:border-gray-800 pt-6">
{step.features.map((f) => (
<li key={f} className="flex items-center text-xs font-bold text-gray-500 dark:text-gray-500 uppercase tracking-widest">
<div className="w-1.5 h-1.5 rounded-full bg-blue-500 mr-3 animate-pulse" />
{f}
</li>
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Busca por nome/marca
</li>
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Detecção automática
</li>
</ul>
</div>
</div>
{/* Arrow */}
<div className="hidden lg:flex items-center justify-center">
<ArrowRight className="w-8 h-8 text-gray-400" />
</div>
{/* Step 2 */}
<div className="relative text-center">
{/* Step Circle */}
<div className="relative z-10 w-20 h-20 bg-gradient-to-br from-green-500 to-green-600 rounded-full flex items-center justify-center mx-auto mb-6 shadow-lg">
<Search className="w-10 h-10 text-white" />
</div>
{/* Step Number */}
<div className="absolute -top-2 -right-2 w-8 h-8 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center text-green-600 dark:text-green-400 font-bold text-sm">
2
</div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Descubra
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
Receba informações completas sobre ingredientes, valores
nutricionais e classificações de saúde.
</p>
{/* Feature List */}
<div className="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm">
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-2">
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Tabela nutricional completa
</li>
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Nutri-Score e NOVA
</li>
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Lista de alérgenos
</li>
</ul>
</div>
</div>
{/* Arrow */}
<div className="hidden lg:flex items-center justify-center">
<ArrowRight className="w-8 h-8 text-gray-400" />
</div>
{/* Step 3 */}
<div className="relative text-center">
{/* Step Circle */}
<div className="relative z-10 w-20 h-20 bg-gradient-to-br from-purple-500 to-purple-600 rounded-full flex items-center justify-center mx-auto mb-6 shadow-lg">
<CheckCircle className="w-10 h-10 text-white" />
</div>
{/* Step Number */}
<div className="absolute -top-2 -right-2 w-8 h-8 bg-purple-100 dark:bg-purple-900/30 rounded-full flex items-center justify-center text-purple-600 dark:text-purple-400 font-bold text-sm">
3
</div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Decida
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
Com todas as informações em mãos, tome a decisão mais adequada
para sua saúde e bem-estar.
</p>
{/* Feature List */}
<div className="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm">
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-2">
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Comparação com similares
</li>
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Sugestões de alternativas
</li>
<li className="flex items-center">
<CheckCircle className="w-4 h-4 text-green-500 mr-2 flex-shrink-0" />
Salvar para depois
</li>
</ul>
</div>
</div>
</div>
))}
</ul>
</motion.div>
))}
</div>
{/* Time Highlight */}
<div className="mt-16 text-center">
<div className="inline-flex items-center gap-3 bg-white dark:bg-gray-800 rounded-full px-6 py-3 shadow-lg">
<div className="w-8 h-8 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center">
<CheckCircle className="w-5 h-5 text-green-600 dark:text-green-400" />
{/* Global Stats Footer: O 80/20 do Valor */}
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
whileInView={{ opacity: 1, scale: 1 }}
className="grid grid-cols-2 lg:grid-cols-4 gap-4"
>
{[
{ icon: Globe, label: "Global", text: "2M+ Alimentos" },
{ icon: Shield, label: "Seguro", text: "100% Gratuito" },
{ icon: Clock, label: "Veloz", text: "< 10 Segundos" },
{ icon: Zap, label: "Offline", text: "Cache Inteligente" },
].map((item, i) => (
<div key={i} className="flex flex-col items-center p-6 bg-white dark:bg-gray-900 rounded-3xl border border-gray-100 dark:border-gray-800 shadow-sm">
<item.icon className="w-6 h-6 text-blue-500 mb-3" />
<span className="text-[10px] font-black uppercase tracking-widest text-gray-400 mb-1">{item.label}</span>
<span className="text-sm font-bold text-gray-900 dark:text-white">{item.text}</span>
</div>
<span className="text-lg font-semibold text-gray-900 dark:text-white">
Em menos de 10 segundos
</span>
</div>
<p className="mt-4 text-gray-600 dark:text-gray-400">
Do escaneamento à decisão informada
</p>
</div>
{/* Additional Features */}
<div className="mt-16 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm text-center">
<div className="w-12 h-12 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center mx-auto mb-4">
<Scan className="w-6 h-6 text-blue-600 dark:text-blue-400" />
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">
Offline
</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">
Funciona sem internet com cache local
</p>
</div>
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm text-center">
<div className="w-12 h-12 bg-green-100 dark:bg-green-900/30 rounded-lg flex items-center justify-center mx-auto mb-4">
<Search className="w-6 h-6 text-green-600 dark:text-green-400" />
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">
Gratuito
</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">
Sem custos, sem anúncios, sem pegadinhas
</p>
</div>
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm text-center">
<div className="w-12 h-12 bg-purple-100 dark:bg-purple-900/30 rounded-lg flex items-center justify-center mx-auto mb-4">
<CheckCircle className="w-6 h-6 text-purple-600 dark:text-purple-400" />
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">
Atualizado
</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">
Dados sempre atualizados pela comunidade
</p>
</div>
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm text-center">
<div className="w-12 h-12 bg-orange-100 dark:bg-orange-900/30 rounded-lg flex items-center justify-center mx-auto mb-4">
<ArrowRight className="w-6 h-6 text-orange-600 dark:text-orange-400" />
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">
Rápido
</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">
Interface otimizada para velocidade
</p>
</div>
</div>
))}
</motion.div>
</div>
</section>
);
}
}
+139 -166
View File
@@ -1,185 +1,158 @@
"use client";
import { TrendingUp, Globe, Clock, Database } from "lucide-react";
import React from "react";
import { motion } from "framer-motion";
import { Globe, Database, Activity, Zap } from "lucide-react";
import { cn } from "@/lib/utils";
// Variantes para animação de entrada (Stagger)
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: { staggerChildren: 0.1 }
}
};
const itemVariants = {
hidden: { y: 20, opacity: 0 },
visible: { y: 0, opacity: 1 }
};
export function ImpactSection() {
return (
<section className="py-20 bg-gray-50 dark:bg-gray-800">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white mb-6">
Nosso{" "}
<span className="bg-gradient-to-r from-blue-600 to-green-600 bg-clip-text text-transparent">
impacto
</span>
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Números que mostram como estamos transformando a forma como as
pessoas escolhem seus alimentos.
<section className="py-32 bg-white dark:bg-[#030712] relative overflow-hidden transition-colors duration-500">
{/* Background Decor - Grid de Engenharia */}
<div className="absolute inset-0 bg-[linear-gradient(to_right,#80808012_1px,transparent_1px),linear-gradient(to_bottom,#80808012_1px,transparent_1px)] bg-[size:40px_40px] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_0%,#000_70%,transparent_100%)]" />
<div className="max-w-7xl mx-auto px-6 relative z-10">
{/* Header - Autoridade Técnica */}
<div className="text-center mb-24">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
className="text-4xl md:text-6xl font-black text-gray-900 dark:text-white mb-6 tracking-tighter"
>
Escalabilidade e <span className="bg-gradient-to-r from-blue-600 to-emerald-500 bg-clip-text text-transparent">Impacto Global</span>
</motion.h2>
<p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto font-medium">
Métricas de performance da maior rede colaborativa de transparência alimentar do planeta.
</p>
</div>
{/* Impact Stats */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 mb-16">
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg text-center hover:shadow-xl transition-shadow">
<div className="w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-2xl flex items-center justify-center mx-auto mb-6">
<Database className="w-8 h-8 text-blue-600 dark:text-blue-400" />
</div>
<div className="text-4xl font-bold text-blue-600 dark:text-blue-400 mb-2">
2.000.000+
</div>
<div className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
Produtos
</div>
<p className="text-gray-600 dark:text-gray-400 text-sm">
Na base de dados Open Food Facts
</p>
</div>
{/* Stats Grid - Estilo Bento Box Sênior */}
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-20"
>
{[
{ label: "Data Nodes", val: "2.0M+", icon: Database, color: "text-blue-500", bg: "bg-blue-500/10" },
{ label: "Regions", val: "100+", icon: Globe, color: "text-emerald-500", bg: "bg-emerald-500/10" },
{ label: "Uptime", val: "24/7", icon: Activity, color: "text-purple-500", bg: "bg-purple-500/10" },
{ label: "Local Cache", val: "218k", icon: Zap, color: "text-orange-500", bg: "bg-orange-500/10" },
].map((stat) => (
<motion.div
key={stat.label}
variants={itemVariants}
whileHover={{ y: -5 }}
className="bg-gray-50 dark:bg-gray-900/50 border border-gray-100 dark:border-gray-800 p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all"
>
<div className={cn("w-12 h-12 rounded-xl flex items-center justify-center mb-6", stat.bg)}>
<stat.icon className={cn("w-6 h-6", stat.color)} />
</div>
<div className={cn("text-3xl font-mono font-bold tracking-tighter mb-1", stat.color)}>
{stat.val}
</div>
<div className="text-sm font-black uppercase tracking-widest text-gray-400">
{stat.label}
</div>
</motion.div>
))}
</motion.div>
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg text-center hover:shadow-xl transition-shadow">
<div className="w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-2xl flex items-center justify-center mx-auto mb-6">
<Globe className="w-8 h-8 text-green-600 dark:text-green-400" />
</div>
<div className="text-4xl font-bold text-green-600 dark:text-green-400 mb-2">
100+
</div>
<div className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
Países
</div>
<p className="text-gray-600 dark:text-gray-400 text-sm">
Com produtos cadastrados
</p>
</div>
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg text-center hover:shadow-xl transition-shadow">
<div className="w-16 h-16 bg-purple-100 dark:bg-purple-900/30 rounded-2xl flex items-center justify-center mx-auto mb-6">
<Clock className="w-8 h-8 text-purple-600 dark:text-purple-400" />
</div>
<div className="text-4xl font-bold text-purple-600 dark:text-purple-400 mb-2">
24/7
</div>
<div className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
Disponível
</div>
<p className="text-gray-600 dark:text-gray-400 text-sm">
Acesso instantâneo aos dados
</p>
</div>
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg text-center hover:shadow-xl transition-shadow">
<div className="w-16 h-16 bg-orange-100 dark:bg-orange-900/30 rounded-2xl flex items-center justify-center mx-auto mb-6">
<TrendingUp className="w-8 h-8 text-orange-600 dark:text-orange-400" />
</div>
<div className="text-4xl font-bold text-orange-600 dark:text-orange-400 mb-2">
218
</div>
<div className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
Cache Local
</div>
<p className="text-gray-600 dark:text-gray-400 text-sm">
Produtos populares offline
</p>
</div>
</div>
{/* World Map Visualization */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg mb-16">
<div className="text-center mb-8">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Alcance Global
</h3>
<p className="text-gray-600 dark:text-gray-400">
Nossa plataforma conecta usuários de todos os continentes à maior
base de dados alimentar do mundo
</p>
</div>
{/* Simplified World Map */}
<div className="relative max-w-4xl mx-auto">
<div className="aspect-video bg-gradient-to-br from-blue-100 to-green-100 dark:from-blue-900/20 dark:to-green-900/20 rounded-xl overflow-hidden relative">
{/* Dots representing global coverage */}
<div className="absolute top-1/4 left-1/4 w-3 h-3 bg-blue-500 rounded-full animate-pulse"></div>
<div className="absolute top-1/3 right-1/3 w-3 h-3 bg-green-500 rounded-full animate-pulse delay-300"></div>
<div className="absolute bottom-1/3 left-1/3 w-3 h-3 bg-purple-500 rounded-full animate-pulse delay-500"></div>
<div className="absolute top-2/3 right-1/4 w-3 h-3 bg-orange-500 rounded-full animate-pulse delay-700"></div>
<div className="absolute bottom-1/4 left-1/2 w-3 h-3 bg-red-500 rounded-full animate-pulse delay-1000"></div>
{/* Center text */}
<div className="absolute inset-0 flex items-center justify-center">
<div className="text-center">
<div className="text-4xl font-bold text-gray-700 dark:text-gray-300 mb-2">
🌍
</div>
<div className="text-lg font-semibold text-gray-600 dark:text-gray-400">
Cobertura Global
</div>
{/* World Map - Visualização de Rede de Dados */}
[Image of a world map with data points and connections]
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
whileInView={{ opacity: 1, scale: 1 }}
className="relative bg-slate-950 rounded-[3rem] p-12 overflow-hidden shadow-3xl mb-20"
>
<div className="absolute inset-0 opacity-20 bg-[url('https://www.transparenttextures.com/patterns/carbon-fibre.png')]" />
<div className="relative z-10 flex flex-col items-center">
<h3 className="text-2xl font-bold text-white mb-2 tracking-tight">Rede Global de Sincronização</h3>
<p className="text-slate-500 text-sm mb-12">Monitoramento de tráfego de metadados em tempo real</p>
<div className="w-full aspect-[21/9] relative bg-blue-500/5 rounded-2xl border border-blue-500/10 flex items-center justify-center">
{/* Pulsing Data Points (Engineering nodes) */}
{[
{ t: "20%", l: "25%", c: "bg-blue-500" },
{ t: "40%", l: "60%", c: "bg-emerald-500" },
{ t: "70%", l: "30%", c: "bg-purple-500" },
{ t: "25%", l: "80%", c: "bg-orange-500" },
{ t: "55%", l: "15%", c: "bg-red-500" },
].map((dot, i) => (
<div key={i} className="absolute" style={{ top: dot.t, left: dot.l }}>
<div className={cn("w-3 h-3 rounded-full animate-ping opacity-75 absolute", dot.c)} />
<div className={cn("w-3 h-3 rounded-full relative", dot.c)} />
</div>
))}
<Globe className="w-24 h-24 text-blue-500/20 animate-pulse" />
<div className="absolute bottom-4 right-6 flex items-center gap-2 text-[10px] font-mono text-blue-400 uppercase tracking-[0.3em]">
<span className="w-2 h-2 bg-blue-400 rounded-full animate-pulse" /> Live Node Updates
</div>
</div>
</div>
</div>
</motion.div>
{/* Community Impact */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
<div className="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-900/20 dark:to-blue-800/20 rounded-2xl p-8">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-6">
Transformação Individual
</h3>
<div className="space-y-4">
<div className="flex items-start">
<div className="w-2 h-2 bg-blue-500 rounded-full mt-2 mr-3 flex-shrink-0"></div>
<p className="text-gray-700 dark:text-gray-300">
<strong>Escolhas mais conscientes:</strong> Usuários relatam
tomar decisões mais informadas sobre sua alimentação
</p>
</div>
<div className="flex items-start">
<div className="w-2 h-2 bg-green-500 rounded-full mt-2 mr-3 flex-shrink-0"></div>
<p className="text-gray-700 dark:text-gray-300">
<strong>Economia de tempo:</strong> Redução de 80% no tempo
gasto analisando rótulos
</p>
</div>
<div className="flex items-start">
<div className="w-2 h-2 bg-purple-500 rounded-full mt-2 mr-3 flex-shrink-0"></div>
<p className="text-gray-700 dark:text-gray-300">
<strong>Confiança aumentada:</strong> Maior segurança na
identificação de alérgenos e ingredientes
</p>
</div>
</div>
</div>
<div className="bg-gradient-to-br from-green-50 to-green-100 dark:from-green-900/20 dark:to-green-800/20 rounded-2xl p-8">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-6">
Impacto Coletivo
</h3>
<div className="space-y-4">
<div className="flex items-start">
<div className="w-2 h-2 bg-blue-500 rounded-full mt-2 mr-3 flex-shrink-0"></div>
<p className="text-gray-700 dark:text-gray-300">
<strong>Transparência da indústria:</strong> Pressão por
rótulos mais claros e honestos
</p>
</div>
<div className="flex items-start">
<div className="w-2 h-2 bg-green-500 rounded-full mt-2 mr-3 flex-shrink-0"></div>
<p className="text-gray-700 dark:text-gray-300">
<strong>Dados colaborativos:</strong> Milhares de
contribuições diárias à base global
</p>
</div>
<div className="flex items-start">
<div className="w-2 h-2 bg-purple-500 rounded-full mt-2 mr-3 flex-shrink-0"></div>
<p className="text-gray-700 dark:text-gray-300">
<strong>Democratização:</strong> Acesso universal a
informações nutricionais de qualidade
</p>
</div>
</div>
</div>
{/* Impact Logs - High Density Info */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 font-medium">
<ImpactCard
title="Individual Protocol"
items={[
{ label: "Cognitive Efficiency", text: "Redução de 80% no tempo de análise de rótulos via algoritmos de OCR." },
{ label: "Data Sovereignty", text: "Usuários com controle total sobre o histórico de consumo local." },
{ label: "Safety Layer", text: "Detecção imediata de alérgenos via cruzamento de base de dados." }
]}
type="blue"
/>
<ImpactCard
title="Collective Governance"
items={[
{ label: "Market Transparency", text: "Pressão algorítmica por rótulos honestos e dados auditáveis." },
{ label: "Crowdsourced Intelligence", text: "Milhares de contribuições diárias validando a integridade da base." },
{ label: "Universal Access", text: "Democratização da informação nutricional de alta fidelidade." }
]}
type="emerald"
/>
</div>
</div>
</section>
);
}
function ImpactCard({ title, items, type }: { title: string, items: {label: string, text: string}[], type: 'blue' | 'emerald' }) {
return (
<div className={cn(
"p-10 rounded-[2.5rem] border transition-all duration-500 hover:shadow-2xl",
type === 'blue' ? "bg-blue-50/50 dark:bg-blue-900/10 border-blue-100 dark:border-blue-900/20" : "bg-emerald-50/50 dark:bg-emerald-900/10 border-emerald-100 dark:border-emerald-900/20"
)}>
<h3 className="text-xl font-black mb-8 tracking-tighter uppercase">{title}</h3>
<div className="space-y-6">
{items.map((item, i) => (
<div key={i} className="flex gap-4">
<div className={cn("w-1.5 h-1.5 rounded-full mt-2 shrink-0", type === 'blue' ? "bg-blue-500" : "bg-emerald-500")} />
<p className="text-sm leading-relaxed text-gray-700 dark:text-gray-300">
<span className="font-bold text-gray-900 dark:text-white">{item.label}:</span> {item.text}
</p>
</div>
))}
</div>
</div>
);
}
+123 -106
View File
@@ -1,122 +1,139 @@
"use client";
import { Eye, Shield, Users, Globe } from "lucide-react";
import React from "react";
import { motion } from "framer-motion";
import { Eye, Shield, Users, Globe, Database, Activity, Map } from "lucide-react";
import { cn } from "@/lib/utils";
const MISSION_VALUES = [
{
title: "Transparência",
description: "Governança de dados aberta. O que você consome é rastreado sem filtros ou interesses comerciais ocultos.",
icon: Eye,
color: "text-blue-500",
bg: "bg-blue-500/10",
},
{
title: "Empoderamento",
description: "Autonomia decisória baseada em evidências técnicas. Devolvemos o controle da saúde ao cidadão.",
icon: Shield,
color: "text-emerald-500",
bg: "bg-emerald-500/10",
},
{
title: "Comunidade",
description: "Ecossistema colaborativo global. A inteligência coletiva protegendo a saúde de milhões.",
icon: Users,
color: "text-purple-500",
bg: "bg-purple-500/10",
},
];
export function MissionSection() {
return (
<section className="py-20 bg-gradient-to-br from-blue-50 via-white to-green-50 dark:from-gray-900 dark:via-gray-800 dark:to-gray-900">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white mb-6">
O que nos{" "}
<span className="bg-gradient-to-r from-blue-600 to-green-600 bg-clip-text text-transparent">
move
</span>
<section className="py-32 bg-white dark:bg-[#030712] relative overflow-hidden transition-colors duration-500">
{/* Background Decor: Mesh Gradient sutil */}
<div className="absolute top-0 left-1/4 w-1/2 h-1/2 bg-blue-500/5 blur-[120px] rounded-full pointer-events-none" />
<div className="max-w-7xl mx-auto px-6 relative z-10">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="text-center mb-24"
>
<h2 className="text-4xl md:text-6xl font-black text-gray-900 dark:text-white mb-6 tracking-tighter">
Governança de <span className="bg-gradient-to-r from-blue-600 to-emerald-500 bg-clip-text text-transparent">Dados Alimentares</span>
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Acreditamos que alimentação consciente não precisa ser complicada.
Por isso, conectamos você à maior base de dados colaborativa de
alimentos do mundo.
<p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto font-medium">
Engenharia de software aplicada à transparência nutricional. Nossa missão é converter caos informacional em escolhas seguras.
</p>
</div>
</motion.div>
{/* Mission Values */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 mb-16">
{/* Transparência */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-2xl flex items-center justify-center mb-6">
<Eye className="w-8 h-8 text-blue-600 dark:text-blue-400" />
</div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Transparência
</h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed">
Todos os dados são colaborativos e abertos. Não escondemos nada,
não maquiamos informações. O que você vê é o que existe.
</p>
</div>
{/* Empoderamento */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-2xl flex items-center justify-center mb-6">
<Shield className="w-8 h-8 text-green-600 dark:text-green-400" />
</div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Empoderamento
</h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed">
Colocamos o poder de escolha de volta nas suas mãos. Cada código
de barras escaneado é um passo em direção a escolhas mais
informadas.
</p>
</div>
{/* Comunidade */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-purple-100 dark:bg-purple-900/30 rounded-2xl flex items-center justify-center mb-6">
<Users className="w-8 h-8 text-purple-600 dark:text-purple-400" />
</div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
Comunidade
</h3>
<p className="text-gray-600 dark:text-gray-300 leading-relaxed">
Milhões de pessoas contribuem com informações sobre produtos de
mais de 100 países. Juntos, criamos um mundo mais transparente.
</p>
</div>
</div>
{/* Open Food Facts Highlight */}
<div className="bg-gradient-to-r from-blue-600 to-green-600 rounded-3xl p-8 text-white shadow-2xl">
<div className="flex items-center justify-between flex-wrap gap-8">
<div className="flex-1 min-w-0">
<div className="flex items-center mb-4">
<Globe className="w-8 h-8 mr-3" />
<h3 className="text-2xl font-bold">Open Food Facts</h3>
{/* Values: Bento-style Cards */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 mb-20">
{MISSION_VALUES.map((value, i) => (
<motion.div
key={value.title}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: i * 0.1 }}
viewport={{ once: true }}
className="group p-8 rounded-[2rem] bg-gray-50 dark:bg-gray-900/50 border border-gray-100 dark:border-gray-800 hover:border-blue-500/30 transition-all duration-500"
>
<div className={cn("w-14 h-14 rounded-2xl flex items-center justify-center mb-8 transition-transform group-hover:scale-110", value.bg)}>
<value.icon className={cn("w-7 h-7", value.color)} />
</div>
<p className="text-blue-100 text-lg mb-6">
Conectamos você à maior base de dados colaborativa de alimentos
do mundo, onde cada produto é verificado e atualizado pela
comunidade global.
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4 tracking-tight">
{value.title}
</h3>
<p className="text-gray-600 dark:text-gray-400 leading-relaxed text-sm font-medium">
{value.description}
</p>
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="text-center">
<div className="text-3xl font-bold mb-1">2M+</div>
<div className="text-blue-100 text-sm">Produtos</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold mb-1">100+</div>
<div className="text-blue-100 text-sm">Países</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold mb-1">24/7</div>
<div className="text-blue-100 text-sm">Disponível</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold mb-1">∞</div>
<div className="text-blue-100 text-sm">Colaborativo</div>
</div>
</div>
</div>
<div className="flex-shrink-0">
<div className="w-24 h-24 bg-white/20 rounded-2xl flex items-center justify-center">
<Globe className="w-12 h-12" />
</div>
</div>
</div>
</motion.div>
))}
</div>
{/* Inspirational Quote */}
<div className="text-center mt-16">
<blockquote className="text-2xl sm:text-3xl font-medium text-gray-700 dark:text-gray-300 italic max-w-4xl mx-auto">
&ldquo;Alimentação é mais que nutrição. É autocuidado, é conexão, é
vida.&rdquo;
</blockquote>
<cite className="block mt-4 text-lg text-gray-500 dark:text-gray-400">
— Filosofia NutriScan
</cite>
{/* Data Source Dashboard Highlight */}
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
className="relative rounded-[3rem] bg-slate-950 p-10 md:p-16 overflow-hidden shadow-3xl"
>
<div className="absolute top-0 right-0 w-full h-full bg-[radial-gradient(circle_at_top_right,_var(--tw-gradient-stops))] from-blue-500/20 via-transparent to-transparent" />
<div className="relative z-10 flex flex-col lg:flex-row gap-12 items-center">
<div className="flex-1 space-y-8">
<div className="inline-flex items-center px-4 py-2 rounded-full bg-blue-500/10 border border-blue-500/20 text-blue-400 text-xs font-black uppercase tracking-widest">
<Database className="w-3 h-3 mr-2" /> Infraestrutura Global
</div>
<h3 className="text-3xl md:text-4xl font-black text-white tracking-tighter">
Integrado ao Open Food Facts API
</h3>
<p className="text-slate-400 text-lg leading-relaxed">
Nossa engine de busca opera sobre o maior dataset colaborativo do planeta, garantindo que cada scan seja validado por uma rede global de curadoria.
</p>
<div className="grid grid-cols-2 lg:grid-cols-4 gap-8">
{[
{ label: "Produtos", val: "2M+", icon: Activity },
{ label: "Países", val: "100+", icon: Map },
{ label: "Uptime", val: "24/7", icon: Activity },
{ label: "Licença", val: "ODBL", icon: Shield },
].map((stat) => (
<div key={stat.label} className="space-y-1">
<div className="text-2xl font-mono font-bold text-white tracking-tighter">{stat.val}</div>
<div className="text-[10px] uppercase font-black text-slate-500 tracking-widest flex items-center gap-1">
<stat.icon className="w-3 h-3" /> {stat.label}
</div>
</div>
))}
</div>
</div>
<div className="relative w-64 h-64 flex items-center justify-center">
{/* Efeito Visual de Radar/Sincronização */}
<div className="absolute inset-0 border border-blue-500/20 rounded-full animate-ping" />
<div className="absolute inset-4 border border-blue-500/10 rounded-full animate-pulse" />
<div className="w-32 h-32 bg-blue-600 rounded-3xl flex items-center justify-center shadow-2xl shadow-blue-500/50 rotate-12 group">
<Globe className="text-white w-16 h-16" />
</div>
</div>
</div>
</motion.div>
{/* Footer Quote: Minimalista */}
<div className="mt-24 text-center">
<p className="text-gray-400 dark:text-gray-600 font-mono text-[10px] uppercase tracking-[0.5em] mb-4">
NutriScan Open Data Philosophy
</p>
<p className="text-xl md:text-2xl font-serif italic text-gray-800 dark:text-gray-200">
&ldquo;Dados abertos são a fundação de uma sociedade saudável.&rdquo;
</p>
</div>
</div>
</section>
);
}
}
+147 -142
View File
@@ -1,159 +1,164 @@
"use client";
import React, { useRef } from "react";
import { motion, useScroll, useSpring } from "framer-motion";
import { Calendar, Lightbulb, Heart, Target } from "lucide-react";
import { cn } from "@/lib/utils";
// 1. Definição da Interface de Dados
interface StoryStep {
year: string;
title: string;
description: string;
icon: React.ElementType;
color: string;
side: "left" | "right";
}
const STORY_DATA: StoryStep[] = [
{
year: "2024",
title: "A Pergunta Simples",
description: "O que realmente tem nesse produto? Decifrar tabelas nutricionais era um desafio individual que percebemos ser global.",
icon: Calendar,
color: "blue",
side: "left",
},
{
year: "Descoberta",
title: "Não Estávamos Sozinhos",
description: "Milhares de pessoas buscam transparência alimentar. A necessidade de dados abertos tornou-se uma urgência técnica.",
icon: Lightbulb,
color: "green",
side: "right",
},
{
year: "Solução",
title: "NutriScan Nasce",
description: "Nascido da Engenharia para o mundo. Uma ponte entre o código de barras e a verdade nutricional.",
icon: Heart,
color: "purple",
side: "left",
},
{
year: "Hoje",
title: "Nossa Missão",
description: "Democratizar a informação. Conectar cidadãos à maior base de dados colaborativa do planeta.",
icon: Target,
color: "orange",
side: "right",
},
];
export function StorySection() {
const containerRef = useRef<HTMLDivElement>(null);
// 2. Lógica de Scroll Progressivo (Engenharia de Movimento)
const { scrollYProgress } = useScroll({
target: containerRef,
offset: ["start end", "end end"],
});
const scaleY = useSpring(scrollYProgress, {
stiffness: 100,
damping: 30,
restDelta: 0.001
});
return (
<section className="py-20 bg-white dark:bg-gray-900">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white mb-6">
Nossa{" "}
<span className="bg-gradient-to-r from-blue-600 to-green-600 bg-clip-text text-transparent">
história
</span>
<section ref={containerRef} className="py-32 bg-white dark:bg-[#030712] relative overflow-hidden">
<div className="max-w-7xl mx-auto px-6">
{/* Header com Animação de Entrada */}
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
className="text-center mb-32"
>
<h2 className="text-4xl md:text-6xl font-black text-gray-900 dark:text-white mb-6 tracking-tighter">
Nossa <span className="bg-gradient-to-r from-blue-600 to-green-500 bg-clip-text text-transparent">história</span>
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Tudo começou com uma pergunta simples que mudou tudo.
<p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto font-medium">
De uma dúvida individual a uma plataforma de transparência global.
</p>
</div>
</motion.div>
{/* Timeline */}
<div className="relative">
{/* Timeline Line */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-1 h-full bg-gradient-to-b from-blue-600 to-green-600 rounded-full hidden md:block"></div>
{/* 3. A Linha do Tempo Reativa */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-[2px] h-full bg-gray-100 dark:bg-gray-800 hidden md:block">
<motion.div
style={{ scaleY }}
className="absolute top-0 w-full h-full bg-gradient-to-b from-blue-500 via-green-500 to-orange-500 origin-top"
/>
</div>
{/* Timeline Items */}
<div className="space-y-16">
{/* 2024 - The Question */}
<div className="relative flex items-center">
<div className="w-full md:w-1/2 md:pr-8">
<div className="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-900/20 dark:to-blue-800/20 rounded-2xl p-8 shadow-lg">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-blue-500 rounded-lg flex items-center justify-center mr-4">
<Calendar className="w-6 h-6 text-white" />
</div>
<div>
<div className="text-sm font-medium text-blue-600 dark:text-blue-400">
2024
</div>
<div className="text-lg font-bold text-gray-900 dark:text-white">
A Pergunta Simples
</div>
</div>
</div>
<blockquote className="text-xl font-semibold text-gray-800 dark:text-gray-200 mb-4">
&ldquo;O que realmente tem nesse produto?&rdquo;
</blockquote>
<p className="text-gray-600 dark:text-gray-300">
Após inúmeras idas ao mercado tentando decifrar tabelas
nutricionais e listas intermináveis de ingredientes,
percebemos que não estávamos sozinhos nessa busca.
</p>
</div>
</div>
{/* Timeline Dot */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-blue-500 rounded-full border-4 border-white dark:border-gray-900 shadow-lg hidden md:block"></div>
<div className="w-full md:w-1/2 md:pl-8"></div>
</div>
{/* The Discovery */}
<div className="relative flex items-center">
<div className="w-full md:w-1/2 md:pr-8"></div>
{/* Timeline Dot */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-green-500 rounded-full border-4 border-white dark:border-gray-900 shadow-lg hidden md:block"></div>
<div className="w-full md:w-1/2 md:pl-8">
<div className="bg-gradient-to-br from-green-50 to-green-100 dark:from-green-900/20 dark:to-green-800/20 rounded-2xl p-8 shadow-lg">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-green-500 rounded-lg flex items-center justify-center mr-4">
<Lightbulb className="w-6 h-6 text-white" />
</div>
<div>
<div className="text-sm font-medium text-green-600 dark:text-green-400">
Descoberta
</div>
<div className="text-lg font-bold text-gray-900 dark:text-white">
Não Estávamos Sozinhos
</div>
</div>
</div>
<p className="text-gray-600 dark:text-gray-300">
Milhares de pessoas querem fazer escolhas mais conscientes,
mas esbarram na falta de informação acessível. A necessidade
era real e urgente.
</p>
</div>
</div>
</div>
{/* The Solution */}
<div className="relative flex items-center">
<div className="w-full md:w-1/2 md:pr-8">
<div className="bg-gradient-to-br from-purple-50 to-purple-100 dark:from-purple-900/20 dark:to-purple-800/20 rounded-2xl p-8 shadow-lg">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-purple-500 rounded-lg flex items-center justify-center mr-4">
<Heart className="w-6 h-6 text-white" />
</div>
<div>
<div className="text-sm font-medium text-purple-600 dark:text-purple-400">
Solução
</div>
<div className="text-lg font-bold text-gray-900 dark:text-white">
NutriScan Nasce
</div>
</div>
</div>
<p className="text-gray-600 dark:text-gray-300">
Foi assim que o NutriScan ganhou vida – não como mais um
aplicativo de nutrição, mas como uma ponte entre você e a
verdade sobre o que consome.
</p>
</div>
</div>
{/* Timeline Dot */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-purple-500 rounded-full border-4 border-white dark:border-gray-900 shadow-lg hidden md:block"></div>
<div className="w-full md:w-1/2 md:pl-8"></div>
</div>
{/* The Mission */}
<div className="relative flex items-center">
<div className="w-full md:w-1/2 md:pr-8"></div>
{/* Timeline Dot */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 bg-orange-500 rounded-full border-4 border-white dark:border-gray-900 shadow-lg hidden md:block"></div>
<div className="w-full md:w-1/2 md:pl-8">
<div className="bg-gradient-to-br from-orange-50 to-orange-100 dark:from-orange-900/20 dark:to-orange-800/20 rounded-2xl p-8 shadow-lg">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-orange-500 rounded-lg flex items-center justify-center mr-4">
<Target className="w-6 h-6 text-white" />
</div>
<div>
<div className="text-sm font-medium text-orange-600 dark:text-orange-400">
Hoje
</div>
<div className="text-lg font-bold text-gray-900 dark:text-white">
Nossa Missão
</div>
</div>
</div>
<p className="text-gray-600 dark:text-gray-300">
Democratizar o acesso às informações nutricionais,
conectando você à maior base de dados colaborativa de
alimentos do mundo.
</p>
</div>
</div>
</div>
<div className="space-y-24 md:space-y-32">
{STORY_DATA.map((step, index) => (
<TimelineItem key={index} step={step} index={index} />
))}
</div>
</div>
</div>
</section>
);
}
// 4. Sub-componente com Encapsulamento de Animação
function TimelineItem({ step }: { step: StoryStep; index: number }) {
const isLeft = step.side === "left";
const colorMap = {
blue: "bg-blue-500 text-blue-500 border-blue-200 dark:border-blue-900/30",
green: "bg-green-500 text-green-500 border-green-200 dark:border-green-900/30",
purple: "bg-purple-500 text-purple-500 border-purple-200 dark:border-purple-900/30",
orange: "bg-orange-500 text-orange-500 border-orange-200 dark:border-orange-900/30",
};
return (
<div className={cn(
"relative flex flex-col md:flex-row items-center justify-between w-full",
isLeft ? "md:flex-row" : "md:flex-row-reverse"
)}>
{/* Conteúdo */}
<motion.div
initial={{ opacity: 0, x: isLeft ? -50 : 50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ duration: 0.6, delay: 0.1 }}
className="w-full md:w-[45%] group"
>
<div className={cn(
"p-8 rounded-[2rem] bg-gray-50 dark:bg-gray-900/50 border border-gray-100 dark:border-gray-800 transition-all duration-500",
"hover:shadow-2xl hover:border-transparent group-hover:bg-white dark:group-hover:bg-gray-900"
)}>
<div className="flex items-center gap-4 mb-6">
<div className={cn("w-12 h-12 rounded-xl flex items-center justify-center text-white shadow-lg", colorMap[step.color as keyof typeof colorMap].split(' ')[0])}>
<step.icon size={24} />
</div>
<div>
<span className={cn("text-xs font-black uppercase tracking-widest", colorMap[step.color as keyof typeof colorMap].split(' ')[1])}>
{step.year}
</span>
<h3 className="text-xl font-bold text-gray-900 dark:text-white leading-tight">
{step.title}
</h3>
</div>
</div>
<p className="text-gray-600 dark:text-gray-400 leading-relaxed">
{step.description}
</p>
</div>
</motion.div>
{/* Ponto Central com Efeito de Pulso */}
<div className="absolute left-1/2 transform -translate-x-1/2 w-4 h-4 z-20 hidden md:block">
<motion.div
initial={{ scale: 0 }}
whileInView={{ scale: 1 }}
className={cn("w-full h-full rounded-full ring-4 ring-white dark:ring-[#030712] shadow-sm", colorMap[step.color as keyof typeof colorMap].split(' ')[0])}
/>
</div>
<div className="hidden md:block w-[45%]" />
</div>
);
}
+140 -141
View File
@@ -1,159 +1,158 @@
"use client";
import { Users, Heart, Zap, BookOpen, Baby, Dumbbell } from "lucide-react";
import React from "react";
import { motion } from "framer-motion";
import { Heart, Zap, BookOpen, Baby, Dumbbell, ArrowRight, ShieldCheck } from "lucide-react";
import { cn } from "@/lib/utils";
const PERSONAS = [
{
id: "parents",
title: "Pais e Mães",
tagline: "Segurança familiar",
description: "Decifre rótulos complexos e garanta que o lanche escolar seja livre de ingredientes ultraprocessados ocultos.",
icon: Baby,
color: "text-pink-500",
bg: "bg-pink-500/10",
border: "hover:border-pink-500/30",
features: ["Identificação de Alérgenos", "Nutri-Score Infantil", "Educação Nutricional"]
},
{
id: "athletes",
title: "Atletas",
tagline: "Performance Máxima",
description: "Otimize sua composição corporal monitorando densidade calórica e a qualidade dos macronutrientes em tempo real.",
icon: Dumbbell,
color: "text-emerald-500",
bg: "bg-emerald-500/10",
border: "hover:border-emerald-500/30",
features: ["Monitoramento de Macros", "Foco em Bio-disponibilidade", "Zero Açúcares Ocultos"]
},
{
id: "allergic",
title: "Alérgicos",
tagline: "Risco Zero",
description: "Sistemas de alerta para contaminação cruzada e componentes críticos. Segurança total na palma da sua mão.",
icon: ShieldCheck,
color: "text-orange-500",
bg: "bg-orange-500/10",
border: "hover:border-orange-500/30",
features: ["Glúten & Lactose Tracker", "Traços de Alérgenos", "Scan de Segurança"]
},
{
id: "conscious",
title: "Consumidores",
tagline: "Decisão Crítica",
description: "Para quem questiona a indústria. Acesse a lista real de ingredientes e a origem dos dados de forma aberta.",
icon: BookOpen,
color: "text-blue-500",
bg: "bg-blue-500/10",
border: "hover:border-blue-500/30",
features: ["Análise de Aditivos", "Comparação de SKUs", "Transparência ODBL"]
}
];
export function TargetAudienceSection() {
return (
<section className="py-20 bg-white dark:bg-gray-900">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white mb-6">
Para quem é o{" "}
<span className="bg-gradient-to-r from-blue-600 to-green-600 bg-clip-text text-transparent">
NutriScan?
</span>
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Se você se preocupa com o que coloca no prato, o NutriScan foi feito
pensando em você.
<section className="py-32 bg-white dark:bg-[#030712] relative overflow-hidden transition-colors duration-500">
<div className="max-w-7xl mx-auto px-6 relative z-10">
{/* Header com Motion Stagger */}
<div className="text-center mb-24">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="text-4xl md:text-6xl font-black text-gray-900 dark:text-white mb-6 tracking-tighter"
>
Projetado para <span className="bg-gradient-to-r from-blue-600 to-emerald-500 bg-clip-text text-transparent">Cidadãos Conscientes</span>
</motion.h2>
<p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto font-medium">
Se a transparência é um requisito para sua mesa, o NutriScan é sua ferramenta de governança alimentar.
</p>
</div>
{/* Persona Cards */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 mb-16">
{/* Pais */}
<div className="bg-gradient-to-br from-pink-50 to-pink-100 dark:from-pink-900/20 dark:to-pink-800/20 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-pink-100 dark:bg-pink-900/30 rounded-2xl flex items-center justify-center mb-4">
<Users className="w-8 h-8 text-pink-600 dark:text-pink-400" />
</div>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-3">
Pais e Mães
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
&ldquo;Se você já se preocupou com os ingredientes do lanche da
escola...&rdquo;
</p>
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1">
<li>• Identificar alérgenos</li>
<li>• Escolher lanches saudáveis</li>
<li>• Educar crianças sobre nutrição</li>
</ul>
</div>
{/* Atletas */}
<div className="bg-gradient-to-br from-green-50 to-green-100 dark:from-green-900/20 dark:to-green-800/20 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-2xl flex items-center justify-center mb-4">
<Dumbbell className="w-8 h-8 text-green-600 dark:text-green-400" />
</div>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-3">
Atletas
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
&ldquo;Se você já precisou otimizar sua alimentação para
performance...&rdquo;
</p>
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1">
<li>• Monitorar macronutrientes</li>
<li>• Evitar ingredientes proibidos</li>
<li>• Timing nutricional</li>
</ul>
</div>
{/* Alérgicos */}
<div className="bg-gradient-to-br from-orange-50 to-orange-100 dark:from-orange-900/20 dark:to-orange-800/20 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-orange-100 dark:bg-orange-900/30 rounded-2xl flex items-center justify-center mb-4">
<Heart className="w-8 h-8 text-orange-600 dark:text-orange-400" />
</div>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-3">
Pessoas com Alergias
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
&ldquo;Se você já desistiu de uma compra por não saber se era
seguro...&rdquo;
</p>
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1">
<li>• Detectar alérgenos ocultos</li>
<li>• Verificar contaminação cruzada</li>
<li>• Segurança alimentar</li>
</ul>
</div>
{/* Curiosos */}
<div className="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-900/20 dark:to-blue-800/20 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-1">
<div className="w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-2xl flex items-center justify-center mb-4">
<BookOpen className="w-8 h-8 text-blue-600 dark:text-blue-400" />
</div>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-3">
Consumidores Conscientes
</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">
&ldquo;Se você já quis entender o que realmente está
comendo...&rdquo;
</p>
<ul className="text-sm text-gray-600 dark:text-gray-400 space-y-1">
<li>• Aprender sobre ingredientes</li>
<li>• Comparar produtos</li>
<li>• Tomar decisões informadas</li>
</ul>
</div>
</div>
{/* Identification Section */}
<div className="bg-gradient-to-r from-blue-600 to-green-600 rounded-3xl p-8 text-white shadow-2xl">
<div className="text-center">
<h3 className="text-3xl font-bold mb-4">
Isso é para{" "}
<span className="underline decoration-2 decoration-yellow-400">
VOCÊ
{/* Persona Bento Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-24">
{PERSONAS.map((persona, i) => (
<motion.div
key={persona.id}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: i * 0.1 }}
viewport={{ once: true }}
className={cn(
"group relative p-8 rounded-[2.5rem] bg-gray-50 dark:bg-gray-900/50 border border-gray-100 dark:border-gray-800 transition-all duration-500",
persona.border,
"hover:shadow-2xl hover:shadow-gray-200 dark:hover:shadow-none"
)}
>
<div className={cn("w-14 h-14 rounded-2xl flex items-center justify-center mb-8 transition-transform group-hover:scale-110", persona.bg)}>
<persona.icon className={cn("w-7 h-7", persona.color)} />
</div>
<span className={cn("text-[10px] font-black uppercase tracking-[0.2em] mb-2 block", persona.color)}>
{persona.tagline}
</span>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4 tracking-tight">
{persona.title}
</h3>
<p className="text-sm text-gray-600 dark:text-gray-400 leading-relaxed mb-8">
{persona.description}
</p>
<ul className="space-y-3">
{persona.features.map(f => (
<li key={f} className="flex items-center gap-2 text-xs font-bold text-gray-500 dark:text-gray-500">
<div className={cn("w-1 h-1 rounded-full", persona.bg.replace('/10', ''))} />
{f}
</li>
))}
</ul>
</motion.div>
))}
</div>
{/* High-Impact Callout: Glassmorphism Card */}
<motion.div
initial={{ opacity: 0, scale: 0.98 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
className="relative rounded-[3rem] bg-gradient-to-br from-blue-600 to-emerald-600 p-1 md:p-px shadow-3xl"
>
<div className="bg-white/5 dark:bg-black/20 backdrop-blur-3xl rounded-[2.9rem] p-10 md:p-16 text-center text-white">
<h3 className="text-3xl md:text-5xl font-black mb-6 tracking-tighter">
A informação alimentar é um <span className="text-yellow-400">Direito Universal</span>
</h3>
<p className="text-xl text-blue-100 mb-8 max-w-4xl mx-auto">
Se você já se pegou lendo rótulos sem entender nada, se já
desistiu de uma compra por não saber se aquele produto era
adequado, ou se simplesmente quer ter mais controle sobre sua
alimentação, o NutriScan foi feito pensando em você.
<p className="text-blue-50 text-lg md:text-xl mb-12 max-w-4xl mx-auto leading-relaxed opacity-90">
Se você busca soberania sobre suas escolhas, o NutriScan é o seu protocolo de acesso à verdade. Sem interesses corporativos, apenas dados puros e auditáveis.
</p>
{/* Interactive Elements */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 mt-8">
<div className="bg-white/20 rounded-xl p-6 backdrop-blur-sm">
<Zap className="w-8 h-8 mx-auto mb-3" />
<h4 className="font-semibold mb-2">Rápido</h4>
<p className="text-blue-100 text-sm">Informações em segundos</p>
</div>
<div className="bg-white/20 rounded-xl p-6 backdrop-blur-sm">
<Heart className="w-8 h-8 mx-auto mb-3" />
<h4 className="font-semibold mb-2">Confiável</h4>
<p className="text-blue-100 text-sm">
Dados verificados pela comunidade
</p>
</div>
<div className="bg-white/20 rounded-xl p-6 backdrop-blur-sm">
<Baby className="w-8 h-8 mx-auto mb-3" />
<h4 className="font-semibold mb-2">Simples</h4>
<p className="text-blue-100 text-sm">
Interface intuitiva e clara
</p>
</div>
<div className="flex flex-wrap justify-center gap-6">
{[
{ icon: Zap, label: "Baixa Latência", text: "Dados em < 2s" },
{ icon: Heart, label: "Auditável", text: "Open Source" },
{ icon: ShieldCheck, label: "Privacidade", text: "No Tracking" },
].map((item, i) => (
<div key={i} className="flex flex-col items-center gap-2 bg-white/10 px-8 py-6 rounded-2xl border border-white/10 backdrop-blur-md">
<item.icon className="w-6 h-6 text-yellow-400" />
<span className="text-xs font-black uppercase tracking-widest">{item.label}</span>
<span className="text-[10px] text-blue-100 opacity-70 uppercase">{item.text}</span>
</div>
))}
</div>
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="mt-16 inline-flex items-center gap-3 px-10 py-5 bg-white text-blue-600 rounded-2xl font-black uppercase tracking-widest text-sm shadow-xl shadow-black/10 transition-all hover:bg-yellow-400 hover:text-black"
>
Iniciar Scan Agora <ArrowRight size={18} />
</motion.button>
</div>
</div>
</motion.div>
{/* Call to Action */}
<div className="text-center mt-16">
<p className="text-2xl font-medium text-gray-700 dark:text-gray-300 mb-8">
Não importa quem você é ou qual sua situação - o direito à
informação alimentar é universal.
</p>
<div className="inline-flex items-center gap-2 text-lg text-gray-600 dark:text-gray-400">
<span>
Junte-se a milhares de pessoas que já fazem escolhas mais
conscientes
</span>
<span className="text-green-500">→</span>
</div>
</div>
</div>
</section>
);
}
}
+150 -181
View File
@@ -1,204 +1,173 @@
"use client";
import { Shield, Eye, Gift, Lock, CheckCircle, Star } from "lucide-react";
import React from "react";
import { motion } from "framer-motion";
import {
ShieldCheck, Eye, Gift, Lock,
CheckCircle2, Github, Database,
Scale, Terminal, Fingerprint
} from "lucide-react";
import { cn } from "@/lib/utils";
// 1. Data Contracts - Centralizando a lógica para fácil manutenção
const PROTOCOLS = [
{
title: "Dados Abertos",
desc: "Acesso irrestrito a metadados alimentares sob licença ODbL.",
icon: Eye,
color: "text-blue-500",
bg: "bg-blue-500/10",
tag: "Open Data"
},
{
title: "Gratuidade Perpétua",
desc: "Arquitetura sustentada por comunidade, livre de paywalls ou ads.",
icon: Gift,
color: "text-emerald-500",
bg: "bg-emerald-500/10",
tag: "Non-Profit"
},
{
title: "Privacy by Design",
desc: "Zero-tracking. Coleta mínima de dados conforme LGPD/GDPR.",
icon: Lock,
color: "text-purple-500",
bg: "bg-purple-500/10",
tag: "Security"
},
{
title: "Alta Fidelidade",
desc: "Algoritmos de validação cruzada para garantir integridade.",
icon: ShieldCheck,
color: "text-orange-500",
bg: "bg-orange-500/10",
tag: "Accuracy"
}
];
export function ValuesSection() {
return (
<section className="py-20 bg-gray-50 dark:bg-gray-800">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16">
<h2 className="text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white mb-6">
Nossos{" "}
<span className="bg-gradient-to-r from-blue-600 to-green-600 bg-clip-text text-transparent">
valores
</span>
<section className="py-32 bg-white dark:bg-[#030712] relative overflow-hidden transition-colors duration-500">
{/* Background Decor - Grid de Engenharia sutil */}
<div className="absolute inset-0 bg-[linear-gradient(to_right,#80808008_1px,transparent_1px),linear-gradient(to_bottom,#80808008_1px,transparent_1px)] bg-[size:32px_32px]" />
<div className="max-w-7xl mx-auto px-6 relative z-10">
{/* Header - Tom de Autoridade */}
<div className="text-center mb-24">
<motion.div
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-500/5 border border-blue-500/20 text-blue-600 dark:text-blue-400 text-[10px] font-black uppercase tracking-[0.3em] mb-6"
>
<Scale size={12} /> Compliance & Ethics
</motion.div>
<h2 className="text-4xl md:text-6xl font-black text-gray-900 dark:text-white mb-6 tracking-tighter">
Protocolos de <span className="bg-gradient-to-r from-blue-600 to-emerald-500 bg-clip-text text-transparent">Integridade</span>
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Transparência em primeiro lugar. Não escondemos nada, não maquiamos
informações.
<p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto font-medium">
Nossa governança é pautada pela transparência radical. Não maquiamos dados; entregamos a verdade técnica.
</p>
</div>
{/* Main Promise */}
<div className="bg-gradient-to-r from-blue-600 to-green-600 rounded-3xl p-8 text-white shadow-2xl mb-16">
<div className="text-center">
<div className="w-20 h-20 bg-white/20 rounded-2xl flex items-center justify-center mx-auto mb-6">
<Shield className="w-10 h-10" />
</div>
<h3 className="text-3xl font-bold mb-4">100% Transparente</h3>
<p className="text-xl text-blue-100 max-w-3xl mx-auto mb-8">
Todos os dados que você encontra aqui são colaborativos e abertos.
O que você vê é o que existe: informações reais, fornecidas por
uma comunidade global comprometida com a verdade.
</p>
</div>
</div>
{/* Values Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 mb-16">
{/* Open Data */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-shadow">
<div className="w-12 h-12 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center mb-4">
<Eye className="w-6 h-6 text-blue-600 dark:text-blue-400" />
</div>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-3">
Dados Abertos
</h3>
<p className="text-gray-600 dark:text-gray-400 text-sm mb-4">
Todas as informações são colaborativas e verificadas pela
comunidade global.
</p>
<div className="flex items-center text-blue-600 dark:text-blue-400 text-sm font-medium">
<CheckCircle className="w-4 h-4 mr-2" />
Sem informações escondidas
</div>
</div>
{/* Free Forever */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-shadow">
<div className="w-12 h-12 bg-green-100 dark:bg-green-900/30 rounded-lg flex items-center justify-center mb-4">
<Gift className="w-6 h-6 text-green-600 dark:text-green-400" />
</div>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-3">
Gratuito Sempre
</h3>
<p className="text-gray-600 dark:text-gray-400 text-sm mb-4">
Sem custos ocultos, sem assinaturas, sem pegadinhas. Acesso
completo para sempre.
</p>
<div className="flex items-center text-green-600 dark:text-green-400 text-sm font-medium">
<CheckCircle className="w-4 h-4 mr-2" />
Sem anúncios invasivos
</div>
</div>
{/* Privacy */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-shadow">
<div className="w-12 h-12 bg-purple-100 dark:bg-purple-900/30 rounded-lg flex items-center justify-center mb-4">
<Lock className="w-6 h-6 text-purple-600 dark:text-purple-400" />
</div>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-3">
Privacidade
</h3>
<p className="text-gray-600 dark:text-gray-400 text-sm mb-4">
Não coletamos dados pessoais desnecessários. Sua privacidade é
respeitada.
</p>
<div className="flex items-center text-purple-600 dark:text-purple-400 text-sm font-medium">
<CheckCircle className="w-4 h-4 mr-2" />
Sem rastreamento invasivo
</div>
</div>
{/* Quality */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-6 shadow-lg hover:shadow-xl transition-shadow">
<div className="w-12 h-12 bg-orange-100 dark:bg-orange-900/30 rounded-lg flex items-center justify-center mb-4">
<Star className="w-6 h-6 text-orange-600 dark:text-orange-400" />
</div>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-3">
Qualidade
</h3>
<p className="text-gray-600 dark:text-gray-400 text-sm mb-4">
Informações verificadas por especialistas e comunidade
comprometida com a precisão.
</p>
<div className="flex items-center text-orange-600 dark:text-orange-400 text-sm font-medium">
<CheckCircle className="w-4 h-4 mr-2" />
Dados verificados
</div>
</div>
</div>
{/* Open Source Badge */}
<div className="bg-white dark:bg-gray-900 rounded-2xl p-8 shadow-lg text-center">
<div className="flex items-center justify-center mb-6">
<div className="w-16 h-16 bg-gradient-to-br from-blue-500 to-green-500 rounded-2xl flex items-center justify-center mr-4">
<Shield className="w-8 h-8 text-white" />
</div>
<div>
<h3 className="text-2xl font-bold text-gray-900 dark:text-white">
Open Source & Open Data
{/* Values Grid - Bento Box Style */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-20">
{PROTOCOLS.map((item, i) => (
<motion.div
key={item.title}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: i * 0.1 }}
viewport={{ once: true }}
className="group p-8 rounded-[2.5rem] bg-gray-50 dark:bg-gray-900/40 border border-gray-100 dark:border-gray-800 hover:border-blue-500/30 transition-all duration-500"
>
<div className={cn("w-14 h-14 rounded-2xl flex items-center justify-center mb-8 transition-transform group-hover:scale-110", item.bg)}>
<item.icon className={cn("w-7 h-7", item.color)} />
</div>
<span className={cn("text-[10px] font-mono font-bold uppercase tracking-widest mb-2 block", item.color)}>
{item.tag}
</span>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-4 tracking-tight">
{item.title}
</h3>
<p className="text-gray-600 dark:text-gray-400">
Transparência total do código e dados
<p className="text-sm text-gray-500 dark:text-gray-400 leading-relaxed font-medium mb-6">
{item.desc}
</p>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="bg-blue-50 dark:bg-blue-900/20 rounded-xl p-4">
<h4 className="font-semibold text-blue-900 dark:text-blue-100 mb-2">
Código Aberto
</h4>
<p className="text-sm text-blue-700 dark:text-blue-300">
Todo o código está disponível no GitHub para inspeção e
contribuição
</p>
</div>
<div className="bg-green-50 dark:bg-green-900/20 rounded-xl p-4">
<h4 className="font-semibold text-green-900 dark:text-green-100 mb-2">
Dados Colaborativos
</h4>
<p className="text-sm text-green-700 dark:text-green-300">
Base de dados construída e mantida por milhares de voluntários
</p>
</div>
<div className="bg-purple-50 dark:bg-purple-900/20 rounded-xl p-4">
<h4 className="font-semibold text-purple-900 dark:text-purple-100 mb-2">
Sem Fins Lucrativos
</h4>
<p className="text-sm text-purple-700 dark:text-purple-300">
Desenvolvido com amor pela comunidade, para a comunidade
</p>
</div>
</div>
<div className="flex items-center gap-2 text-[10px] font-black text-gray-400 uppercase tracking-tighter group-hover:text-blue-500 transition-colors">
<CheckCircle2 size={12} className="text-emerald-500" /> System Verified
</div>
</motion.div>
))}
</div>
{/* Trust Indicators */}
<div className="mt-16 text-center">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-8">
Por que confiar no NutriScan?
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm">
<div className="text-3xl font-bold text-blue-600 dark:text-blue-400 mb-2">
2M+
{/* OSS Deep Dive - O Diferencial Sênior */}
<motion.div
initial={{ opacity: 0, scale: 0.98 }}
whileInView={{ opacity: 1, scale: 1 }}
className="relative rounded-[3rem] bg-slate-950 border border-slate-800 p-10 md:p-16 overflow-hidden shadow-3xl"
>
<div className="absolute top-0 right-0 w-full h-full bg-[radial-gradient(circle_at_top_right,#1e293b,transparent)] opacity-50" />
<div className="relative z-10 flex flex-col lg:flex-row gap-12 items-center">
<div className="flex-1 space-y-6">
<div className="flex items-center gap-4">
<div className="p-3 bg-white/10 rounded-2xl backdrop-blur-md">
<Github className="text-white w-8 h-8" />
</div>
<div>
<h3 className="text-3xl font-black text-white tracking-tighter">Open Source Manifesto</h3>
<p className="text-blue-400 font-mono text-xs uppercase tracking-widest mt-1">Status: Fully Auditability</p>
</div>
</div>
<p className="text-gray-600 dark:text-gray-400">
Produtos verificados
<p className="text-slate-400 text-lg leading-relaxed">
Acreditamos que algoritmos que impactam a saúde pública devem ser de domínio público. Nosso código é aberto para inspeção, garantindo que não existam backdoors ou manipulação de dados comerciais.
</p>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 pt-4">
{[
{ label: "Core Logic", val: "MIT Licensed", icon: Terminal },
{ label: "Dataset", val: "ODbL Support", icon: Database },
{ label: "Auth", val: "Privacy-First", icon: Fingerprint },
].map((spec) => (
<div key={spec.label} className="p-4 bg-white/5 rounded-2xl border border-white/10">
<spec.icon className="w-4 h-4 text-blue-500 mb-2" />
<div className="text-xs font-black text-white uppercase tracking-widest mb-1">{spec.label}</div>
<div className="text-[10px] font-mono text-slate-500 uppercase">{spec.val}</div>
</div>
))}
</div>
</div>
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm">
<div className="text-3xl font-bold text-green-600 dark:text-green-400 mb-2">
100+
</div>
<p className="text-gray-600 dark:text-gray-400">
Países cobertos
</p>
</div>
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm">
<div className="text-3xl font-bold text-purple-600 dark:text-purple-400 mb-2">
24/7
</div>
<p className="text-gray-600 dark:text-gray-400">
Disponível sempre
</p>
</div>
<div className="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-sm">
<div className="text-3xl font-bold text-orange-600 dark:text-orange-400 mb-2">
100%
</div>
<p className="text-gray-600 dark:text-gray-400">Transparente</p>
{/* GitHub Stats Mockup / Placeholder visual */}
<div className="w-full lg:w-72 h-48 bg-slate-900/50 rounded-3xl border border-slate-800 p-6 font-mono text-[10px] space-y-3 relative">
<div className="flex justify-between text-slate-500 border-b border-slate-800 pb-2">
<span>nutriscan-core / main</span>
<span className="text-emerald-500">online</span>
</div>
<div className="space-y-1">
<p className="text-blue-400">$ npm run audit</p>
<p className="text-slate-400"> Scanning dependencies...</p>
<p className="text-emerald-500"> 0 vulnerabilities found</p>
<p className="text-slate-400"> Data Integrity: 100% Verified</p>
</div>
<div className="absolute bottom-4 right-6 animate-pulse">
<div className="w-3 h-3 bg-emerald-500 rounded-full shadow-[0_0_10px_rgba(16,185,129,0.5)]" />
</div>
</div>
</div>
</motion.div>
{/* Final Trust Verification */}
<div className="mt-24 grid grid-cols-2 md:grid-cols-4 gap-12 opacity-50 grayscale hover:grayscale-0 transition-all duration-700">
{/* Aqui você colocaria logotipos de bases de dados ou menções técnicas (ex: Open Food Facts, GitHub, Next.js, Radix UI) */}
<div className="text-center font-mono text-[10px] font-black uppercase tracking-[0.4em] text-gray-500">Open Food Facts</div>
<div className="text-center font-mono text-[10px] font-black uppercase tracking-[0.4em] text-gray-500">MIT License</div>
<div className="text-center font-mono text-[10px] font-black uppercase tracking-[0.4em] text-gray-500">Privacy First</div>
<div className="text-center font-mono text-[10px] font-black uppercase tracking-[0.4em] text-gray-500">ODbL Data</div>
</div>
</div>
</section>
);
}
}