feat: adiciona landing page para pais

- Implementa layout moderno e responsivo
- Adiciona seções: Hero, Benefícios, Como Funciona, Análise, Diferencial, Depoimentos e CTA
- Integra gráficos interativos com recharts
- Adiciona métricas de exemplo e comparativos
- Mantém consistência visual com HomePage
- Implementa navegação e rotas
- Otimiza imagens e assets
- Adiciona animações e transições suaves
This commit is contained in:
Lucas Santana 2024-12-24 17:07:13 -03:00
parent 3ef8c99062
commit 563a62a517
6 changed files with 852 additions and 4 deletions

View File

@ -8,6 +8,20 @@ e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/).
## [0.1.0] - 2024-03-23
### Adicionado
- Landing page para pais
- Design moderno e atraente
- Seções de benefícios e funcionalidades
- Demonstração de métricas e análises
- Gráficos interativos com recharts
- Gráfico de evolução do aluno
- Comparativo antes/depois
- Depoimentos de usuários
- CTAs estratégicos
- Demonstração interativa
- Copywriting focado em resultados
- Imagens otimizadas e responsivas
- Rota dedicada em /para-pais
- Edge function `generate-story` para geração de histórias com IA
- Integração com OpenAI GPT para criação de texto
- Integração com DALL-E para geração de imagens
@ -39,6 +53,15 @@ e este projeto adere ao [Semantic Versioning](https://semver.org/lang/pt-BR/).
- Melhor performance em navegação
### Modificado
- Reorganização da landing page para pais
- Reordenação das seções para melhor fluxo
- Hero → Por que escolher → Como Funciona → Análise → Diferença → Depoimentos → CTA
- Otimização da jornada do usuário
- Melhor hierarquia de informações
- Fluxo narrativo mais coerente
- Progressão lógica de informações
- Posicionamento estratégico do CTA
- Reorganização da estrutura de arquivos
- Remoção da pasta /pages/story
- Consolidação dos componentes de história em /pages/student-dashboard

367
package-lock.json generated
View File

@ -18,6 +18,7 @@
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
"react-router-dom": "^6.28.0",
"recharts": "^2.15.0",
"resend": "^3.2.0",
"tailwind-merge": "^2.5.5"
},
@ -300,6 +301,18 @@
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/runtime": {
"version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
"integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
@ -1741,6 +1754,69 @@
"@babel/types": "^7.20.7"
}
},
"node_modules/@types/d3-array": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
"license": "MIT"
},
"node_modules/@types/d3-color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
"license": "MIT"
},
"node_modules/@types/d3-ease": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
"license": "MIT"
},
"node_modules/@types/d3-interpolate": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
"license": "MIT",
"dependencies": {
"@types/d3-color": "*"
}
},
"node_modules/@types/d3-path": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
"integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==",
"license": "MIT"
},
"node_modules/@types/d3-scale": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
"license": "MIT",
"dependencies": {
"@types/d3-time": "*"
}
},
"node_modules/@types/d3-shape": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
"integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
"license": "MIT",
"dependencies": {
"@types/d3-path": "*"
}
},
"node_modules/@types/d3-time": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
"integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
"license": "MIT"
},
"node_modules/@types/d3-timer": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
"license": "MIT"
},
"node_modules/@types/estree": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
@ -2480,8 +2556,128 @@
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"devOptional": true
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/d3-array": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
"license": "ISC",
"dependencies": {
"internmap": "1 - 2"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-color": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-ease": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-format": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-interpolate": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"license": "ISC",
"dependencies": {
"d3-color": "1 - 3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-path": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-scale": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"license": "ISC",
"dependencies": {
"d3-array": "2.10.0 - 3",
"d3-format": "1 - 3",
"d3-interpolate": "1.2.0 - 3",
"d3-time": "2.1.1 - 3",
"d3-time-format": "2 - 4"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-shape": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"license": "ISC",
"dependencies": {
"d3-path": "^3.1.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-time": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
"license": "ISC",
"dependencies": {
"d3-array": "2 - 3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-time-format": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"license": "ISC",
"dependencies": {
"d3-time": "1 - 3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-timer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.1",
@ -2510,6 +2706,12 @@
}
}
},
"node_modules/decimal.js-light": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
"license": "MIT"
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@ -2537,6 +2739,16 @@
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true
},
"node_modules/dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
"integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.8.7",
"csstype": "^3.0.2"
}
},
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@ -2989,12 +3201,27 @@
"node": ">=0.10.0"
}
},
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"license": "MIT"
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/fast-equals": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
"integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/fast-glob": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@ -3381,6 +3608,15 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"license": "ISC"
},
"node_modules/internmap": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@ -3628,6 +3864,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@ -3868,7 +4110,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
@ -4211,6 +4452,23 @@
"node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"node_modules/prop-types/node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT"
},
"node_modules/proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@ -4287,6 +4545,12 @@
"react": "^16.8.0 || ^17 || ^18 || ^19"
}
},
"node_modules/react-is": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"license": "MIT"
},
"node_modules/react-promise-suspense": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/react-promise-suspense/-/react-promise-suspense-0.3.4.tgz",
@ -4343,6 +4607,37 @@
"react-dom": ">=16.8"
}
},
"node_modules/react-smooth": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz",
"integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==",
"license": "MIT",
"dependencies": {
"fast-equals": "^5.0.1",
"prop-types": "^15.8.1",
"react-transition-group": "^4.4.5"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
"integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
"license": "BSD-3-Clause",
"dependencies": {
"@babel/runtime": "^7.5.5",
"dom-helpers": "^5.0.1",
"loose-envify": "^1.4.0",
"prop-types": "^15.6.2"
},
"peerDependencies": {
"react": ">=16.6.0",
"react-dom": ">=16.6.0"
}
},
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@ -4374,6 +4669,44 @@
"node": ">=8.10.0"
}
},
"node_modules/recharts": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.0.tgz",
"integrity": "sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==",
"license": "MIT",
"dependencies": {
"clsx": "^2.0.0",
"eventemitter3": "^4.0.1",
"lodash": "^4.17.21",
"react-is": "^18.3.1",
"react-smooth": "^4.0.0",
"recharts-scale": "^0.4.4",
"tiny-invariant": "^1.3.1",
"victory-vendor": "^36.6.8"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/recharts-scale": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
"integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
"license": "MIT",
"dependencies": {
"decimal.js-light": "^2.4.1"
}
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"license": "MIT"
},
"node_modules/resend": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/resend/-/resend-3.5.0.tgz",
@ -4833,6 +5166,12 @@
"node": ">=0.8"
}
},
"node_modules/tiny-invariant": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
"license": "MIT"
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@ -4977,6 +5316,28 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
"node_modules/victory-vendor": {
"version": "36.9.2",
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz",
"integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==",
"license": "MIT AND ISC",
"dependencies": {
"@types/d3-array": "^3.0.3",
"@types/d3-ease": "^3.0.0",
"@types/d3-interpolate": "^3.0.1",
"@types/d3-scale": "^4.0.2",
"@types/d3-shape": "^3.1.0",
"@types/d3-time": "^3.0.0",
"@types/d3-timer": "^3.0.0",
"d3-array": "^3.1.6",
"d3-ease": "^3.0.1",
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.1.0",
"d3-time": "^3.0.0",
"d3-timer": "^3.0.1"
}
},
"node_modules/vite": {
"version": "5.4.8",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",

View File

@ -22,6 +22,7 @@
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
"react-router-dom": "^6.28.0",
"recharts": "^2.15.0",
"resend": "^3.2.0",
"tailwind-merge": "^2.5.5"
},

