All Prompts
All Prompts

Play2LearnLandingPage
Лендинг Play2Learn: обучение безопасности, операциям и онбордингу. Темный дизайн, симуляции, четкое ценностное предложение для бизнеса.
by Thiago NascimentoLive Preview
Prompt
# Play2LearnLandingPage
You are given a task to integrate an existing React component in the codebase
~~~/README.md
# Play2Learn Landing Page Component
A high-conversion landing page for Play2Learn's Industry vertical, focused on safety training, operations, and onboarding.
## Features
- **Modern Dark Theme**: Uses the brand's dark aesthetic with neon accents (#0000ee, #6334ff).
- **Responsive Design**: Fully responsive for mobile, tablet, and desktop.
- **Scroll Animations**: Engaging entry animations using Framer Motion.
- **Interactive Elements**: Hover effects, mocked-up UI components, and smooth scroll.
- **Sections**:
- Hero with value proposition
- Problem identification
- Solution (Squads + Mentors)
- Step-by-step methodology
- Benefits grid
- Social proof
- Target audience segment
- Strong Call to Action (CTA)
## Usage
```tsx
import { Play2LearnLandingPage } from '@/sd-components/2d2a13cb-26eb-48ee-b2b8-b2f83dbacb5d';
export default function Page() {
return <Play2LearnLandingPage />;
}
```
## Props
This component currently accepts no props as it is a full-page layout, but can be easily refactored to accept content via props.
~~~
~~~/src/App.tsx
import React from 'react';
import Play2LearnLandingPage from './Component';
export default function App() {
return (
<Play2LearnLandingPage />
);
}
~~~
~~~/package.json
{
"name": "play2learn-landing-page",
"description": "Landing page for Play2Learn Industry vertical",
"dependencies": {
"lucide-react": "^0.300.0",
"framer-motion": "^10.16.4",
"clsx": "^2.1.0",
"tailwind-merge": "^2.2.0",
"react-router-dom": "^6.21.1"
}
}
~~~
~~~/src/Component.tsx
import React, { useState, useEffect } from 'react';
import { motion, AnimatePresence, useScroll, useTransform } from 'framer-motion';
import {
Shield,
Users,
BrainCircuit,
Activity,
BarChart3,
Clock,
CheckCircle2,
AlertTriangle,
Menu,
X,
ChevronRight,
Zap,
HardHat,
Factory,
ClipboardCheck,
Smartphone,
Trophy,
ArrowRight
} from 'lucide-react';
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';
// Utility for class merging
function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
// --- Components ---
const Navbar = () => {
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 20);
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
return (
<nav className={cn(
"fixed top-0 left-0 right-0 z-50 transition-all duration-300 border-b border-transparent",
isScrolled ? "bg-background/80 backdrop-blur-md border-white/10" : "bg-transparent"
)}>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex items-center justify-between h-20">
<div className="flex-shrink-0 flex items-center gap-2">
<img
src="https://framerusercontent.com/images/3vzS5kugtW8u3ZiY5G5Psz2Jpnw.svg"
alt="Play2Learn Logo"
className="h-8 w-auto invert brightness-0 filter"
style={{ filter: 'invert(1) brightness(2)' }} // Ensure logo is white
/>
</div>
<div className="hidden md:block">
<div className="ml-10 flex items-baseline space-x-8">
<a href="#solucao" className="text-sm font-medium text-white/70 hover:text-white transition-colors">Solução</a>
<a href="#como-funciona" className="text-sm font-medium text-white/70 hover:text-white transition-colors">Como Funciona</a>
<a href="#beneficios" className="text-sm font-medium text-white/70 hover:text-white transition-colors">Benefícios</a>
<button className="bg-primary hover:bg-primary/90 text-white px-5 py-2.5 rounded-full text-sm font-medium transition-all shadow-[0_0_20px_rgba(0,0,238,0.3)] hover:shadow-[0_0_30px_rgba(0,0,238,0.5)]">
Agendar conversa
</button>
</div>
</div>
<div className="md:hidden">
<button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className="text-white p-2"
>
{isMobileMenuOpen ? <X size={24} /> : <Menu size={24} />}
</button>
</div>
</div>
</div>
<AnimatePresence>
{isMobileMenuOpen && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: 'auto' }}
exit={{ opacity: 0, height: 0 }}
className="md:hidden bg-background border-b border-white/10 overflow-hidden"
>
<div className="px-4 pt-2 pb-6 space-y-4">
<a href="#solucao" className="block text-base font-medium text-white/70 hover:text-white" onClick={() => setIsMobileMenuOpen(false)}>Solução</a>
<a href="#como-funciona" className="block text-base font-medium text-white/70 hover:text-white" onClick={() => setIsMobileMenuOpen(false)}>Como Funciona</a>
<a href="#beneficios" className="block text-base font-medium text-white/70 hover:text-white" onClick={() => setIsMobileMenuOpen(false)}>Benefícios</a>
<button className="w-full mt-4 bg-primary hover:bg-primary/90 text-white px-5 py-3 rounded-lg text-base font-medium transition-all">
Agendar conversa
</button>
</div>
</motion.div>
)}
</AnimatePresence>
</nav>
);
};
const Hero = () => {
return (
<section className="relative min-h-screen flex items-center pt-20 overflow-hidden">
{/* Background Effects */}
<div className="absolute top-0 left-0 w-full h-full overflow-hidden z-0">
<div className="absolute top-[-10%] left-[20%] w-[500px] h-[500px] bg-primary/20 rounded-full blur-[120px]" />
<div className="absolute bottom-[10%] right-[10%] w-[600px] h-[600px] bg-secondary/10 rounded-full blur-[150px]" />
<div className="absolute top-[40%] left-[-10%] w-[400px] h-[400px] bg-accent/10 rounded-full blur-[100px]" />
{/* Grid Pattern */}
<div className="absolute inset-0 bg-[linear-gradient(rgba(255,255,255,0.03)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,0.03)_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_50%_at_50%_50%,#000_70%,transparent_100%)]" />
</div>
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col items-center text-center">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/5 border border-white/10 text-accent text-sm font-medium mb-8"
>
<span className="flex h-2 w-2 rounded-full bg-accent animate-pulse"></span>
Play2Learn para Indústrias
</motion.div>
<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.1 }}
className="text-5xl md:text-7xl font-bold tracking-tight text-white mb-6 max-w-5xl leading-[1.1]"
>
Transforme Treinamentos de <span className="text-transparent bg-clip-text bg-gradient-to-r from-primary via-secondary to-accent">Segurança</span> em Performance de Campo
</motion.h1>
<motion.p
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
className="text-xl text-white/60 max-w-3xl mb-10 leading-relaxed"
>
Squads + Mentores de IA que transformam normas em prática diária, com dados de comportamento e redução real de acidentes.
</motion.p>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.3 }}
className="flex flex-col sm:flex-row gap-4 w-full justify-center"
>
<button className="bg-white text-black px-8 py-4 rounded-full text-lg font-semibold hover:bg-gray-200 transition-all flex items-center justify-center gap-2">
Agendar conversa de 15 minutos
<ArrowRight size={20} />
</button>
<button className="bg-white/5 border border-white/10 text-white px-8 py-4 rounded-full text-lg font-semibold hover:bg-white/10 transition-all backdrop-blur-sm">
Ver demonstração
</button>
</motion.div>
{/* Floating UI Elements Mockup */}
<motion.div
initial={{ opacity: 0, y: 40 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.5 }}
className="mt-20 relative w-full max-w-5xl aspect-[16/9] bg-gradient-to-b from-white/5 to-transparent rounded-t-3xl border-t border-x border-white/10 p-4 shadow-2xl"
>
<div className="absolute inset-0 bg-gradient-to-t from-[#010101] via-transparent to-transparent z-20" />
<div className="relative z-10 w-full h-full rounded-xl overflow-hidden bg-[#0A090D] border border-white/10 flex">
{/* Sidebar */}
<div className="w-64 border-r border-white/5 p-4 hidden md:flex flex-col gap-4">
<div className="h-8 w-24 bg-white/10 rounded-md mb-4"/>
{[1,2,3,4].map(i => (
<div key={i} className="flex items-center gap-3 p-2 rounded-lg hover:bg-white/5 transition-colors">
<div className="w-8 h-8 rounded-full bg-primary/20 flex items-center justify-center">
<Users size={14} className="text-primary"/>
</div>
<div className="h-3 w-20 bg-white/10 rounded-full"/>
</div>
))}
</div>
{/* Main Content */}
<div className="flex-1 p-8 grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="space-y-6">
<div className="flex items-center gap-4">
<div className="w-12 h-12 rounded-full bg-gradient-to-br from-primary to-secondary flex items-center justify-center text-white">
<BrainCircuit size={24} />
</div>
<div>
<h3 className="text-white font-medium">Mentor de Segurança</h3>
<p className="text-white/40 text-sm">Squad Manutenção - Turno B</p>
</div>
</div>
<div className="bg-white/5 border border-white/10 rounded-2xl p-4 rounded-tl-none">
<p className="text-white/80 text-sm leading-relaxed">
Notei que a equipe teve dúvidas sobre o bloqueio de energia na última manutenção. Vamos simular esse cenário rapidinho antes de descer para a área?
</p>
</div>
<div className="flex gap-2">
<div className="flex-1 bg-primary/10 border border-primary/20 hover:bg-primary/20 cursor-pointer rounded-xl p-3 transition-colors">
<p className="text-primary text-sm font-medium text-center">Simular Bloqueio</p>
</div>
<div className="flex-1 bg-white/5 border border-white/10 hover:bg-white/10 cursor-pointer rounded-xl p-3 transition-colors">
<p className="text-white text-sm font-medium text-center">Revisar POP</p>
</div>
</div>
</div>
<div className="bg-white/5 rounded-xl border border-white/10 p-6">
<h4 className="text-white mb-4 flex items-center gap-2">
<Activity size={16} className="text-green-500" />
Risco Comportamental
</h4>
<div className="space-y-4">
{[
{ label: 'Uso de EPIs', val: 92, color: 'bg-green-500' },
{ label: 'Permissão de Trabalho', val: 78, color: 'bg-yellow-500' },
{ label: 'Bloqueio e Etiquetagem', val: 85, color: 'bg-green-500' }
].map((item, idx) => (
<div key={idx}>
<div className="flex justify-between text-xs text-white/60 mb-1">
<span>{item.label}</span>
<span>{item.val}%</span>
</div>
<div className="h-2 bg-white/10 rounded-full overflow-hidden">
<motion.div
initial={{ width: 0 }}
animate={{ width: `${item.val}%` }}
transition={{ duration: 1, delay: 1 + idx * 0.2 }}
className={`h-full ${item.color} rounded-full`}
/>
</div>
</div>
))}
</div>
</div>
</div>
</div>
</motion.div>
</div>
</section>
);
};
const Problem = () => {
const problems = [
{
icon: <CheckCircle2 className="text-red-400" size={32} />,
title: "Treino 'Check na Planilha'",
desc: "O colaborador assiste, assina a lista, mas na prática segue o atalho. Treinamento burocrático que não muda hábito."
},
{
icon: <AlertTriangle className="text-orange-400" size={32} />,
title: "Normas longe da Realidade",
desc: "Normas, PTs e POPs vivem em PDFs e pastas, longe da decisão do operador na hora H quando o risco acontece."
},
{
icon: <BarChart3 className="text-blue-400" size={32} />,
title: "Gestão às Cegas",
desc: "SST só tem dados estatísticos depois do acidente. Não existe visibilidade de comportamento preventivo por turno."
},
{
icon: <Clock className="text-purple-400" size={32} />,
title: "Reciclagens Caras",
desc: "Parar linha e juntar turma é caro. Repetir o mesmo conteúdo para todos é ineficiente e chato."
}
];
return (
<section className="py-24 bg-[#050505] relative border-t border-white/5">
<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 md:text-5xl font-bold text-white mb-6">Por que os treinamentos atuais <span className="text-red-500">não bastam</span></h2>
<p className="text-white/60 text-lg max-w-3xl mx-auto">
Não existe um "simulador de campo" rápido, que faça o operador praticar antes de entrar na área.
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
{problems.map((problem, index) => (
<motion.div
key={index}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1 }}
className="bg-white/5 border border-white/10 rounded-2xl p-6 hover:bg-white/10 transition-colors group"
>
<div className="bg-white/5 w-16 h-16 rounded-xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
{problem.icon}
</div>
<h3 className="text-xl font-semibold text-white mb-3">{problem.title}</h3>
<p className="text-white/60 leading-relaxed">
{problem.desc}
</p>
</motion.div>
))}
</div>
</div>
</section>
);
};
const Solution = () => {
return (
<section id="solucao" className="py-24 relative overflow-hidden">
<div className="absolute inset-0 bg-gradient-to-b from-[#010101] to-[#0A090D]" />
<div className="absolute top-[20%] right-[-10%] w-[500px] h-[500px] bg-primary/10 rounded-full blur-[120px]" />
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="mb-20">
<motion.span
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
className="text-primary font-semibold tracking-wider text-sm uppercase mb-2 block"
>
A Solução
</motion.span>
<h2 className="text-4xl md:text-6xl font-bold text-white mb-6">
Squads + Mentores
</h2>
<p className="text-xl text-white/60 max-w-2xl">
A nova camada de treinamento de segurança que vive onde o risco acontece: na decisão do time.
</p>
</div>
{/* Feature 1: Squads */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16 items-center mb-32">
<motion.div
initial={{ opacity: 0, x: -50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
className="order-2 lg:order-1"
>
<div className="flex items-center gap-3 mb-6">
<div className="p-2 bg-secondary/20 rounded-lg">
<Users className="text-secondary" size={24} />
</div>
<h3 className="text-2xl font-bold text-white">Squads Reais</h3>
</div>
<p className="text-white/70 text-lg mb-6 leading-relaxed">
Com a Play2Learn, você cria Squads que espelham sua operação. Em vez de listas genéricas, organize o treino por quem trabalha junto.
</p>
<ul className="space-y-4">
{[
"Treinamentos Quiz & Roleplay de 5–10 min",
"Materiais e normas da própria planta anexados",
"Focado em Manutenção, Produção, Logística"
].map((item, i) => (
<li key={i} className="flex items-center gap-3 text-white/80">
<CheckCircle2 className="text-green-500 shrink-0" size={20} />
<span>{item}</span>
</li>
))}
</ul>
</motion.div>
<motion.div
initial={{ opacity: 0, x: 50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
className="order-1 lg:order-2 relative"
>
<div className="absolute inset-0 bg-gradient-to-r from-secondary/20 to-accent/20 blur-3xl -z-10" />
<div className="bg-[#0f0e13] border border-white/10 rounded-2xl p-6 shadow-2xl">
<div className="flex justify-between items-center mb-6">
<h4 className="text-white font-semibold">Meus Squads</h4>
<div className="px-3 py-1 bg-green-500/10 text-green-500 text-xs rounded-full">Ativos</div>
</div>
<div className="space-y-3">
{[
{ name: "Manutenção Elétrica - Turno A", members: 12, score: 94, icon: Zap },
{ name: "Operação Linha 04", members: 28, score: 82, icon: Factory },
{ name: "Logística & Expedição", members: 15, score: 88, icon: ClipboardCheck },
{ name: "Terceiros - Limpeza Industrial", members: 8, score: 76, icon: HardHat },
].map((squad, i) => (
<div key={i} className="flex items-center justify-between p-4 bg-white/5 rounded-xl hover:bg-white/10 transition-colors cursor-pointer border border-transparent hover:border-white/10">
<div className="flex items-center gap-4">
<div className="w-10 h-10 rounded-full bg-white/10 flex items-center justify-center text-white">
<squad.icon size={18} />
</div>
<div>
<p className="text-white font-medium">{squad.name}</p>
<p className="text-white/40 text-xs">{squad.members} membros</p>
</div>
</div>
<div className="text-right">
<p className={`font-bold ${squad.score > 90 ? 'text-green-400' : squad.score > 80 ? 'text-blue-400' : 'text-yellow-400'}`}>{squad.score}%</p>
<p className="text-white/30 text-xs">Score</p>
</div>
</div>
))}
</div>
</div>
</motion.div>
</div>
{/* Feature 2: Mentors */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16 items-center">
<motion.div
initial={{ opacity: 0, x: -50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
className="relative"
>
<div className="absolute inset-0 bg-gradient-to-l from-primary/20 to-purple-500/20 blur-3xl -z-10" />
{/* Chat Interface Mockup */}
<div className="bg-[#0f0e13] border border-white/10 rounded-2xl shadow-2xl overflow-hidden max-w-md mx-auto lg:mx-0">
<div className="bg-white/5 p-4 border-b border-white/10 flex items-center gap-3">
<div className="relative">
<div className="w-10 h-10 rounded-full bg-gradient-to-tr from-primary to-accent flex items-center justify-center">
<BrainCircuit size={20} className="text-white" />
</div>
<div className="absolute bottom-0 right-0 w-3 h-3 bg-green-500 border-2 border-[#0f0e13] rounded-full"></div>
</div>
<div>
<h4 className="text-white font-medium text-sm">Mentor SST</h4>
<p className="text-white/40 text-xs">Expert em NR-10 e NR-35</p>
</div>
</div>
<div className="p-4 space-y-4 h-[300px] overflow-y-auto bg-black/20">
<div className="flex gap-3">
<div className="w-8 h-8 rounded-full bg-gradient-to-tr from-primary to-accent shrink-0 flex items-center justify-center text-xs text-white">AI</div>
<div className="bg-white/10 rounded-2xl rounded-tl-none p-3 text-sm text-white/80">
Olá Carlos! Antes de iniciar a manutenção no painel, vamos revisar os 5 passos do bloqueio?
</div>
</div>
<div className="flex gap-3 flex-row-reverse">
<div className="w-8 h-8 rounded-full bg-gray-600 shrink-0 flex items-center justify-center text-xs text-white">C</div>
<div className="bg-primary/20 border border-primary/20 rounded-2xl rounded-tr-none p-3 text-sm text-white/90">
Claro, já estou com o cartão de bloqueio aqui.
</div>
</div>
<div className="flex gap-3">
<div className="w-8 h-8 rounded-full bg-gradient-to-tr from-primary to-accent shrink-0 flex items-center justify-center text-xs text-white">AI</div>
<div className="bg-white/10 rounded-2xl rounded-tl-none p-3 text-sm text-white/80 space-y-2">
<p>Ótimo. Pergunta rápida:</p>
<p className="font-semibold text-white">Se você encontrar um dispositivo já bloqueado por outro colega que não está na área, o que deve fazer?</p>
<div className="grid grid-cols-1 gap-2 mt-2">
<button className="bg-white/5 hover:bg-white/10 border border-white/10 p-2 rounded text-left text-xs transition-colors">A) Remover o bloqueio dele e colocar o meu</button>
<button className="bg-white/5 hover:bg-white/10 border border-white/10 p-2 rounded text-left text-xs transition-colors">B) Aplicar meu bloqueio junto ao dele (multi-lock)</button>
</div>
</div>
</div>
</div>
<div className="p-3 border-t border-white/10 bg-white/5">
<div className="h-10 bg-black/40 rounded-lg border border-white/5"></div>
</div>
</div>
</motion.div>
<motion.div
initial={{ opacity: 0, x: 50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
>
<div className="flex items-center gap-3 mb-6">
<div className="p-2 bg-primary/20 rounded-lg">
<BrainCircuit className="text-primary" size={24} />
</div>
<h3 className="text-2xl font-bold text-white">Mentor por Squad</h3>
</div>
<p className="text-white/70 text-lg mb-6 leading-relaxed">
Cada Squad ganha um agente de IA configurado com a sua linguagem, normas e prioridades. O "Expert de bolso".
</p>
<ul className="space-y-6">
{[
{
title: "Conversão Automática",
desc: "Transforma seus POPs e NRs em jogos práticos sem trabalho manual."
},
{
title: "Simulação Real",
desc: "Faz perguntas situacionais ('está usando todos os EPIs?') e dá feedback imediato."
},
{
title: "Insights de Comportamento",
desc: "Descobre onde o turno erra mais e quais normas são menos compreendidas."
}
].map((item, i) => (
<li key={i} className="flex gap-4">
<div className="w-1.5 h-1.5 rounded-full bg-primary mt-2.5 shrink-0" />
<div>
<strong className="block text-white mb-1">{item.title}</strong>
<span className="text-white/60 text-sm">{item.desc}</span>
</div>
</li>
))}
</ul>
</motion.div>
</div>
</div>
</section>
);
};
const Steps = () => {
const steps = [
{ num: "01", title: "Escolha a Squad", desc: "Defina a área de maior dor (ex: manutenção, linha crítica)." },
{ num: "02", title: "Suba os Materiais", desc: "POPs, PTs, fotos, vídeos. Nossa IA processa tudo." },
{ num: "03", title: "Configure o Mentor", desc: "Defina o papel (ex: 'Técnico Sênior') e o tom de voz." },
{ num: "04", title: "Crie Treinamentos", desc: "Geramos 2-3 jogos de Roleplay adaptados à sua realidade." },
{ num: "05", title: "Rode o Piloto", desc: "Libere para os colaboradores e acompanhe os dados reais." },
];
return (
<section id="como-funciona" className="py-24 bg-[#050505] border-y border-white/5">
<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 md:text-5xl font-bold text-white mb-6">Como funciona</h2>
<p className="text-white/60">Do treinamento ao dado em 5 passos simples</p>
</div>
<div className="relative">
{/* Connecting Line (Desktop) */}
<div className="hidden md:block absolute top-8 left-0 w-full h-0.5 bg-white/10" />
<div className="grid grid-cols-1 md:grid-cols-5 gap-8">
{steps.map((step, i) => (
<motion.div
key={i}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: i * 0.1 }}
className="relative flex flex-col items-center text-center group"
>
<div className="w-16 h-16 rounded-full bg-[#0A090D] border border-white/20 flex items-center justify-center text-xl font-bold text-white mb-6 relative z-10 group-hover:border-primary group-hover:bg-primary group-hover:text-white transition-all shadow-[0_0_0_8px_rgba(5,5,5,1)]">
{step.num}
</div>
<h3 className="text-lg font-semibold text-white mb-2">{step.title}</h3>
<p className="text-sm text-white/50">{step.desc}</p>
</motion.div>
))}
</div>
</div>
<div className="mt-16 text-center">
<button className="text-primary hover:text-white transition-colors flex items-center justify-center gap-2 mx-auto text-sm font-medium border-b border-primary/20 pb-1 hover:border-white">
Quero ver um exemplo de jogo de segurança <ChevronRight size={14} />
</button>
</div>
</div>
</section>
);
};
const Benefits = () => {
const benefits = [
{
title: "Redução de Acidentes",
desc: "Treinos frequentes e contextualizados reduzem decisões de risco e improvisos em campo.",
gradient: "from-red-500/20 to-orange-500/20"
},
{
title: "Mais Tempo Produtivo",
desc: "Jogos de 5–10 min no início do turno substituem horas de sala e deslocamento.",
gradient: "from-green-500/20 to-emerald-500/20"
},
{
title: "Visibilidade Real",
desc: "Dashboards mostram quais times estão aderentes e quais precisam de intervenção.",
gradient: "from-blue-500/20 to-indigo-500/20"
},
{
title: "Auditoria Pronta",
desc: "Evidências de compreensão e treinamento para auditorias e certificações.",
gradient: "from-purple-500/20 to-pink-500/20"
}
];
return (
<section id="beneficios" className="py-24 relative">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="mb-16">
<h2 className="text-3xl md:text-5xl font-bold text-white mb-6">Benefícios para a Indústria</h2>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{benefits.map((benefit, i) => (
<motion.div
key={i}
initial={{ opacity: 0, scale: 0.95 }}
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
className="group relative overflow-hidden rounded-2xl bg-white/5 border border-white/10 p-8 hover:bg-white/10 transition-colors"
>
<div className={`absolute top-0 right-0 w-64 h-64 bg-gradient-to-br ${benefit.gradient} blur-[100px] opacity-0 group-hover:opacity-100 transition-opacity`} />
<div className="relative z-10">
<h3 className="text-2xl font-bold text-white mb-4">{benefit.title}</h3>
<p className="text-white/60 text-lg leading-relaxed">{benefit.desc}</p>
</div>
</motion.div>
))}
</div>
</div>
</section>
);
};
const Testimonial = () => {
return (
<section className="py-24 border-y border-white/5 bg-[#050505]">
<div className="max-w-4xl mx-auto px-4 text-center">
<Trophy className="text-yellow-500 mx-auto mb-8" size={48} />
<blockquote className="text-2xl md:text-3xl font-medium text-white mb-8 leading-relaxed">
"Depois de 60 dias usando jogos de EPI e PT com a Play2Learn, tivemos uma queda percebida nos desvios de rotina e finalmente conseguimos priorizar ações em cima de dados, não só de percepções."
</blockquote>
<div className="flex flex-col items-center">
<div className="w-12 h-12 bg-white/20 rounded-full mb-3" />
<cite className="not-italic font-semibold text-white">Gerente de SST</cite>
<span className="text-white/40 text-sm">Indústria Multinacional Automotiva</span>
</div>
<div className="mt-16 flex flex-wrap justify-center gap-12 opacity-40 grayscale">
{/* Placeholder Logos */}
{[1,2,3,4].map(i => (
<div key={i} className="h-8 w-32 bg-white/20 rounded animate-pulse" />
))}
</div>
</div>
</section>
);
};
const TargetAudience = () => {
const targets = [
"Diretores e gerentes de Segurança do Trabalho e Meio Ambiente",
"Gerentes de Operações, Produção e Manutenção",
"RH / T&D focado em indústria",
"Empresas com múltiplas plantas e terceirizados"
];
return (
<section className="py-24 bg-gradient-to-b from-[#010101] to-primary/10">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="bg-[#0A090D] border border-white/10 rounded-3xl p-8 md:p-16 flex flex-col md:flex-row items-center gap-12">
<div className="flex-1">
<h2 className="text-3xl md:text-4xl font-bold text-white mb-8">Para quem é</h2>
<div className="space-y-4">
{targets.map((target, i) => (
<motion.div
key={i}
initial={{ opacity: 0, x: -20 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ delay: i * 0.1 }}
className="flex items-center gap-4 p-4 rounded-xl bg-white/5 border border-white/5"
>
<CheckCircle2 className="text-primary shrink-0" size={24} />
<span className="text-white font-medium">{target}</span>
</motion.div>
))}
</div>
</div>
<div className="flex-1 text-center md:text-left">
<h3 className="text-2xl font-bold text-white mb-4">Próximo passo simples</h3>
<p className="text-white/60 mb-8 text-lg">
Em 15 minutos mostramos um fluxo completo – da Squad ao dashboard – e desenhamos juntos um piloto de segurança para a sua operação.
</p>
<button className="w-full md:w-auto bg-white text-black px-8 py-4 rounded-full text-lg font-bold hover:bg-gray-200 transition-all shadow-[0_0_30px_rgba(255,255,255,0.2)]">
Agendar conversa de 15 minutos
</button>
</div>
</div>
</div>
</section>
);
};
const Footer = () => {
return (
<footer className="bg-black py-12 border-t border-white/10">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col md:flex-row justify-between items-center gap-8">
<div className="flex items-center gap-2">
<img
src="https://framerusercontent.com/images/3vzS5kugtW8u3ZiY5G5Psz2Jpnw.svg"
alt="Play2Learn Logo"
className="h-6 w-auto invert brightness-0 filter"
style={{ filter: 'invert(1) brightness(2)' }}
/>
<span className="text-white/40 text-sm ml-2">Indústria</span>
</div>
<div className="text-white/40 text-sm">
© {new Date().getFullYear()} Play2Learn. Todos os direitos reservados.
</div>
</div>
</footer>
);
};
export function Play2LearnLandingPage() {
return (
<div className="bg-[#010101] min-h-screen text-white font-sans selection:bg-primary/30">
<Navbar />
<Hero />
<Problem />
<Solution />
<Steps />
<Benefits />
<Testimonial />
<TargetAudience />
<Footer />
</div>
);
}
export default Play2LearnLandingPage;
~~~
Implementation Guidelines
1. Analyze the component structure, styling, animation implementations
2. Review the component's arguments and state
3. Think through what is the best place to adopt this component/style into the design we are doing
4. Then adopt the component/design to our current system
Help me integrate this into my design