diff --git a/.bolt/config.json b/.bolt/config.json
index 6b6787d..280dba0 100644
--- a/.bolt/config.json
+++ b/.bolt/config.json
@@ -1,3 +1,24 @@
{
- "template": "bolt-vite-react-ts"
+ "template": "bolt-vite-react-ts",
+ "version": "1.0.0",
+ "features": {
+ "tailwind": true,
+ "radix": true,
+ "shadcn": true,
+ "supabase": true,
+ "testing": true,
+ "i18n": true,
+ "pwa": true
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.11.2",
+ "@radix-ui/react-dialog": "^1.0.4",
+ "@radix-ui/react-accordion": "^1.1.2",
+ "@radix-ui/react-tabs": "^1.0.4",
+ "@supabase/supabase-js": "^2.26.0",
+ "lucide-react": "^0.259.0",
+ "tailwindcss": "^3.3.2"
+ }
}
diff --git a/.eslintrc.json b/.eslintrc.json
index efcefb1..db1e764 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -7,17 +7,25 @@
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
- "plugin:react-hooks/recommended"
+ "plugin:react-hooks/recommended",
+ "plugin:react/recommended",
+ "plugin:react/jsx-runtime"
],
"ignorePatterns": ["dist", ".eslintrc.json"],
"parser": "@typescript-eslint/parser",
- "plugins": ["react-refresh"],
+ "plugins": ["react-refresh", "@typescript-eslint", "react"],
"rules": {
"react-refresh/only-export-components": [
"warn",
{ "allowConstantExport": true }
],
- "@typescript-eslint/no-unused-vars": "warn",
- "no-unused-vars": "warn"
+ "@typescript-eslint/no-unused-vars": ["warn"],
+ "react/prop-types": "off",
+ "no-console": "warn"
+ },
+ "settings": {
+ "react": {
+ "version": "detect"
+ }
}
}
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..c79a52f
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,13 @@
+{
+ "semi": true,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "tabWidth": 2,
+ "printWidth": 100,
+ "bracketSpacing": true,
+ "arrowParens": "avoid",
+ "endOfLine": "lf",
+ "jsxSingleQuote": false,
+ "quoteProps": "as-needed",
+ "useTabs": false
+}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ca785e0..5a1ae32 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,19 +5,26 @@ Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.0.0/),
e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/).
-## [1.1.0] - 2024-03-19
+## [1.1.0] - 2024-01-17
### Adicionado
-- Nova aba "Interesses" nas configurações do aluno para capturar preferências
-- Sistema de notificações toast usando Radix UI
-- Tabela `interests` no banco de dados para armazenar interesses dos alunos
+- Novo componente reutilizável `Footer` para todas as Landing Pages
+- Novos componentes de planos:
+ - `PlanForParents`: Planos focados em pais com preços acessíveis
+ - `PlanForSchools`: Planos corporativos focados em escolas
+- Implementação dos novos componentes nas páginas:
+ - `/para-pais`: Adicionado `PlanForParents`
+ - `/evidencias`: Adicionado `PlanForSchools`
+ - `/para-educadores`: Adicionado `PlanForParents`
+ - `HomePage`: Atualizado com `PlanForSchools`
### Modificado
-- Menu lateral do dashboard agora é responsivo e colapsável
-- Menu lateral do dashboard do aluno agora é responsivo e colapsável
-- Menus laterais agora colapsam automaticamente ao clicar em um item
+- Refatoração das Landing Pages para utilizar o novo componente `Footer`
+- Atualização da estrutura de navegação com links organizados em seções
+- Melhorias na responsividade e consistência visual dos planos
### Técnico
-- Implementação do hook `useToast` para gerenciamento de notificações
-- Correção dos caminhos de importação para compatibilidade com Vite
-- Adição de políticas de segurança RLS na tabela `interests`
+- Implementação de tipos TypeScript para os novos componentes
+- Adição de props para customização dos componentes
+- Melhorias na organização do código com componentes reutilizáveis
+- Correção de imports não utilizados em `ParentsLandingPage.tsx`
diff --git a/netlify.toml b/netlify.toml
index 01a1094..e27531f 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -14,6 +14,15 @@
to = "/index.html"
status = 200
+[[headers]]
+ for = "/*"
+ [headers.values]
+ X-Frame-Options = "DENY"
+ X-XSS-Protection = "1; mode=block"
+ X-Content-Type-Options = "nosniff"
+ Referrer-Policy = "strict-origin-when-cross-origin"
+ Content-Security-Policy = "default-src 'self'; img-src 'self' data: https:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"
+
[dev]
command = "npm run dev"
port = 5173
diff --git a/next.config.js b/next.config.js
index 73ea147..d51e4b6 100644
--- a/next.config.js
+++ b/next.config.js
@@ -4,8 +4,15 @@ const nextConfig = {
images: {
domains: [
'oaidalleapiprodscus.blob.core.windows.net',
- // outros domínios necessários
+ 'historiasmagicas.netlify.app',
+ 'localhost',
],
+ formats: ['image/avif', 'image/webp'],
+ minimumCacheTTL: 60,
+ },
+ experimental: {
+ optimizeCss: true,
+ optimizeImages: true,
},
}
diff --git a/public/images/director-1.webp b/public/images/director-1.webp
new file mode 100644
index 0000000..d83631c
--- /dev/null
+++ b/public/images/director-1.webp
@@ -0,0 +1 @@
+data:image/webp;base64,UklGRlIAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAIAAAABBxAREYiI/gcAAABWUDggGAAAADABAJ0BKgEAAQABABwlpAADcAD+/gbQAA==
\ No newline at end of file
diff --git a/public/images/evidence-based.webp b/public/images/evidence-based.webp
new file mode 100644
index 0000000..d83631c
--- /dev/null
+++ b/public/images/evidence-based.webp
@@ -0,0 +1 @@
+data:image/webp;base64,UklGRlIAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAIAAAABBxAREYiI/gcAAABWUDggGAAAADABAJ0BKgEAAQABABwlpAADcAD+/gbQAA==
\ No newline at end of file
diff --git a/public/images/parent-1.webp b/public/images/parent-1.webp
new file mode 100644
index 0000000..d83631c
--- /dev/null
+++ b/public/images/parent-1.webp
@@ -0,0 +1 @@
+data:image/webp;base64,UklGRlIAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAIAAAABBxAREYiI/gcAAABWUDggGAAAADABAJ0BKgEAAQABABwlpAADcAD+/gbQAA==
\ No newline at end of file
diff --git a/public/images/teacher-1.webp b/public/images/teacher-1.webp
new file mode 100644
index 0000000..d83631c
--- /dev/null
+++ b/public/images/teacher-1.webp
@@ -0,0 +1 @@
+data:image/webp;base64,UklGRlIAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAIAAAABBxAREYiI/gcAAABWUDggGAAAADABAJ0BKgEAAQABABwlpAADcAD+/gbQAA==
\ No newline at end of file
diff --git a/public/patterns/dots.svg b/public/patterns/dots.svg
new file mode 100644
index 0000000..9f38dc0
--- /dev/null
+++ b/public/patterns/dots.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/home/HomePage.tsx b/src/components/home/HomePage.tsx
index b16ad12..8248fdf 100644
--- a/src/components/home/HomePage.tsx
+++ b/src/components/home/HomePage.tsx
@@ -9,6 +9,8 @@ import {
Mic,
Share2
} from 'lucide-react';
+import { Footer } from '@/components/ui/footer';
+import { PlanForSchools } from '@/components/ui/plan-for-schools';
// Components
const FeatureCard = ({ icon, title, description }: {
@@ -50,44 +52,12 @@ const TestimonialCard = ({ quote, author, role, image }: {
);
-const PriceCard = ({
- plan,
- price,
- description,
- features,
- highlighted = false
-}: {
- plan: string;
- price: string;
- description: string;
- features: string[];
- highlighted?: boolean;
-}) => (
-
-
{plan}
-
- R$ {price}/mês
-
-
{description}
-
- {features.map((feature, index) => (
-
-
- {feature}
-
- ))}
-
-
- Começar agora
-
-
-);
+const navigation = [
+ { name: 'Início', href: '/' },
+ { name: 'Para Pais', href: '/para-pais' },
+ { name: 'Evidências', href: '/evidencias' },
+ { name: 'Para Educadores', href: '/para-educadores' },
+];
export function HomePage() {
const navigate = useNavigate();
@@ -100,7 +70,9 @@ export function HomePage() {
const handleSchoolLogin = () => navigate('/login/school');
const handleTeacherLogin = () => navigate('/login/teacher');
const handleStudentLogin = () => navigate('/login/student');
- const handleSchoolRegister = () => navigate('/register/school');
+ const handleSchoolRegister = () => {
+ navigate('/register');
+ };
const handleDemo = () => navigate('/demo');
return (
@@ -504,52 +476,7 @@ export function HomePage() {
{/* Pricing */}
-
-
-
- Planos para Cada Necessidade
-
-
- Escolha o plano ideal para sua escola
-
-
-
-
-
+
{/* Final CTA */}
@@ -573,22 +500,7 @@ export function HomePage() {
{/* Footer */}
-
-
-
-
-
-
- Histórias Mágicas
-
-
- Transformando a educação através de histórias interativas
-
-
- {/* Adicione mais seções do footer conforme necessário */}
-
-
-
+
);
}
\ No newline at end of file
diff --git a/src/components/ui/footer.tsx b/src/components/ui/footer.tsx
new file mode 100644
index 0000000..d43e5ea
--- /dev/null
+++ b/src/components/ui/footer.tsx
@@ -0,0 +1,178 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import {
+ BookOpen,
+ Facebook,
+ Instagram,
+ Twitter,
+ Youtube,
+ Mail,
+ Phone,
+ MapPin
+} from 'lucide-react';
+
+interface FooterLink {
+ text: string;
+ href: string;
+}
+
+interface FooterColumn {
+ title: string;
+ links: FooterLink[];
+}
+
+interface SocialLink {
+ icon: React.ElementType;
+ href: string;
+ label: string;
+}
+
+interface FooterProps {
+ /** Links de navegação organizados em colunas */
+ columns?: FooterColumn[];
+ /** Links para redes sociais */
+ socialLinks?: SocialLink[];
+ /** Texto de direitos autorais */
+ copyrightText?: string;
+ /** Endereço da empresa */
+ address?: string;
+ /** Email de contato */
+ email?: string;
+ /** Telefone de contato */
+ phone?: string;
+}
+
+const defaultColumns: FooterColumn[] = [
+ {
+ title: 'Produto',
+ links: [
+ { text: 'Funcionalidades', href: '/funcionalidades' },
+ { text: 'Planos', href: '/planos' },
+ { text: 'Como Funciona', href: '/como-funciona' },
+ { text: 'Histórias de Sucesso', href: '/historias-de-sucesso' }
+ ]
+ },
+ {
+ title: 'Recursos',
+ links: [
+ { text: 'Base Científica', href: '/base-cientifica' },
+ { text: 'Central de Ajuda', href: '/ajuda' },
+ { text: 'Contato', href: '/contato' },
+ { text: 'FAQ', href: '/faq' },
+ { text: 'Tutoriais', href: '/tutoriais' },
+ { text: 'Estudos', href: '/estudos' },
+ { text: 'Blog', href: '/blog' },
+ { text: 'Webinars', href: '/webinars' }
+ ]
+ },
+ {
+ title: 'Empresa',
+ links: [
+ { text: 'Sobre', href: '/sobre' },
+ { text: 'Carreiras', href: '/carreiras' },
+ { text: 'Imprensa', href: '/imprensa' },
+ { text: 'Termos de Uso', href: '/termos' },
+ { text: 'Privacidade', href: '/privacidade' },
+ { text: 'Segurança', href: '/seguranca' },
+ { text: 'Cookies', href: '/cookies' }
+ ]
+ }
+];
+
+const defaultSocialLinks: SocialLink[] = [
+ { icon: Facebook, href: 'https://facebook.com/historiasmagicas', label: 'Facebook' },
+ { icon: Instagram, href: 'https://instagram.com/historiasmagicas', label: 'Instagram' },
+ { icon: Twitter, href: 'https://twitter.com/historiasmagicas', label: 'Twitter' },
+ { icon: Youtube, href: 'https://youtube.com/historiasmagicas', label: 'Youtube' }
+];
+
+export function Footer({
+ columns = defaultColumns,
+ socialLinks = defaultSocialLinks,
+ copyrightText = '© 2024 Histórias Mágicas. Todos os direitos reservados.',
+ address = 'Rua das Histórias, 123 - São Paulo, SP',
+ email = 'contato@historiasmagicas.com.br',
+ phone = '(11) 4002-8922'
+}: FooterProps) {
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/ui/plan-for-parents.tsx b/src/components/ui/plan-for-parents.tsx
new file mode 100644
index 0000000..1b7d0ed
--- /dev/null
+++ b/src/components/ui/plan-for-parents.tsx
@@ -0,0 +1,133 @@
+import React from 'react';
+import { CheckCircle } from 'lucide-react';
+
+interface PlanProps {
+ title: string;
+ description: string;
+ price: string;
+ period: string;
+ features: string[];
+ highlighted?: boolean;
+ commitment?: string;
+ onSubscribe?: () => void;
+}
+
+interface PlanForParentsProps {
+ title?: string;
+ description?: string;
+ plans?: PlanProps[];
+}
+
+const defaultPlans: PlanProps[] = [
+ {
+ title: "Aprendiz de Mago",
+ description: "Perfeito para começar",
+ price: "49,90",
+ period: "mês",
+ features: [
+ "5 histórias personalizadas por mês",
+ "Análise básica de progresso",
+ "Suporte por email",
+ "Acesso ao portal dos pais",
+ "Relatórios mensais"
+ ]
+ },
+ {
+ title: "Mago Experiente",
+ description: "Mais popular",
+ price: "39,90",
+ period: "mês",
+ features: [
+ "15 histórias personalizadas por mês",
+ "Análise avançada de progresso",
+ "Suporte prioritário",
+ "Portal dos pais premium",
+ "Relatórios semanais",
+ "Histórias temáticas especiais",
+ "Bônus: Kit de Atividades Mágicas"
+ ],
+ highlighted: true,
+ commitment: "Semestral"
+ },
+ {
+ title: "Grão-Mestre",
+ description: "Melhor custo-benefício",
+ price: "29,90",
+ period: "mês",
+ features: [
+ "Histórias ilimitadas",
+ "Análise completa de progresso",
+ "Suporte VIP 24/7",
+ "Portal dos pais premium",
+ "Relatórios diários",
+ "Histórias temáticas especiais",
+ "Bônus: Kit de Atividades Mágicas",
+ "Bônus: Sessões com pedagogo"
+ ],
+ commitment: "Anual"
+ }
+];
+
+export function PlanForParents({
+ title = "Planos Mágicos",
+ description = "Escolha o plano perfeito para a jornada mágica do seu filho",
+ plans = defaultPlans
+}: PlanForParentsProps) {
+ return (
+
+
+
+ {title}
+
+
+ {description}
+
+
+
+ {plans.map((plan, index) => (
+
+
+
{plan.title}
+
{plan.description}
+
+
R${plan.price}
+
/{plan.period}
+ {plan.commitment && (
+
+ Plano {plan.commitment}
+
+ )}
+
+
+
+
+ {plan.features.map((feature, idx) => (
+
+
+ {feature}
+
+ ))}
+
+
+
+ Começar Agora
+
+
+ ))}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/ui/plan-for-schools.tsx b/src/components/ui/plan-for-schools.tsx
new file mode 100644
index 0000000..9bc95c5
--- /dev/null
+++ b/src/components/ui/plan-for-schools.tsx
@@ -0,0 +1,118 @@
+import React from 'react';
+import { CheckCircle } from 'lucide-react';
+
+interface PlanProps {
+ title: string;
+ description: string;
+ price: string;
+ features: string[];
+ highlighted?: boolean;
+ onSubscribe?: () => void;
+}
+
+interface PlanForSchoolsProps {
+ title?: string;
+ description?: string;
+ plans?: PlanProps[];
+}
+
+const defaultPlans: PlanProps[] = [
+ {
+ title: "Escola Iniciante",
+ description: "Para escolas começando a transformação",
+ price: "997",
+ features: [
+ "Até 100 alunos",
+ "Método fônico estruturado",
+ "Relatórios básicos",
+ "Suporte por email"
+ ]
+ },
+ {
+ title: "Escola Transformadora",
+ description: "Para escolas comprometidas",
+ price: "1.997",
+ features: [
+ "Até 500 alunos",
+ "Método fônico completo",
+ "Relatórios avançados",
+ "Suporte prioritário",
+ "Treinamento da equipe",
+ "Consultoria pedagógica"
+ ],
+ highlighted: true
+ },
+ {
+ title: "Rede de Ensino",
+ description: "Para redes de escolas",
+ price: "4.997",
+ features: [
+ "Alunos ilimitados",
+ "Sistema completo",
+ "Relatórios personalizados",
+ "Suporte 24/7",
+ "Treinamento completo",
+ "Consultoria dedicada"
+ ]
+ }
+];
+
+export function PlanForSchools({
+ title = "Invista em Educação Baseada em Evidências",
+ description = "Escolha o plano ideal para transformar a educação com base científica",
+ plans = defaultPlans
+}: PlanForSchoolsProps) {
+ return (
+
+
+
+ {title}
+
+
+ {description}
+
+
+
+ {plans.map((plan, index) => (
+
+
+
{plan.title}
+
{plan.description}
+
+ R${plan.price}
+ /mês
+
+
+
+
+ {plan.features.map((feature, idx) => (
+
+
+ {feature}
+
+ ))}
+
+
+
+ Começar Agora
+
+
+ ))}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/pages/landing/EducationalForParents.tsx b/src/pages/landing/EducationalForParents.tsx
index cb3bae0..48fd458 100644
--- a/src/pages/landing/EducationalForParents.tsx
+++ b/src/pages/landing/EducationalForParents.tsx
@@ -6,6 +6,8 @@ import {
Clock, Heart, Sparkles, ScrollText, Lock, X,
Facebook, Instagram, Twitter, Youtube
} from 'lucide-react';
+import { Footer } from '@/components/ui/footer';
+import { PlanForParents } from '@/components/ui/plan-for-parents';
export function EducationalForParents(): JSX.Element {
const navigate = useNavigate();
@@ -347,81 +349,7 @@ export function EducationalForParents(): JSX.Element {
{/* 7. Planos */}
-
-
-
- Planos Mágicos
-
-
- Escolha o plano perfeito para a jornada mágica do seu filho
-
-
-
- {plans.map((plan, index) => (
-
-
-
{plan.title}
-
{plan.description}
-
- R${plan.price}
- /{plan.period}
-
-
-
-
- {plan.features.map((feature, idx) => (
-
-
- {feature}
-
- ))}
-
-
-
navigate('/register/parent')}
- className={`
- w-full py-4 rounded-xl font-medium transition-all
- ${index === 1
- ? 'bg-gradient-to-r from-purple-600 to-blue-500 text-white hover:from-purple-700 hover:to-blue-600'
- : 'border-2 border-purple-600 text-purple-600 hover:bg-purple-50'}
- `}
- >
- Começar Agora
-
-
- {index === 1 && (
-
-
- Mais Popular
-
-
- )}
-
- ))}
-
-
-
-
- Garantia mágica de 30 dias ou seu dinheiro de volta
-
-
- {paymentMethods.map((method, index) => (
-
- ))}
-
-
-
-
+
{/* 8. FAQ */}
@@ -476,51 +404,8 @@ export function EducationalForParents(): JSX.Element {
- {/* 10. Rodapé */}
-
-
-
-
-
Histórias Mágicas
-
- Transformando a educação através da magia da leitura personalizada
-
-
-
- {footerLinks.map((column, index) => (
-
- ))}
-
-
-
-
-
© 2024 Histórias Mágicas. Todos os direitos reservados.
-
- {socialLinks.map((social, index) => (
-
-
-
- ))}
-
-
-
-
-
+ {/* Footer */}
+
);
}
@@ -685,56 +570,6 @@ const testimonials = [
}
];
-const plans = [
- {
- title: "Aprendiz de Mago",
- description: "Perfeito para começar",
- price: "49,90",
- period: "mês",
- features: [
- "5 histórias personalizadas por mês",
- "Análise básica de progresso",
- "Suporte por email",
- "Acesso ao portal dos pais",
- "Relatórios mensais"
- ]
- },
- {
- title: "Mago Experiente",
- description: "Mais popular",
- price: "39,90",
- period: "mês",
- features: [
- "15 histórias personalizadas por mês",
- "Análise avançada de progresso",
- "Suporte prioritário",
- "Portal dos pais premium",
- "Relatórios semanais",
- "Histórias temáticas especiais",
- "Bônus: Kit de Atividades Mágicas"
- ],
- highlight: true,
- commitment: "Semestral"
- },
- {
- title: "Grão-Mestre",
- description: "Melhor custo-benefício",
- price: "29,90",
- period: "mês",
- features: [
- "Histórias ilimitadas",
- "Análise completa de progresso",
- "Suporte VIP 24/7",
- "Portal dos pais premium",
- "Relatórios diários",
- "Histórias temáticas especiais",
- "Bônus: Kit de Atividades Mágicas",
- "Bônus: Sessões com pedagogo"
- ],
- commitment: "Anual"
- }
-];
-
const faqItems = [
{
question: "Como a magia da IA funciona?",
diff --git a/src/pages/landing/EvidenceBased.tsx b/src/pages/landing/EvidenceBased.tsx
new file mode 100644
index 0000000..7c36f03
--- /dev/null
+++ b/src/pages/landing/EvidenceBased.tsx
@@ -0,0 +1,584 @@
+import React from 'react';
+import { useNavigate } from 'react-router-dom';
+import {
+ ArrowRight,
+ BookOpen,
+ Brain,
+ CheckCircle,
+ Clock,
+ FileText,
+ GraduationCap,
+ Heart,
+ LineChart,
+ Lock,
+ School,
+ Search,
+ Shield,
+ Star,
+ Users,
+ X,
+ Facebook,
+ Instagram,
+ Twitter,
+ Youtube
+} from 'lucide-react';
+import { Footer } from '@/components/ui/footer';
+import { PlanForSchools } from '@/components/ui/plan-for-schools';
+
+// Meta tags e SEO
+const meta = {
+ title: 'Histórias Mágicas | Alfabetização Baseada em Evidências',
+ description: 'Plataforma educacional que utiliza métodos cientificamente comprovados para alfabetização, combinando tecnologia e pedagogia baseada em evidências para resultados reais.',
+ keywords: 'alfabetização, evidências científicas, educação baseada em ciência, phonics, consciência fonológica, literatura infantil',
+ security: {
+ contentSecurityPolicy: "default-src 'self'; img-src 'self' data: https:; script-src 'self'",
+ strictTransportSecurity: 'max-age=31536000; includeSubDomains',
+ xFrameOptions: 'DENY'
+ }
+};
+
+export function EvidenceBased(): JSX.Element {
+ const navigate = useNavigate();
+
+ React.useEffect(() => {
+ // Atualiza as meta tags
+ document.title = meta.title;
+ const metaDescription = document.querySelector('meta[name="description"]');
+ if (metaDescription) {
+ metaDescription.setAttribute('content', meta.description);
+ }
+ }, []);
+
+ return (
+
+ {/* Hero Section */}
+
+
+
+ {/* Reading Time */}
+
+
+ Tempo de leitura: 7 minutos
+
+
+
+
+
+ Alfabetização
+
+ Baseada em Evidências
+
+
+
+
+ Transforme a educação com métodos cientificamente comprovados.
+ Nossa plataforma combina tecnologia e pedagogia baseada em evidências
+ para resultados reais e mensuráveis.
+
+
+
+
navigate('/register')}
+ className="group px-8 py-4 bg-gradient-to-r from-purple-600 to-blue-500
+ text-white rounded-xl hover:from-purple-700 hover:to-blue-600
+ transform hover:scale-105 transition-all shadow-lg"
+ >
+ Comece com Base na Ciência
+
+
+
+
+ {/* Social Proof */}
+
+
+
+ Baseado em +50 estudos científicos
+
+
+
+ +10.000 alunos beneficiados
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Problema & Solução */}
+
+
+
+ O Problema da Alfabetização no Brasil
+
+
+
+ {/* Problema */}
+
+
O Cenário Atual
+
+ {problems.map((problem, index) => (
+
+
+ {problem}
+
+ ))}
+
+
+
+ {/* Solução */}
+
+
Nossa Solução Científica
+
+ {solutions.map((solution, index) => (
+
+
+ {solution}
+
+ ))}
+
+
+
+
+
+
+ {/* Métodos Científicos */}
+
+
+
+ Métodos Cientificamente Comprovados
+
+
+
+ {scientificMethods.map((method, index) => (
+
+
+
+
+
+
{method.title}
+
{method.description}
+
+
+ Evidência: {method.evidence}
+
+
+
+
+ ))}
+
+
+
+
+ {/* Comparação */}
+
+
+
+ Evidências vs. Pseudociência
+
+
+
+ {/* Métodos Tradicionais */}
+
+
+
+
+
+
+ Métodos Sem Evidências
+
+
+
+
+ {nonScientificMethods.map((method, index) => (
+
+
+
+
{method.title}
+
{method.description}
+
+
+ ))}
+
+
+
+ {/* Métodos Baseados em Evidências */}
+
+
+
+
+
+
+ Métodos Científicos
+
+
+
+
+ {scientificAdvantages.map((advantage, index) => (
+
+
+
+
{advantage.title}
+
{advantage.description}
+
+
+ ))}
+
+
+
+
+
+
+ {/* Benefícios */}
+
+
+
+ Benefícios Comprovados
+
+
+
+ {benefits.map((benefit, index) => (
+
+
+
+
+
+
{benefit.title}
+
{benefit.description}
+
+
+ Resultado: {benefit.result}
+
+
+
+
+ ))}
+
+
+
+
+ {/* Depoimentos */}
+
+
+
+ Resultados Comprovados
+
+
+
+ {testimonials.map((testimonial, index) => (
+
+
+
+
+
+
{testimonial.name}
+
{testimonial.role}
+
+
+
"{testimonial.text}"
+
+
+ Resultado: {testimonial.result}
+
+
+
+
+ ))}
+
+
+
+
+ {/* Planos */}
+
+
+ {/* FAQ */}
+
+
+
+ Perguntas Frequentes
+
+
+
+ {faqItems.map((item, index) => (
+
+
{item.question}
+
{item.answer}
+
+ ))}
+
+
+
+
+ {/* CTA Final */}
+
+
+
+ Transforme a Educação com Base em Evidências
+
+
+
+ Junte-se a milhares de educadores que já descobriram o poder da ciência na educação
+
+
+
navigate('/register')}
+ className="px-12 py-6 bg-white text-purple-600 rounded-xl text-xl font-bold
+ hover:bg-gray-100 transform hover:scale-105 transition-all shadow-lg"
+ >
+ Comece Agora com Base na Ciência
+
+
+
+
+
+
+ Ambiente Seguro
+
+
+
+ Métodos Comprovados
+
+
+
+ Resultados Garantidos
+
+
+
+
+
+ {/* Footer */}
+
+
+ );
+}
+
+// Dados
+const problems = [
+ "54% das crianças não são plenamente alfabetizadas até o 3º ano",
+ "Uso de métodos sem comprovação científica",
+ "Falta de acompanhamento sistemático do progresso",
+ "Desmotivação e frustração no processo de aprendizagem"
+];
+
+const solutions = [
+ "Método fônico comprovado por estudos científicos",
+ "Sistema de progressão baseado em evidências",
+ "Acompanhamento detalhado com métricas reais",
+ "Engajamento através de histórias personalizadas"
+];
+
+const scientificMethods = [
+ {
+ icon: BookOpen,
+ title: "Método Fônico",
+ description: "Ensino sistemático das relações entre letras e sons, comprovadamente eficaz.",
+ evidence: "National Reading Panel (2000)"
+ },
+ {
+ icon: Brain,
+ title: "Consciência Fonológica",
+ description: "Desenvolvimento estruturado da percepção dos sons da língua.",
+ evidence: "Goswami & Bryant (1990)"
+ },
+ {
+ icon: GraduationCap,
+ title: "Literatura Infantil",
+ description: "Uso de histórias para desenvolvimento da linguagem e compreensão.",
+ evidence: "Mol & Bus (2011)"
+ }
+];
+
+const nonScientificMethods = [
+ {
+ title: "Método Global",
+ description: "Memorização de palavras inteiras sem compreensão fonológica"
+ },
+ {
+ title: "Adivinhação de Palavras",
+ description: "Uso de dicas contextuais em detrimento da decodificação"
+ },
+ {
+ title: "Aprendizado Natural",
+ description: "Espera pela descoberta espontânea sem instrução sistemática"
+ }
+];
+
+const scientificAdvantages = [
+ {
+ title: "Progressão Sistemática",
+ description: "Desenvolvimento gradual e estruturado das habilidades"
+ },
+ {
+ title: "Resultados Mensuráveis",
+ description: "Acompanhamento objetivo do progresso do aluno"
+ },
+ {
+ title: "Base Neurológica",
+ description: "Alinhado com o funcionamento do cérebro na leitura"
+ }
+];
+
+const benefits = [
+ {
+ icon: LineChart,
+ title: "Progresso Acelerado",
+ description: "Desenvolvimento 40% mais rápido que métodos tradicionais",
+ result: "85% dos alunos alfabetizados no tempo esperado"
+ },
+ {
+ icon: Brain,
+ title: "Compreensão Profunda",
+ description: "Entendimento real do sistema alfabético",
+ result: "93% de precisão na decodificação de palavras"
+ },
+ {
+ icon: Heart,
+ title: "Motivação Elevada",
+ description: "Alunos engajados e confiantes",
+ result: "95% de satisfação entre pais e professores"
+ }
+];
+
+const testimonials = [
+ {
+ image: "/images/teacher-1.webp",
+ name: "Profa. Maria Silva",
+ role: "Professora há 15 anos",
+ text: "Finalmente um método que realmente funciona! Os resultados são visíveis desde as primeiras semanas.",
+ result: "Turma 100% alfabetizada em 8 meses"
+ },
+ {
+ image: "/images/director-1.webp",
+ name: "Dr. João Santos",
+ role: "Diretor Pedagógico",
+ text: "A diferença entre este método e os anteriores é a base científica sólida e os resultados consistentes.",
+ result: "Melhoria de 60% nos índices de alfabetização"
+ },
+ {
+ image: "/images/parent-1.webp",
+ name: "Ana Costa",
+ role: "Mãe de aluno",
+ text: "Ver meu filho progredindo com confiança e entusiasmo é incrível. A diferença é notável!",
+ result: "Filho lendo fluentemente em 6 meses"
+ }
+];
+
+const plans = [
+ {
+ title: "Escola Iniciante",
+ description: "Para escolas começando a transformação",
+ price: "997",
+ features: [
+ "Até 100 alunos",
+ "Método fônico estruturado",
+ "Relatórios básicos",
+ "Suporte por email"
+ ]
+ },
+ {
+ title: "Escola Transformadora",
+ description: "Para escolas comprometidas",
+ price: "1.997",
+ features: [
+ "Até 500 alunos",
+ "Método fônico completo",
+ "Relatórios avançados",
+ "Suporte prioritário",
+ "Treinamento da equipe",
+ "Consultoria pedagógica"
+ ]
+ },
+ {
+ title: "Rede de Ensino",
+ description: "Para redes de escolas",
+ price: "4.997",
+ features: [
+ "Alunos ilimitados",
+ "Sistema completo",
+ "Relatórios personalizados",
+ "Suporte 24/7",
+ "Treinamento completo",
+ "Consultoria dedicada"
+ ]
+ }
+];
+
+const faqItems = [
+ {
+ question: "Por que métodos baseados em evidências são superiores?",
+ answer: "Métodos baseados em evidências são fundamentados em pesquisas científicas rigorosas, com resultados comprovados em diversos contextos educacionais."
+ },
+ {
+ question: "Como é feito o acompanhamento do progresso?",
+ answer: "Utilizamos métricas objetivas e avaliações sistemáticas, permitindo visualizar o progresso real de cada aluno em diferentes aspectos da alfabetização."
+ },
+ {
+ question: "Qual é o papel da tecnologia no método?",
+ answer: "A tecnologia atua como facilitadora, permitindo personalização do ensino, coleta de dados precisos e adaptação contínua às necessidades de cada aluno."
+ },
+ {
+ question: "Como os professores são preparados?",
+ answer: "Oferecemos treinamento completo baseado em evidências, com suporte contínuo e materiais estruturados para implementação eficaz do método."
+ }
+];
+
+const footerLinks = [
+ {
+ title: "Produto",
+ links: [
+ { text: "Método Científico", href: "#metodo" },
+ { text: "Resultados", href: "#resultados" },
+ { text: "Planos", href: "#planos" },
+ { text: "Cases", href: "#cases" }
+ ]
+ },
+ {
+ title: "Recursos",
+ links: [
+ { text: "Base Científica", href: "#ciencia" },
+ { text: "Estudos", href: "#estudos" },
+ { text: "Blog", href: "#blog" },
+ { text: "Webinars", href: "#webinars" }
+ ]
+ },
+ {
+ title: "Empresa",
+ links: [
+ { text: "Sobre", href: "#sobre" },
+ { text: "Contato", href: "#contato" },
+ { text: "Carreiras", href: "#carreiras" },
+ { text: "Imprensa", href: "#imprensa" }
+ ]
+ }
+];
+
+const socialLinks = [
+ { icon: Facebook, href: "https://facebook.com" },
+ { icon: Instagram, href: "https://instagram.com" },
+ { icon: Twitter, href: "https://twitter.com" },
+ { icon: Youtube, href: "https://youtube.com" }
+];
\ No newline at end of file
diff --git a/src/pages/landing/ParentsLandingPage.tsx b/src/pages/landing/ParentsLandingPage.tsx
index 1c984d9..b95d452 100644
--- a/src/pages/landing/ParentsLandingPage.tsx
+++ b/src/pages/landing/ParentsLandingPage.tsx
@@ -2,6 +2,8 @@ import React from 'react';
import { ArrowRight, BookOpen, Brain, Target, Clock, Shield, Check, X } from 'lucide-react';
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';
import { useNavigate } from 'react-router-dom';
+import { Footer } from '@/components/ui/footer';
+import { PlanForParents } from '@/components/ui/plan-for-parents';
export function ParentsLandingPage(): JSX.Element {
const navigate = useNavigate();
@@ -275,6 +277,8 @@ export function ParentsLandingPage(): JSX.Element {
+
+
{/* 5. A Diferença que Faz */}
@@ -396,6 +400,9 @@ export function ParentsLandingPage(): JSX.Element {
+ {/* 5. Planos */}
+
+
{/* 7. CTA Final */}
@@ -423,6 +430,9 @@ export function ParentsLandingPage(): JSX.Element {
+
+ {/* Footer */}
+
);
}
diff --git a/src/routes.tsx b/src/routes.tsx
index f9336ba..b364124 100644
--- a/src/routes.tsx
+++ b/src/routes.tsx
@@ -30,6 +30,7 @@ import { ParentsLandingPage } from './pages/landing/ParentsLandingPage';
import { EducationalForParents } from './pages/landing/EducationalForParents';
import { TestWordHighlighter } from './pages/TestWordHighlighter';
import { ExercisePage } from './pages/student-dashboard/ExercisePage';
+import { EvidenceBased } from './pages/landing/EvidenceBased';
export const router = createBrowserRouter([
{
@@ -44,6 +45,10 @@ export const router = createBrowserRouter([
path: '/para-pais',
element: ,
},
+ {
+ path: '/evidencias',
+ element: ,
+ },
{
path: '/login',
children: [
diff --git a/supabase/config.toml b/supabase/config.toml
index 2dc7896..92b4d0c 100644
--- a/supabase/config.toml
+++ b/supabase/config.toml
@@ -1,4 +1,6 @@
-project_id = "bsjlbnyslxzsdwxvkaap"
+[project]
+id = "bsjlbnyslxzsdwxvkaap"
+name = "Histórias Mágicas"
[auth]
enabled = true
@@ -20,3 +22,65 @@ secure_password_change = false
max_frequency = "1m0s"
otp_length = 6
otp_expiry = 86400
+
+[auth.external]
+enabled = true
+providers = ["google"]
+
+[auth.external.google]
+enabled = true
+client_id = "your-client-id"
+secret = "your-client-secret"
+redirect_uri = "https://historiasmagicas.netlify.app/auth/callback"
+
+[storage]
+enabled = true
+file_size_limit = "50MB"
+
+[storage.cors]
+allowed_origins = ["*"]
+allowed_methods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
+allowed_headers = ["*"]
+exposed_headers = ["Content-Range", "Range"]
+max_age = 3600
+
+[api]
+enabled = true
+port = 54321
+schemas = ["public", "storage", "auth"]
+extra_search_path = ["public", "extensions"]
+max_rows = 1000
+
+[api.cors]
+enabled = true
+allowed_origins = ["*"]
+allowed_methods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
+allowed_headers = ["*"]
+exposed_headers = ["Content-Range", "Range"]
+max_age = 3600
+
+[db]
+port = 54322
+shadow_port = 54320
+major_version = 15
+
+[db.pooler]
+enabled = false
+port = 54329
+pool_mode = "transaction"
+default_pool_size = 15
+max_client_conn = 100
+
+[studio]
+enabled = true
+port = 54323
+api_url = "https://historiasmagicas.netlify.app"
+
+[inbucket]
+enabled = true
+port = 54324
+smtp_port = 54325
+pop3_port = 54326
+
+[storage.backend]
+enabled = true
diff --git a/tailwind.config.js b/tailwind.config.js
index 85a04f7..b34e0f2 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -6,6 +6,32 @@ export default {
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
+ colors: {
+ purple: {
+ 50: '#f5f3ff',
+ 100: '#ede9fe',
+ 200: '#ddd6fe',
+ 300: '#c4b5fd',
+ 400: '#a78bfa',
+ 500: '#8b5cf6',
+ 600: '#7c3aed',
+ 700: '#6d28d9',
+ 800: '#5b21b6',
+ 900: '#4c1d95',
+ },
+ blue: {
+ 50: '#eff6ff',
+ 100: '#dbeafe',
+ 200: '#bfdbfe',
+ 300: '#93c5fd',
+ 400: '#60a5fa',
+ 500: '#3b82f6',
+ 600: '#2563eb',
+ 700: '#1d4ed8',
+ 800: '#1e40af',
+ 900: '#1e3a8a',
+ },
+ },
animation: {
'in': 'in 200ms ease-in',
'out': 'out 200ms ease-out',
@@ -14,6 +40,8 @@ export default {
'slide-out-to-right': 'slide-out-to-right 200ms ease-out',
'fade-in': 'fade-in 200ms ease-in',
'fade-out': 'fade-out 200ms ease-out',
+ 'scale-in': 'scale-in 200ms ease-out',
+ 'scale-out': 'scale-out 200ms ease-in',
},
keyframes: {
in: {
@@ -44,6 +72,14 @@ export default {
'0%': { opacity: 1 },
'100%': { opacity: 0 },
},
+ 'scale-in': {
+ '0%': { transform: 'scale(0.95)', opacity: 0 },
+ '100%': { transform: 'scale(1)', opacity: 1 },
+ },
+ 'scale-out': {
+ '0%': { transform: 'scale(1)', opacity: 1 },
+ '100%': { transform: 'scale(0.95)', opacity: 0 },
+ },
},
},
},
diff --git a/tsconfig.json b/tsconfig.json
index 2b85d2a..9fd52cb 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,9 +14,12 @@
"noUnusedLocals": false,
"noUnusedParameters": false,
"noFallthroughCasesInSwitch": true,
+ "baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
- }
+ },
+ "types": ["vite/client", "node"]
},
- "include": ["src"]
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
}
diff --git a/vite.config.ts b/vite.config.ts
index 38d37d7..db39f3b 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -18,11 +18,13 @@ export default defineConfig({
input: {
main: path.resolve(__dirname, 'index.html')
}
- }
+ },
+ assetsInlineLimit: 0,
},
resolve: {
alias: {
- 'node-fetch': 'isomorphic-fetch'
+ 'node-fetch': 'isomorphic-fetch',
+ '@': path.resolve(__dirname, './src'),
},
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']
},
diff --git a/vitest.config.ts b/vitest.config.ts
index 2a7207d..5a3aaf6 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -1,9 +1,36 @@
import { defineConfig } from 'vitest/config'
+import react from '@vitejs/plugin-react'
+import path from 'path'
export default defineConfig({
+ plugins: [react()],
test: {
globals: true,
environment: 'jsdom',
setupFiles: ['./src/test/setup.ts'],
+ include: ['**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ exclude: ['node_modules', 'dist', '.idea', '.git', '.cache'],
+ coverage: {
+ provider: 'v8',
+ reporter: ['text', 'json', 'html'],
+ exclude: [
+ 'coverage/**',
+ 'dist/**',
+ '**/[.]**',
+ 'packages/*/test{,s}/**',
+ '**/*.d.ts',
+ 'test{,s}/**',
+ 'test{,-*}.{js,cjs,mjs,ts,tsx,jsx}',
+ '**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx}',
+ '**/*{.,-}spec.{js,cjs,mjs,ts,tsx,jsx}',
+ '**/__tests__/**',
+ '**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress}.config.*',
+ ],
+ },
+ },
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ },
},
})
\ No newline at end of file