View File

@ -0,0 +1,458 @@
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';
export function ParentsLandingPage(): JSX.Element {
const navigate = useNavigate();
return (
<div className="min-h-screen bg-gradient-to-b from-purple-50 via-white to-purple-50">
{/* 1. Hero Section */}
<section className="relative overflow-hidden">
<div className="absolute inset-0 bg-[url('/patterns/grid.svg')] opacity-5" />
<div className="px-4 py-24 mx-auto max-w-7xl relative">
<div className="flex flex-col md:flex-row items-center gap-16">
<div className="flex-1 space-y-8">
<h1 className="text-6xl font-bold text-gray-900 leading-tight">
Transforme a Leitura do Seu Filho em uma
<span className="bg-gradient-to-r from-purple-600 to-indigo-600 bg-clip-text text-transparent">
Jornada Mágica
</span>
</h1>
<p className="text-xl text-gray-600 leading-relaxed">
Uma plataforma educacional que combina tecnologia e pedagogia para
desenvolver habilidades essenciais de leitura de forma divertida e envolvente.
</p>
<div className="flex gap-4">
<button
onClick={() => navigate('/register/parent')}
className="px-8 py-4 bg-gradient-to-r from-purple-600 to-indigo-600 text-white rounded-xl
hover:from-purple-700 hover:to-indigo-700 transform hover:scale-105 transition-all shadow-lg"
>
Começar Gratuitamente
<ArrowRight className="inline-block ml-2 h-5 w-5" />
</button>
<button
onClick={() => navigate('/demo')}
className="px-8 py-4 border-2 border-purple-600 text-purple-600 rounded-xl
hover:bg-purple-50 transform hover:scale-105 transition-all"
>
Ver Demonstração
</button>
</div>
</div>
<div className="flex-1">
<div className="relative">
<div className="absolute -inset-4 bg-gradient-to-r from-purple-600 to-indigo-600 rounded-2xl blur-lg opacity-20" />
<img
src="/images/reading-kid.webp"
alt="Criança lendo com entusiasmo"
className="relative rounded-2xl shadow-2xl transform hover:scale-[1.02] transition-transform"
/>
</div>
</div>
</div>
</div>
</section>
{/* 2. Por que escolher */}
<section className="px-4 py-24 bg-white relative overflow-hidden">
<div className="absolute inset-0 bg-[url('/patterns/dots.svg')] opacity-5" />
<div className="mx-auto max-w-7xl relative">
<h2 className="text-3xl font-bold text-center text-gray-900 mb-16">
Por que escolher o Histórias Mágicas?
</h2>
<div className="grid md:grid-cols-3 gap-8">
<div className="p-6 bg-purple-50 rounded-xl">
<BookOpen className="h-12 w-12 text-purple-600 mb-4" />
<h3 className="text-xl font-bold text-gray-900 mb-2">
Leitura Personalizada
</h3>
<p className="text-gray-600">
Histórias adaptadas ao nível e interesses do seu filho,
garantindo engajamento e progresso contínuo.
</p>
</div>
<div className="p-6 bg-purple-50 rounded-xl">
<Brain className="h-12 w-12 text-purple-600 mb-4" />
<h3 className="text-xl font-bold text-gray-900 mb-2">
Análise em Tempo Real
</h3>
<p className="text-gray-600">
Feedback instantâneo sobre fluência, compreensão e
pronúncia para identificar áreas de melhoria.
</p>
</div>
<div className="p-6 bg-purple-50 rounded-xl">
<Target className="h-12 w-12 text-purple-600 mb-4" />
<h3 className="text-xl font-bold text-gray-900 mb-2">
Progresso Mensurável
</h3>
<p className="text-gray-600">
Acompanhe o desenvolvimento do seu filho com métricas
claras e relatórios detalhados.
</p>
</div>
</div>
</div>
</section>
{/* 3. Como Funciona */}
<section className="px-4 py-24">
<div className="mx-auto max-w-7xl">
<h2 className="text-3xl font-bold text-center text-gray-900 mb-16">
Como Funciona
</h2>
<div className="grid md:grid-cols-2 gap-12 items-center">
<div className="space-y-8">
<div className="flex gap-4">
<div className="flex-shrink-0 w-8 h-8 bg-purple-600 text-white rounded-full flex items-center justify-center">
1
</div>
<div>
<h3 className="text-xl font-bold text-gray-900 mb-2">
Escolha uma História
</h3>
<p className="text-gray-600">
Biblioteca diversificada com conteúdo educativo e adequado
para cada idade e nível de leitura.
</p>
</div>
</div>
<div className="flex gap-4">
<div className="flex-shrink-0 w-8 h-8 bg-purple-600 text-white rounded-full flex items-center justify-center">
2
</div>
<div>
<h3 className="text-xl font-bold text-gray-900 mb-2">
Pratique a Leitura
</h3>
<p className="text-gray-600">
Interface interativa que incentiva a leitura em voz alta
e fornece suporte quando necessário.
</p>
</div>
</div>
<div className="flex gap-4">
<div className="flex-shrink-0 w-8 h-8 bg-purple-600 text-white rounded-full flex items-center justify-center">
3
</div>
<div>
<h3 className="text-xl font-bold text-gray-900 mb-2">
Receba Feedback
</h3>
<p className="text-gray-600">
Análise detalhada do desempenho com sugestões
personalizadas para melhorar.
</p>
</div>
</div>
</div>
<div className="bg-white p-8 rounded-xl shadow-xl">
<img
src="/images/app-demo.webp"
alt="Demonstração da plataforma"
className="rounded-lg"
/>
</div>
</div>
</div>
</section>
{/* 4. Análise Detalhada */}
<section className="px-4 py-24 bg-gray-50">
<div className="mx-auto max-w-7xl">
<h2 className="text-3xl font-bold text-center text-gray-900 mb-16">
Análise Detalhada do Progresso
</h2>
<div className="grid md:grid-cols-2 gap-12">
{/* Métricas */}
<div className="bg-white p-8 rounded-xl shadow-sm">
<h3 className="text-xl font-bold text-gray-900 mb-6">
Exemplo de Análise de Leitura
</h3>
<div className="grid grid-cols-2 gap-6">
<div className="space-y-2">
<p className="text-sm text-gray-500">Fluência</p>
<div className="flex items-center gap-2">
<div className="flex-1 h-4 bg-gray-100 rounded-full overflow-hidden">
<div className="h-full bg-green-500 rounded-full" style={{ width: '85%' }} />
</div>
<span className="text-sm font-medium">85%</span>
</div>
</div>
<div className="space-y-2">
<p className="text-sm text-gray-500">Pronúncia</p>
<div className="flex items-center gap-2">
<div className="flex-1 h-4 bg-gray-100 rounded-full overflow-hidden">
<div className="h-full bg-blue-500 rounded-full" style={{ width: '92%' }} />
</div>
<span className="text-sm font-medium">92%</span>
</div>
</div>
<div className="space-y-2">
<p className="text-sm text-gray-500">Compreensão</p>
<div className="flex items-center gap-2">
<div className="flex-1 h-4 bg-gray-100 rounded-full overflow-hidden">
<div className="h-full bg-purple-500 rounded-full" style={{ width: '88%' }} />
</div>
<span className="text-sm font-medium">88%</span>
</div>
</div>
<div className="space-y-2">
<p className="text-sm text-gray-500">Ritmo</p>
<div className="flex items-center gap-2">
<div className="flex-1 h-4 bg-gray-100 rounded-full overflow-hidden">
<div className="h-full bg-yellow-500 rounded-full" style={{ width: '78%' }} />
</div>
<span className="text-sm font-medium">78%</span>
</div>
</div>
</div>
<div className="mt-8 p-4 bg-purple-50 rounded-lg">
<h4 className="font-medium text-purple-900 mb-2">Sugestões de Melhoria</h4>
<ul className="text-sm text-purple-700 space-y-2">
<li> Praticar palavras mais complexas</li>
<li> Manter ritmo constante durante a leitura</li>
<li> Fazer pausas adequadas na pontuação</li>
</ul>
</div>
</div>
{/* Gráfico */}
<div className="bg-white p-8 rounded-xl shadow-sm">
<h3 className="text-xl font-bold text-gray-900 mb-6">
Evolução da Leitura
</h3>
<div className="h-[300px]">
<ResponsiveContainer width="100%" height="100%">
<LineChart
data={progressData}
margin={{ top: 5, right: 30, left: 20, bottom: 5 }}
>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="month" />
<YAxis />
<Tooltip />
<Line
type="monotone"
dataKey="fluency"
stroke="#8b5cf6"
strokeWidth={2}
name="Fluência"
/>
<Line
type="monotone"
dataKey="comprehension"
stroke="#10b981"
strokeWidth={2}
name="Compreensão"
/>
</LineChart>
</ResponsiveContainer>
</div>
</div>
</div>
</div>
</section>
{/* 5. A Diferença que Faz */}
<section className="px-4 py-24">
<div className="mx-auto max-w-7xl">
<h2 className="text-3xl font-bold text-center text-gray-900 mb-16">
A Diferença que Faz
</h2>
<div className="grid md:grid-cols-2 gap-8">
{/* Sem o Histórias Mágicas */}
<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">
<X className="text-red-500" />
Sem o Histórias Mágicas
</h3>
<ul className="space-y-4">
<li className="flex items-start gap-2">
<X className="h-5 w-5 text-red-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Leitura monótona e desmotivadora
</span>
</li>
<li className="flex items-start gap-2">
<X className="h-5 w-5 text-red-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Sem feedback sobre o progresso
</span>
</li>
<li className="flex items-start gap-2">
<X className="h-5 w-5 text-red-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Dificuldade em manter consistência
</span>
</li>
<li className="flex items-start gap-2">
<X className="h-5 w-5 text-red-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Erros passam despercebidos
</span>
</li>
<li className="flex items-start gap-2">
<X className="h-5 w-5 text-red-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Falta de direcionamento pedagógico
</span>
</li>
</ul>
</div>
{/* Com o Histórias Mágicas */}
<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">
<Check className="text-green-500" />
Com o Histórias Mágicas
</h3>
<ul className="space-y-4">
<li className="flex items-start gap-2">
<Check className="h-5 w-5 text-green-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Histórias interativas e envolventes
</span>
</li>
<li className="flex items-start gap-2">
<Check className="h-5 w-5 text-green-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Análise detalhada do desempenho
</span>
</li>
<li className="flex items-start gap-2">
<Check className="h-5 w-5 text-green-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Gamificação que incentiva a prática diária
</span>
</li>
<li className="flex items-start gap-2">
<Check className="h-5 w-5 text-green-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Correção em tempo real e sugestões
</span>
</li>
<li className="flex items-start gap-2">
<Check className="h-5 w-5 text-green-500 flex-shrink-0 mt-1" />
<span className="text-gray-600">
Acompanhamento pedagógico personalizado
</span>
</li>
</ul>
</div>
</div>
</div>
</section>
{/* 6. O que os Pais Dizem */}
<section className="px-4 py-24 bg-purple-50">
<div className="mx-auto max-w-7xl">
<h2 className="text-3xl font-bold text-center text-gray-900 mb-16">
O Que os Pais Dizem
</h2>
<div className="grid md:grid-cols-3 gap-8">
{testimonials.map((testimonial, index) => (
<div key={index} className="bg-white p-6 rounded-xl shadow-sm">
<p className="text-gray-600 mb-4">"{testimonial.text}"</p>
<div className="flex items-center gap-4">
<img
src={testimonial.avatar}
alt={testimonial.name}
className="w-12 h-12 rounded-full"
/>
<div>
<p className="font-medium text-gray-900">{testimonial.name}</p>
<p className="text-sm text-gray-500">{testimonial.role}</p>
</div>
</div>
</div>
))}
</div>
</div>
</section>
{/* 7. CTA Final */}
<section className="px-4 py-24 relative overflow-hidden">
<div className="absolute inset-0 bg-gradient-to-b from-purple-50 to-purple-100 opacity-50" />
<div className="mx-auto max-w-3xl text-center relative">
<h2 className="text-5xl font-bold text-gray-900 mb-8 leading-tight">
Comece a Jornada de Leitura do Seu Filho
<span className="bg-gradient-to-r from-purple-600 to-indigo-600 bg-clip-text text-transparent">
Hoje
</span>
</h2>
<p className="text-xl text-gray-600 mb-12 leading-relaxed">
Junte-se a milhares de pais que transformaram a experiência
de leitura de seus filhos com o Histórias Mágicas.
</p>
<button
onClick={() => navigate('/register/parent')}
className="px-10 py-5 bg-gradient-to-r from-purple-600 to-indigo-600 text-white text-lg
rounded-xl hover:from-purple-700 hover:to-indigo-700 transform hover:scale-105
transition-all shadow-lg"
>
Criar Conta Gratuita
<ArrowRight className="inline-block ml-2 h-6 w-6" />
</button>
</div>
</section>
</div>
);
}
const testimonials = [
{
text: "Minha filha melhorou muito sua leitura em apenas 3 meses. Ela adora as histórias e sempre pede para ler mais!",
name: "Ana Silva",
role: "Mãe da Maria, 8 anos",
avatar: "/avatars/parent-1.webp"
},
{
text: "O feedback em tempo real ajuda muito a identificar onde meu filho precisa melhorar. É como ter um professor particular.",
name: "Carlos Santos",
role: "Pai do Pedro, 10 anos",
avatar: "/avatars/parent-2.webp"
},
{
text: "As histórias são envolventes e educativas. É ótimo ver meu filho animado para ler todos os dias.",
name: "Juliana Costa",
role: "Mãe do Lucas, 7 anos",
avatar: "/avatars/parent-3.webp"
}
];
const progressData = [
{ month: 'Jan', fluency: 45, comprehension: 40 },
{ month: 'Fev', fluency: 52, comprehension: 48 },
{ month: 'Mar', fluency: 58, comprehension: 55 },
{ month: 'Abr', fluency: 65, comprehension: 62 },
{ month: 'Mai', fluency: 75, comprehension: 70 },
{ month: 'Jun', fluency: 85, comprehension: 82 }
];

View File

@ -26,12 +26,17 @@ import { UserManagementPage } from './pages/admin/UserManagementPage';
import { AchievementsPage } from './pages/student-dashboard/AchievementsPage';
import { StudentClassPage } from './pages/student-dashboard/StudentClassPage';
import { DemoPage } from './pages/demo/DemoPage';
import { ParentsLandingPage } from './pages/landing/ParentsLandingPage';
export const router = createBrowserRouter([
{
path: '/',
element: <HomePage />,
},
{
path: '/para-pais',
element: <ParentsLandingPage />,
},
{
path: '/login',
children: [

View File

@ -151,7 +151,7 @@ serve(async (req) => {
// Gerar imagem com DALL-E
const imageResponse = await openai.images.generate({
prompt: `${page.image_prompt}. Style: children's book illustration, colorful, educational, safe for kids. Preferable non-white ethnicity.`,
prompt: `${page.image_prompt}. Style: children's book illustration, colorful, educational, safe for kids. Prioritize diversity.`,
n: 1,
size: "1024x1024",
model: "dall-e-3",