Compare commits

..

No commits in common. "09c4894a1cf4827ee7afe50699dbe7f83bc3c959" and "2852b889b2673bc4b6fb29f75ff8baece1425f94" have entirely different histories.

28 changed files with 93 additions and 97 deletions

View File

@ -18,7 +18,7 @@ jobs:
id: meta id: meta
uses: docker/metadata-action@v4 uses: docker/metadata-action@v4
with: with:
images: seu-registry.com/leiturama images: seu-registry.com/historias-magicas
tags: | tags: |
type=ref,event=branch type=ref,event=branch
type=ref,event=pr type=ref,event=pr
@ -43,8 +43,8 @@ jobs:
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
cache-from: type=registry,ref=seu-registry.com/leiturama:buildcache cache-from: type=registry,ref=seu-registry.com/historias-magicas:buildcache
cache-to: type=registry,ref=seu-registry.com/leiturama:buildcache,mode=max cache-to: type=registry,ref=seu-registry.com/historias-magicas:buildcache,mode=max
- name: Update Portainer stack - name: Update Portainer stack
if: github.ref == 'refs/heads/main' if: github.ref == 'refs/heads/main'
@ -55,4 +55,4 @@ jobs:
key: ${{ secrets.DEPLOY_KEY }} key: ${{ secrets.DEPLOY_KEY }}
script: | script: |
cd /opt/portainer cd /opt/portainer
docker stack deploy -c portainer-stack.yml leiturama docker stack deploy -c portainer-stack.yml historias-magicas

View File

@ -1,10 +1,10 @@
# Leiturama 🌟 # Histórias Mágicas 🌟
Uma plataforma educacional interativa que oferece histórias personalizadas para crianças entre 6 e 12 anos, com foco na cultura brasileira e educação. Uma plataforma educacional interativa que oferece histórias personalizadas para crianças entre 6 e 12 anos, com foco na cultura brasileira e educação.
## 🎯 Sobre o Projeto ## 🎯 Sobre o Projeto
Leiturama é uma aplicação web desenvolvida em React que permite que crianças explorem histórias educativas de forma interativa e personalizada. O projeto tem como objetivo: Histórias Mágicas é uma aplicação web desenvolvida em React que permite que crianças explorem histórias educativas de forma interativa e personalizada. O projeto tem como objetivo:
- Promover a educação através de narrativas envolventes - Promover a educação através de narrativas envolventes
- Valorizar a diversidade cultural brasileira - Valorizar a diversidade cultural brasileira

View File

@ -1,8 +1,8 @@
version: '3.8' version: '3.8'
services: services:
leiturama: historias-magicas:
image: ${REGISTRY}/leiturama:${TAG} image: ${REGISTRY}/historias-magicas:${TAG}
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL} - NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
@ -14,10 +14,10 @@ services:
deploy: deploy:
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.leiturama.rule=Host(`${DOMAIN}`)" - "traefik.http.routers.historias-magicas.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.leiturama.entrypoints=websecure" - "traefik.http.routers.historias-magicas.entrypoints=websecure"
- "traefik.http.routers.leiturama.tls.certresolver=letsencrypt" - "traefik.http.routers.historias-magicas.tls.certresolver=letsencrypt"
- "traefik.http.services.leiturama.loadbalancer.server.port=3000" - "traefik.http.services.historias-magicas.loadbalancer.server.port=3000"
- "traefik.docker.network=traefik-public" - "traefik.docker.network=traefik-public"
replicas: 1 replicas: 1
update_config: update_config:

View File

@ -4,8 +4,8 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/book.svg" /> <link rel="icon" type="image/svg+xml" href="/book.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Leiturama - Plataforma educacional de histórias interativas para escolas" /> <meta name="description" content="Histórias Mágicas - Plataforma educacional de histórias interativas para escolas" />
<title>Leiturama | Educação através de histórias interativas</title> <title>Histórias Mágicas | Educação através de histórias interativas</title>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">

View File

@ -6,7 +6,7 @@
NODE_VERSION = "18" NODE_VERSION = "18"
VITE_SUPABASE_URL = "https://bsjlbnyslxzsdwxvkaap.supabase.co" VITE_SUPABASE_URL = "https://bsjlbnyslxzsdwxvkaap.supabase.co"
VITE_RESEND_API_KEY = "GEoM_cVt4qyBFVkngJWi8wBrMWOiPMUAuxuFGykcP0A" VITE_RESEND_API_KEY = "GEoM_cVt4qyBFVkngJWi8wBrMWOiPMUAuxuFGykcP0A"
VITE_APP_URL = "https://leiturama.ai/" VITE_APP_URL = "https://historiasmagicas.netlify.app/"
SECRETS_SCAN_OMIT_KEYS = "SUPABASE_ANON_KEY" SECRETS_SCAN_OMIT_KEYS = "SUPABASE_ANON_KEY"
[[redirects]] [[redirects]]

View File

@ -4,7 +4,7 @@ const nextConfig = {
images: { images: {
domains: [ domains: [
'oaidalleapiprodscus.blob.core.windows.net', 'oaidalleapiprodscus.blob.core.windows.net',
'leiturama.ai', 'historiasmagicas.netlify.app',
'localhost', 'localhost',
], ],
formats: ['image/avif', 'image/webp'], formats: ['image/avif', 'image/webp'],

View File

@ -10,8 +10,8 @@
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"format": "prettier --write \"src/**/*.{ts,tsx}\"", "format": "prettier --write \"src/**/*.{ts,tsx}\"",
"docker:build": "docker build -t leiturama .", "docker:build": "docker build -t historias-magicas .",
"docker:run": "docker run -p 3000:3000 leiturama", "docker:run": "docker run -p 3000:3000 historias-magicas",
"deploy:prod": "docker-compose up -d --build" "deploy:prod": "docker-compose up -d --build"
}, },
"dependencies": { "dependencies": {

View File

@ -1,8 +1,8 @@
version: '3.8' version: '3.8'
services: services:
leiturama: historias-magicas:
image: ${REGISTRY}/leiturama:${TAG} image: ${REGISTRY}/historias-magicas:${TAG}
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL} - NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
@ -15,10 +15,10 @@ services:
deploy: deploy:
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.leiturama.rule=Host(`${DOMAIN}`)" - "traefik.http.routers.historias-magicas.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.leiturama.entrypoints=websecure" - "traefik.http.routers.historias-magicas.entrypoints=websecure"
- "traefik.http.routers.leiturama.tls.certresolver=letsencrypt" - "traefik.http.routers.historias-magicas.tls.certresolver=letsencrypt"
- "traefik.http.services.leiturama.loadbalancer.server.port=3000" - "traefik.http.services.historias-magicas.loadbalancer.server.port=3000"
- "traefik.docker.network=traefik-public" - "traefik.docker.network=traefik-public"
replicas: 2 replicas: 2
update_config: update_config:

View File

@ -18,7 +18,7 @@ export function StoryViewer({ theme, user, demo = false }: Props) {
title: "Uma Aventura Educacional", title: "Uma Aventura Educacional",
pages: [ pages: [
{ {
text: "Bem-vindo à demonstração do Leiturama! Aqui você pode ver como funciona nossa plataforma...", text: "Bem-vindo à demonstração do Histórias Mágicas! Aqui você pode ver como funciona nossa plataforma...",
image: "https://images.unsplash.com/photo-1472162072942-cd5147eb3902?auto=format&fit=crop&q=80&w=800&h=600", image: "https://images.unsplash.com/photo-1472162072942-cd5147eb3902?auto=format&fit=crop&q=80&w=800&h=600",
}, },
{ {

View File

@ -12,7 +12,7 @@ export function WelcomePage({ onLoginClick, onRegisterClick }: Props) {
<div className="max-w-6xl mx-auto px-6 py-16"> <div className="max-w-6xl mx-auto px-6 py-16">
<div className="text-center mb-16"> <div className="text-center mb-16">
<h1 className="text-5xl font-bold text-purple-600 mb-4"> <h1 className="text-5xl font-bold text-purple-600 mb-4">
Leiturama Histórias Mágicas
</h1> </h1>
<p className="text-xl text-gray-600"> <p className="text-xl text-gray-600">
Embarque em uma jornada de aprendizado e diversão! Embarque em uma jornada de aprendizado e diversão!

View File

@ -12,7 +12,7 @@ export function Header() {
<div className="flex justify-between items-center h-16"> <div className="flex justify-between items-center h-16">
<Link to="/" className="flex items-center gap-2"> <Link to="/" className="flex items-center gap-2">
<img src="/logo.svg" alt="Logo" className="h-8 w-8" /> <img src="/logo.svg" alt="Logo" className="h-8 w-8" />
<span className="font-semibold text-gray-900">Leiturama</span> <span className="font-semibold text-gray-900">Histórias Mágicas</span>
</Link> </Link>
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">

View File

@ -46,7 +46,7 @@ export function HomePage() {
<div className="flex justify-between items-center h-16"> <div className="flex justify-between items-center h-16">
<div className="flex items-center"> <div className="flex items-center">
<BookOpen className="h-8 w-8 text-purple-600" /> <BookOpen className="h-8 w-8 text-purple-600" />
<span className="ml-2 text-xl font-bold text-gray-900">Leiturama</span> <span className="ml-2 text-xl font-bold text-gray-900">Histórias Mágicas</span>
</div> </div>
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<div className="relative"> <div className="relative">
@ -417,10 +417,10 @@ export function HomePage() {
<div className="mt-24"> <div className="mt-24">
<FAQ <FAQ
title="Dúvidas Frequentes" title="Dúvidas Frequentes"
description="Tire suas dúvidas sobre a implementação do Leiturama em sua escola" description="Tire suas dúvidas sobre a implementação do Histórias Mágicas em sua escola"
items={[ items={[
{ {
question: "Como o Leiturama se integra ao currículo escolar?", question: "Como o Histórias Mágicas se integra ao currículo escolar?",
answer: "Nossa plataforma foi desenvolvida para complementar e enriquecer o currículo existente. Oferecemos conteúdo alinhado à BNCC e ferramentas de personalização que permitem adaptar as atividades aos objetivos pedagógicos específicos de cada escola." answer: "Nossa plataforma foi desenvolvida para complementar e enriquecer o currículo existente. Oferecemos conteúdo alinhado à BNCC e ferramentas de personalização que permitem adaptar as atividades aos objetivos pedagógicos específicos de cada escola."
}, },
{ {

View File

@ -30,7 +30,7 @@ export function DashboardLayout({ children }: DashboardLayoutProps): JSX.Element
<div className="flex items-center pb-4 mb-4 border-b border-gray-200 dark:border-gray-700"> <div className="flex items-center pb-4 mb-4 border-b border-gray-200 dark:border-gray-700">
<img src="/logo.svg" className="h-8 me-3" alt="Logo" /> <img src="/logo.svg" className="h-8 me-3" alt="Logo" />
<span className="self-center text-xl font-semibold whitespace-nowrap dark:text-white"> <span className="self-center text-xl font-semibold whitespace-nowrap dark:text-white">
Leiturama Histórias Mágicas
</span> </span>
</div> </div>
<DashboardSidebar /> <DashboardSidebar />

View File

@ -156,7 +156,7 @@ export function StoryGenerator() {
// Track story generation // Track story generation
const selectedTheme = themes?.find(t => t.id === choices.theme_id)?.title || ''; const selectedTheme = themes?.find(t => t.id === choices.theme_id)?.title || '';
const generationTime = Date.now() - startTime.current; const generationTime = Date.now() - startTime.current;
const wordCount = updatedStory.content.pages.reduce((acc: number, page: { text: string }) => const wordCount = updatedStory.content.pages.reduce((acc, page) =>
acc + page.text.split(/\s+/).length, 0); acc + page.text.split(/\s+/).length, 0);
trackStoryGenerated({ trackStoryGenerated({

View File

@ -21,14 +21,14 @@ export function ComparisonSection({ title, items }: ComparisonSectionProps) {
</h2> </h2>
<div className="grid md:grid-cols-2 gap-8"> <div className="grid md:grid-cols-2 gap-8">
{/* Sem Leiturama */} {/* Sem Histórias Mágicas */}
<div className="p-8 bg-gray-50 rounded-xl border border-gray-200"> <div className="p-8 bg-gray-50 rounded-xl border border-gray-200">
<div className="flex items-center gap-3 mb-8"> <div className="flex items-center gap-3 mb-8">
<div className="w-12 h-12 bg-red-100 rounded-full flex items-center justify-center"> <div className="w-12 h-12 bg-red-100 rounded-full flex items-center justify-center">
<X className="h-6 w-6 text-red-500" /> <X className="h-6 w-6 text-red-500" />
</div> </div>
<h3 className="text-xl font-bold text-gray-900"> <h3 className="text-xl font-bold text-gray-900">
Sem Leiturama Sem Histórias Mágicas
</h3> </h3>
</div> </div>
@ -47,7 +47,7 @@ export function ComparisonSection({ title, items }: ComparisonSectionProps) {
))} ))}
</div> </div>
{/* Com Leiturama */} {/* Com Histórias Mágicas */}
<div className="p-8 bg-gradient-to-br from-purple-50 to-blue-50 rounded-xl <div className="p-8 bg-gradient-to-br from-purple-50 to-blue-50 rounded-xl
border-2 border-purple-200 transform hover:scale-[1.02] transition-transform"> border-2 border-purple-200 transform hover:scale-[1.02] transition-transform">
<div className="flex items-center gap-3 mb-8"> <div className="flex items-center gap-3 mb-8">
@ -56,7 +56,7 @@ export function ComparisonSection({ title, items }: ComparisonSectionProps) {
<CheckCircle className="h-6 w-6 text-white" /> <CheckCircle className="h-6 w-6 text-white" />
</div> </div>
<h3 className="text-xl font-bold text-gray-900"> <h3 className="text-xl font-bold text-gray-900">
Com Leiturama Com Histórias Mágicas
</h3> </h3>
</div> </div>

View File

@ -80,18 +80,18 @@ const defaultColumns: FooterColumn[] = [
]; ];
const defaultSocialLinks: SocialLink[] = [ const defaultSocialLinks: SocialLink[] = [
{ icon: Facebook, href: 'https://facebook.com/leiturama.ai', label: 'Facebook' }, { icon: Facebook, href: 'https://facebook.com/historiasmagicas', label: 'Facebook' },
{ icon: Instagram, href: 'https://instagram.com/leiturama.ai', label: 'Instagram' }, { icon: Instagram, href: 'https://instagram.com/historiasmagicas', label: 'Instagram' },
{ icon: Twitter, href: 'https://twitter.com/leiturama.ai', label: 'Twitter' }, { icon: Twitter, href: 'https://twitter.com/historiasmagicas', label: 'Twitter' },
{ icon: Youtube, href: 'https://youtube.com/leiturama.ai', label: 'Youtube' } { icon: Youtube, href: 'https://youtube.com/historiasmagicas', label: 'Youtube' }
]; ];
export function Footer({ export function Footer({
columns = defaultColumns, columns = defaultColumns,
socialLinks = defaultSocialLinks, socialLinks = defaultSocialLinks,
copyrightText = '© 2024 Leiturama. Todos os direitos reservados.', copyrightText = '© 2024 Histórias Mágicas. Todos os direitos reservados.',
address = 'Rua das Histórias, 123 - São Paulo, SP', address = 'Rua das Histórias, 123 - São Paulo, SP',
email = 'contato@leiturama.ai', email = 'contato@historiasmagicas.com.br',
phone = '(11) 4002-8922' phone = '(11) 4002-8922'
}: FooterProps) { }: FooterProps) {
return ( return (
@ -103,7 +103,7 @@ export function Footer({
<div className="lg:col-span-1 space-y-4"> <div className="lg:col-span-1 space-y-4">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<BookOpen className="h-8 w-8 text-purple-500" /> <BookOpen className="h-8 w-8 text-purple-500" />
<span className="text-xl font-bold text-white">Leiturama</span> <span className="text-xl font-bold text-white">Histórias Mágicas</span>
</div> </div>
<p className="text-sm"> <p className="text-sm">
Transformando a educação através de histórias interativas e métodos cientificamente comprovados Transformando a educação através de histórias interativas e métodos cientificamente comprovados

View File

@ -26,7 +26,7 @@ Sentry.init({
tracesSampleRate: import.meta.env.DEV ? 1.0 : 0.2, tracesSampleRate: import.meta.env.DEV ? 1.0 : 0.2,
tracePropagationTargets: [ tracePropagationTargets: [
"localhost", "localhost",
"leiturama.ai", "historiasmagicas.netlify.app",
"bsjlbnyslxzsdwxvkaap.supabase.co" "bsjlbnyslxzsdwxvkaap.supabase.co"
], ],
replaysSessionSampleRate: import.meta.env.DEV ? 1.0 : 0.1, replaysSessionSampleRate: import.meta.env.DEV ? 1.0 : 0.1,

View File

@ -157,7 +157,7 @@ export function DashboardLayout() {
<div className="flex items-center gap-2 p-6 border-b border-gray-200"> <div className="flex items-center gap-2 p-6 border-b border-gray-200">
<School className="h-8 w-8 text-purple-600" /> <School className="h-8 w-8 text-purple-600" />
{!isCollapsed && ( {!isCollapsed && (
<span className="font-semibold text-gray-900">Leiturama</span> <span className="font-semibold text-gray-900">Histórias Mágicas</span>
)} )}
</div> </div>
@ -185,7 +185,7 @@ export function DashboardLayout() {
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<School className="h-8 w-8 text-purple-600" /> <School className="h-8 w-8 text-purple-600" />
<span className="font-semibold text-gray-900"> <span className="font-semibold text-gray-900">
Leiturama Histórias Mágicas
</span> </span>
</div> </div>
<button <button

View File

@ -36,7 +36,7 @@ const DEMO_DATA = {
content: { content: {
pages: [ pages: [
{ {
text: 'Bem-vindo à demonstração do Leiturama! Aqui você pode ver como funciona nossa plataforma de leitura interativa...', text: 'Bem-vindo à demonstração do Histórias Mágicas! Aqui você pode ver como funciona nossa plataforma de leitura interativa...',
image: 'https://images.unsplash.com/photo-1472162072942-cd5147eb3902?auto=format&fit=crop&q=80&w=800&h=600', image: 'https://images.unsplash.com/photo-1472162072942-cd5147eb3902?auto=format&fit=crop&q=80&w=800&h=600',
}, },
{ {

View File

@ -67,7 +67,7 @@ export function EducationalForParents() {
<div className="mt-10 flex items-center gap-x-8 text-sm text-gray-600"> <div className="mt-10 flex items-center gap-x-8 text-sm text-gray-600">
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<BookOpen className="w-5 h-5 text-purple-600" /> <BookOpen className="w-5 h-5 text-purple-600" />
<span>Mais de 10.000 Leiturama criadas</span> <span>Mais de 10.000 histórias mágicas criadas</span>
</div> </div>
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<Target className="w-5 h-5 text-purple-600" /> <Target className="w-5 h-5 text-purple-600" />
@ -169,7 +169,7 @@ export function EducationalForParents() {
Resultados Comprovados Resultados Comprovados
</h2> </h2>
<p className="mt-4 text-lg leading-8 text-gray-600"> <p className="mt-4 text-lg leading-8 text-gray-600">
Números que demonstram o impacto do Leiturama no aprendizado. Números que demonstram o impacto do Histórias Mágicas no aprendizado.
</p> </p>
</div> </div>
<div className="mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4"> <div className="mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4">
@ -207,7 +207,7 @@ export function EducationalForParents() {
Histórias de Transformação Histórias de Transformação
</h2> </h2>
<p className="mt-4 text-lg leading-8 text-gray-600"> <p className="mt-4 text-lg leading-8 text-gray-600">
Veja como o Leiturama está transformando a vida de famílias por todo o Brasil. Veja como o Histórias Mágicas está transformando a vida de famílias por todo o Brasil.
</p> </p>
</div> </div>
<div className="mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3"> <div className="mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3">
@ -335,7 +335,7 @@ const comparisonData = [
'Dificuldade em acompanhar o progresso' 'Dificuldade em acompanhar o progresso'
], ],
with: [ with: [
'Leiturama personalizadas em minutos', 'Histórias mágicas personalizadas em minutos',
'Crianças fascinadas por aventuras únicas', 'Crianças fascinadas por aventuras únicas',
'Mundos mágicos que educam e encantam', 'Mundos mágicos que educam e encantam',
'Portal mágico de acompanhamento do progresso' 'Portal mágico de acompanhamento do progresso'
@ -408,7 +408,7 @@ const detailedBenefits = [
const testimonials = [ const testimonials = [
{ {
text: "Minha filha sempre teve dificuldade com leitura, mas desde que começamos a usar o Leiturama, ela não para de pedir para ler mais uma história!", text: "Minha filha sempre teve dificuldade com leitura, mas desde que começamos a usar o Histórias Mágicas, ela não para de pedir para ler mais uma história!",
name: "Ana Clara Silva", name: "Ana Clara Silva",
role: "Mãe da Sofia, 8 anos", role: "Mãe da Sofia, 8 anos",
image: "/images/testimonial-1.webp", image: "/images/testimonial-1.webp",
@ -433,7 +433,7 @@ const testimonials = [
const faqItems = [ const faqItems = [
{ {
question: "Como a plataforma auxilia no trabalho do professor?", question: "Como a plataforma auxilia no trabalho do professor?",
answer: "O Leiturama oferece ferramentas que automatizam a avaliação da leitura, gerando relatórios detalhados sobre o progresso de cada aluno. Isso permite que você foque seu tempo no que mais importa: o desenvolvimento personalizado de cada estudante." answer: "O Histórias Mágicas oferece ferramentas que automatizam a avaliação da leitura, gerando relatórios detalhados sobre o progresso de cada aluno. Isso permite que você foque seu tempo no que mais importa: o desenvolvimento personalizado de cada estudante."
}, },
{ {
question: "A plataforma se integra ao currículo escolar?", question: "A plataforma se integra ao currículo escolar?",
@ -488,10 +488,10 @@ const footerLinks = [
]; ];
const socialLinks = [ const socialLinks = [
{ icon: Facebook, href: "https://facebook.com/leiturama.ai" }, { icon: Facebook, href: "https://facebook.com/historias-magicas" },
{ icon: Instagram, href: "https://instagram.com/leiturama.ai" }, { icon: Instagram, href: "https://instagram.com/historias-magicas" },
{ icon: Twitter, href: "https://twitter.com/leiturama.ai" }, { icon: Twitter, href: "https://twitter.com/historias-magicas" },
{ icon: Youtube, href: "https://youtube.com/leiturama.ai" } { icon: Youtube, href: "https://youtube.com/historias-magicas" }
]; ];
const paymentMethods = [ const paymentMethods = [

View File

@ -28,7 +28,7 @@ import { FAQ } from '@/components/ui/faq';
// Meta tags e SEO // Meta tags e SEO
const meta = { const meta = {
title: 'Leiturama | Alfabetização Baseada em Evidências', 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.', 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', keywords: 'alfabetização, evidências científicas, educação baseada em ciência, phonics, consciência fonológica, literatura infantil',
security: { security: {

View File

@ -68,7 +68,7 @@ export function ParentsLandingPage(): JSX.Element {
<div className="absolute inset-0 bg-[url('/patterns/dots.svg')] opacity-5" /> <div className="absolute inset-0 bg-[url('/patterns/dots.svg')] opacity-5" />
<div className="mx-auto max-w-7xl relative"> <div className="mx-auto max-w-7xl relative">
<h2 className="text-3xl font-bold text-center text-gray-900 mb-16"> <h2 className="text-3xl font-bold text-center text-gray-900 mb-16">
Por que escolher o Leiturama? Por que escolher o Histórias Mágicas?
</h2> </h2>
<div className="grid md:grid-cols-3 gap-8"> <div className="grid md:grid-cols-3 gap-8">
@ -288,11 +288,11 @@ export function ParentsLandingPage(): JSX.Element {
</h2> </h2>
<div className="grid md:grid-cols-2 gap-8"> <div className="grid md:grid-cols-2 gap-8">
{/* Sem o Leiturama */} {/* Sem o Histórias Mágicas */}
<div className="p-8 bg-gray-50 rounded-xl"> <div className="p-8 bg-gray-50 rounded-xl">
<h3 className="text-xl font-bold text-gray-900 mb-6 flex items-center gap-2"> <h3 className="text-xl font-bold text-gray-900 mb-6 flex items-center gap-2">
<X className="text-red-500" /> <X className="text-red-500" />
Sem o Leiturama Sem o Histórias Mágicas
</h3> </h3>
<ul className="space-y-4"> <ul className="space-y-4">
@ -329,11 +329,11 @@ export function ParentsLandingPage(): JSX.Element {
</ul> </ul>
</div> </div>
{/* Com o Leiturama */} {/* Com o Histórias Mágicas */}
<div className="p-8 bg-purple-50 rounded-xl"> <div className="p-8 bg-purple-50 rounded-xl">
<h3 className="text-xl font-bold text-gray-900 mb-6 flex items-center gap-2"> <h3 className="text-xl font-bold text-gray-900 mb-6 flex items-center gap-2">
<Check className="text-green-500" /> <Check className="text-green-500" />
Com o Leiturama Com o Histórias Mágicas
</h3> </h3>
<ul className="space-y-4"> <ul className="space-y-4">
@ -407,11 +407,11 @@ export function ParentsLandingPage(): JSX.Element {
{/* 6. FAQ */} {/* 6. FAQ */}
<FAQ <FAQ
title="Dúvidas Frequentes" title="Dúvidas Frequentes"
description="Tire suas dúvidas sobre o Leiturama" description="Tire suas dúvidas sobre o Histórias Mágicas"
items={[ items={[
{ {
question: "Como funciona o Leiturama?", question: "Como funciona o Histórias Mágicas?",
answer: "O Leiturama é uma plataforma interativa que combina tecnologia e pedagogia para desenvolver habilidades de leitura. Seu filho terá acesso a histórias personalizadas, feedback em tempo real e exercícios adaptados ao seu nível de leitura." answer: "O Histórias Mágicas é uma plataforma interativa que combina tecnologia e pedagogia para desenvolver habilidades de leitura. Seu filho terá acesso a histórias personalizadas, feedback em tempo real e exercícios adaptados ao seu nível de leitura."
}, },
{ {
question: "Qual é a idade recomendada?", question: "Qual é a idade recomendada?",
@ -427,7 +427,7 @@ export function ParentsLandingPage(): JSX.Element {
}, },
{ {
question: "Quais dispositivos são compatíveis?", question: "Quais dispositivos são compatíveis?",
answer: "O Leiturama funciona em qualquer navegador moderno, seja no computador, tablet ou smartphone. Recomendamos o uso de fones de ouvido para melhor experiência com os exercícios de pronúncia." answer: "O Histórias Mágicas funciona em qualquer navegador moderno, seja no computador, tablet ou smartphone. Recomendamos o uso de fones de ouvido para melhor experiência com os exercícios de pronúncia."
}, },
{ {
question: "Como é feita a avaliação da leitura?", question: "Como é feita a avaliação da leitura?",
@ -449,7 +449,7 @@ export function ParentsLandingPage(): JSX.Element {
<p className="text-xl text-gray-600 mb-12 leading-relaxed"> <p className="text-xl text-gray-600 mb-12 leading-relaxed">
Junte-se a milhares de pais que transformaram a experiência Junte-se a milhares de pais que transformaram a experiência
de leitura de seus filhos com o Leiturama. de leitura de seus filhos com o Histórias Mágicas.
</p> </p>
<button <button

View File

@ -11,7 +11,7 @@ export function TextSalesLetter() {
{/* Hero Section */} {/* Hero Section */}
<div className="max-w-3xl mx-auto px-4 py-12 sm:py-16 lg:py-20"> <div className="max-w-3xl mx-auto px-4 py-12 sm:py-16 lg:py-20">
<h1 className="text-4xl font-bold text-gray-900 mb-8 text-center"> <h1 className="text-4xl font-bold text-gray-900 mb-8 text-center">
Leiturama e A Revolução da Alfabetização: Como a Ciência e a Tecnologia Estão Transformando o Aprendizado da Leitura A Revolução da Alfabetização: Como a Ciência e a Tecnologia Estão Transformando o Aprendizado da Leitura
</h1> </h1>
<div className="prose prose-lg max-w-none text-gray-600 space-y-6"> <div className="prose prose-lg max-w-none text-gray-600 space-y-6">
@ -142,7 +142,7 @@ export function TextSalesLetter() {
</div> </div>
<h2 className="text-2xl font-bold text-gray-900 mt-12"> <h2 className="text-2xl font-bold text-gray-900 mt-12">
Como a Leiturama Revoluciona a Alfabetização Como a Histórias Mágicas Revoluciona a Alfabetização
</h2> </h2>
<p> <p>
@ -231,7 +231,7 @@ export function TextSalesLetter() {
</h2> </h2>
<p> <p>
Implementar a Leiturama em sua escola é um processo simples e estruturado: Implementar a Histórias Mágicas em sua escola é um processo simples e estruturado:
</p> </p>
<div className="space-y-6 mt-6"> <div className="space-y-6 mt-6">
@ -313,7 +313,7 @@ export function TextSalesLetter() {
</h2> </h2>
<p> <p>
Escolas que implementaram a Leiturama relatam: Escolas que implementaram a Histórias Mágicas relatam:
</p> </p>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6 mt-6"> <div className="grid grid-cols-1 sm:grid-cols-2 gap-6 mt-6">
@ -370,7 +370,7 @@ export function TextSalesLetter() {
<p className="text-purple-800 italic"> <p className="text-purple-800 italic">
"A transformação que vimos em nossa escola foi incrível. Alunos que mal conseguiam "A transformação que vimos em nossa escola foi incrível. Alunos que mal conseguiam
juntar letras agora estão lendo com fluência e, mais importante, com prazer. A juntar letras agora estão lendo com fluência e, mais importante, com prazer. A
Leiturama não é apenas uma plataforma, é uma revolução na alfabetização." Histórias Mágicas não é apenas uma plataforma, é uma revolução na alfabetização."
</p> </p>
<p className="text-purple-600 mt-2 font-semibold"> <p className="text-purple-600 mt-2 font-semibold">
- Maria Silva, Diretora Pedagógica - Maria Silva, Diretora Pedagógica
@ -391,7 +391,7 @@ export function TextSalesLetter() {
<div className="border-l-4 border-purple-600 pl-4"> <div className="border-l-4 border-purple-600 pl-4">
<p className="text-purple-800 italic"> <p className="text-purple-800 italic">
"Meu filho sempre teve dificuldade com leitura e isso afetava sua autoestima. "Meu filho sempre teve dificuldade com leitura e isso afetava sua autoestima.
Desde que começamos a usar a Leiturama, ele não melhorou na leitura, Desde que começamos a usar a Histórias Mágicas, ele não melhorou na leitura,
mas recuperou a confiança e o prazer de aprender." mas recuperou a confiança e o prazer de aprender."
</p> </p>
<p className="text-purple-600 mt-2 font-semibold"> <p className="text-purple-600 mt-2 font-semibold">
@ -406,7 +406,7 @@ export function TextSalesLetter() {
</h2> </h2>
<p> <p>
Quando você investe na Leiturama, está investindo em: Quando você investe na Histórias Mágicas, está investindo em:
</p> </p>
<ul className="list-disc pl-6 space-y-2 mt-2"> <ul className="list-disc pl-6 space-y-2 mt-2">
@ -452,7 +452,7 @@ export function TextSalesLetter() {
<p className="text-sm text-gray-500 mt-8"> <p className="text-sm text-gray-500 mt-8">
P.S.: A revolução na alfabetização está acontecendo agora. Não deixe sua escola P.S.: A revolução na alfabetização está acontecendo agora. Não deixe sua escola
para trás. Junte-se às milhares de instituições que descobriram o poder da para trás. Junte-se às milhares de instituições que descobriram o poder da
educação baseada em evidências com a Leiturama. educação baseada em evidências com a Histórias Mágicas.
</p> </p>
</div> </div>
</div> </div>

View File

@ -138,22 +138,18 @@ export function ExercisePage() {
<WordFormation <WordFormation
words={exerciseWords.map(w => w.word)} words={exerciseWords.map(w => w.word)}
storyId={storyId as string} storyId={storyId as string}
studentId={exerciseData.story.student_id}
/> />
); );
case 'sentence-completion': case 'sentence-completion':
return ( return (
<SentenceCompletion <SentenceCompletion
story={exerciseData.story} story={exerciseData.story}
studentId={exerciseData.story.student_id}
/> />
); );
case 'pronunciation-practice': case 'pronunciation-practice':
return ( return (
<PronunciationPractice <PronunciationPractice
words={exerciseWords.map(w => w.word)} words={exerciseWords.map(w => w.word)}
storyId={storyId as string}
studentId={exerciseData.story.student_id}
/> />
); );
default: default:

View File

@ -141,7 +141,7 @@ export function StudentDashboardLayout() {
<div className="flex items-center gap-2 p-6 border-b border-gray-200"> <div className="flex items-center gap-2 p-6 border-b border-gray-200">
<School className="h-8 w-8 text-purple-600" /> <School className="h-8 w-8 text-purple-600" />
{!isCollapsed && ( {!isCollapsed && (
<span className="font-semibold text-gray-900">Leiturama</span> <span className="font-semibold text-gray-900">Histórias Mágicas</span>
)} )}
</div> </div>
@ -169,7 +169,7 @@ export function StudentDashboardLayout() {
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<School className="h-8 w-8 text-purple-600" /> <School className="h-8 w-8 text-purple-600" />
<span className="font-semibold text-gray-900"> <span className="font-semibold text-gray-900">
Leiturama Histórias Mágicas
</span> </span>
</div> </div>
<button <button

View File

@ -20,13 +20,13 @@ export async function sendStudentCredentialsEmail({
try { try {
// Email para o aluno // Email para o aluno
await resend.emails.send({ await resend.emails.send({
from: 'Leiturama <noreply@leiturama.ai>', from: 'Histórias Mágicas <noreply@historias-magicas.com.br>',
to: studentEmail, to: studentEmail,
subject: 'Bem-vindo ao Leiturama!', subject: 'Bem-vindo ao Histórias Mágicas!',
html: ` html: `
<div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;"> <div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;">
<h1 style="color: #7C3AED;">Olá ${studentName}!</h1> <h1 style="color: #7C3AED;">Olá ${studentName}!</h1>
<p>Bem-vindo ao Leiturama! Sua conta foi criada com sucesso.</p> <p>Bem-vindo ao Histórias Mágicas! Sua conta foi criada com sucesso.</p>
<p>Use as credenciais abaixo para acessar sua conta:</p> <p>Use as credenciais abaixo para acessar sua conta:</p>
<div style="background-color: #F3F4F6; padding: 16px; border-radius: 8px; margin: 16px 0;"> <div style="background-color: #F3F4F6; padding: 16px; border-radius: 8px; margin: 16px 0;">
<p style="margin: 0;"><strong>Email:</strong> ${studentEmail}</p> <p style="margin: 0;"><strong>Email:</strong> ${studentEmail}</p>
@ -47,14 +47,14 @@ export async function sendStudentCredentialsEmail({
// Email para o responsável // Email para o responsável
await resend.emails.send({ await resend.emails.send({
from: 'Leiturama <noreply@leiturama.ai>', from: 'Histórias Mágicas <noreply@historias-magicas.com.br>',
to: guardianEmail, to: guardianEmail,
subject: `Conta do ${studentName} criada no Leiturama`, subject: `Conta do ${studentName} criada no Histórias Mágicas`,
html: ` html: `
<div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;"> <div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;">
<h1 style="color: #7C3AED;">Olá ${guardianName}!</h1> <h1 style="color: #7C3AED;">Olá ${guardianName}!</h1>
<p> <p>
Uma conta foi criada para ${studentName} na plataforma Leiturama. Uma conta foi criada para ${studentName} na plataforma Histórias Mágicas.
Como responsável, você receberá atualizações sobre o progresso e atividades. Como responsável, você receberá atualizações sobre o progresso e atividades.
</p> </p>
<p>As credenciais de acesso foram enviadas para o email do aluno:</p> <p>As credenciais de acesso foram enviadas para o email do aluno:</p>
@ -67,7 +67,7 @@ export async function sendStudentCredentialsEmail({
</p> </p>
<div style="font-size: 14px; color: #6B7280; margin-top: 24px;"> <div style="font-size: 14px; color: #6B7280; margin-top: 24px;">
<p> <p>
O Leiturama é uma plataforma educacional que permite aos alunos O Histórias Mágicas é uma plataforma educacional que permite aos alunos
criarem e compartilharem histórias interativas, incentivando a criatividade criarem e compartilharem histórias interativas, incentivando a criatividade
e o aprendizado. e o aprendizado.
</p> </p>

View File

@ -1,12 +1,12 @@
[project] [project]
id = "bsjlbnyslxzsdwxvkaap" id = "bsjlbnyslxzsdwxvkaap"
name = "Leiturama" name = "Histórias Mágicas"
[auth] [auth]
enabled = true enabled = true
site_url = "https://leiturama.ai" site_url = "https://historiasmagicas.netlify.app"
additional_redirect_urls = [ additional_redirect_urls = [
"https://leiturama.ai/*", "https://historiasmagicas.netlify.app/*",
"http://localhost:5173/*", "http://localhost:5173/*",
"http://localhost:3000/*" "http://localhost:3000/*"
] ]
@ -35,7 +35,7 @@ providers = ["google"]
enabled = true enabled = true
client_id = "your-client-id" client_id = "your-client-id"
secret = "your-client-secret" secret = "your-client-secret"
redirect_uri = "https://leiturama.ai/auth/callback" redirect_uri = "https://historiasmagicas.netlify.app/auth/callback"
[storage] [storage]
enabled = true enabled = true
@ -43,7 +43,7 @@ file_size_limit = "50MB"
[storage.cors] [storage.cors]
allowed_origins = [ allowed_origins = [
"https://leiturama.ai", "https://historiasmagicas.netlify.app",
"http://localhost:5173", "http://localhost:5173",
"http://localhost:3000" "http://localhost:3000"
] ]
@ -74,7 +74,7 @@ max_rows = 1000
[api.cors] [api.cors]
enabled = true enabled = true
allowed_origins = [ allowed_origins = [
"https://leiturama.ai", "https://historiasmagicas.netlify.app",
"http://localhost:5173", "http://localhost:5173",
"http://localhost:3000" "http://localhost:3000"
] ]
@ -110,7 +110,7 @@ max_client_conn = 100
[studio] [studio]
enabled = true enabled = true
port = 54323 port = 54323
api_url = "https://leiturama.ai" api_url = "https://historiasmagicas.netlify.app"
[inbucket] [inbucket]
enabled = true enabled = true

View File

@ -18,7 +18,7 @@ interface StoryPrompt {
const ALLOWED_ORIGINS = [ const ALLOWED_ORIGINS = [
'http://localhost:5173', // Vite dev server 'http://localhost:5173', // Vite dev server
'http://localhost:3000', // Caso use outro port 'http://localhost:3000', // Caso use outro port
'https://leiturama.ai' // Produção 'https://historiasmagicas.netlify.app' // Produção
]; ];
// Função para otimizar URL da imagem // Função para otimizar URL da imagem