+ Passo a passo para criar sua base de conhecimento
+
+
+
+ Faça login na plataforma com seu usuário e senha.
+ {/* Espaço para imagem de tela de login */}
+
+ [Imagem da tela de login]
+
+
+
+ Acesse seu perfil e vá até a seção{' '}
+ Bases de conhecimento.
+ {/* Espaço para imagem do perfil */}
+
+ [Imagem do perfil e menu de bases]
+
+
+
+ Clique no botão Criar uma nova base.
+ {/* Espaço para imagem do botão */}
+
+ [Imagem do botão Criar uma nova base]
+
+
+
+ Escolha o modelo de base de conhecimento desejado.
+ {/* Espaço para imagem de seleção de modelo */}
+
+ [Imagem da seleção de modelo]
+
+
+
+ Faça upload dos documentos que irão compor sua base.
+ {/* Espaço para imagem de upload */}
+
+ [Imagem da tela de upload]
+
+
+
+ Aguarde enquanto sua base é criada.
+
+ Atenção: esse processo pode demorar alguns minutos,
+ especialmente se você enviar muitos arquivos.
+
+ {/* Espaço para imagem de carregamento */}
+
+ [Imagem de carregamento/criação da base]
+
+
+
+ Pronto! Sua base estará disponível para uso via API e para
+ testes no ambiente sandbox.
+ {/* Espaço para imagem de base criada */}
+
+ [Imagem da base criada e opções de uso]
+
+
+
+
+
+
+ {/* Seção 2: Como funciona por trás */}
+
+
+
+ O que acontece por trás do sistema?
+
+
+ Após o upload dos arquivos, o sistema salva seus documentos e
+ inicia o treinamento do modelo de IA escolhido utilizando
+ exclusivamente os arquivos enviados por você. Nenhum dado
+ externo é utilizado para treinar sua base, garantindo
+ privacidade e personalização.
+
+ {/* Espaço para esquema ilustrativo */}
+
+ [Esquema ilustrativo do fluxo de criação da base]
+
+ Limite de bases atingido: Você já criou o máximo de
+ bases permitido pelo seu plano.
+
+
+ Solução: Assine um plano superior ou exclua uma base
+ existente.
+
+
+
+ Limite de armazenamento atingido: Você já utilizou todo
+ o espaço de arquivos do seu plano.
+
+
+ Solução: Assine um plano superior ou remova arquivos de
+ outras bases para liberar espaço.
+
+
+
+ Modelo indisponível: O modelo de base desejado não está
+ disponível no seu plano.
+
+
+ Solução: Assine um plano superior para acessar esse modelo.
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/features/faq/pages/faq-bases-others.tsx b/src/features/faq/pages/faq-bases-others.tsx
new file mode 100644
index 0000000..86a3b63
--- /dev/null
+++ b/src/features/faq/pages/faq-bases-others.tsx
@@ -0,0 +1,76 @@
+import { Background } from '@/shared/components/background'
+import { BackgroundBlobs } from '@/shared/components/background-blobs'
+import { Layout } from '@/shared/components/layout'
+import { Card, CardContent } from '@/shared/components/card'
+import { motion } from 'framer-motion'
+import { ArrowRightCircle } from 'lucide-react'
+
+const topics = [
+ {
+ title: 'Como editar uma base de conhecimento',
+ link: '/faq/bases/edit'
+ },
+ {
+ title: 'Como excluir uma base de conhecimento',
+ link: '/faq/bases/delete'
+ },
+ {
+ title: 'Compartilhamento de bases entre usuários',
+ link: '/faq/bases/sharing'
+ },
+ {
+ title: 'Limites de armazenamento e documentos',
+ link: '/faq/bases/limits'
+ },
+ {
+ title: 'Erros comuns ao gerenciar bases',
+ link: '/faq/bases/errors'
+ }
+]
+
+export function FAQBasesOthersPage() {
+ return (
+
+
+
+
+ Nossa política de devolução garante transparência e segurança para
+ nossos clientes. Caso precise solicitar o estorno do valor pago,
+ verifique as condições abaixo:
+
+
+
+ O pedido de devolução deve ser feito através do formulário abaixo
+ em até 7 dias após a confirmação do pagamento.
+
+
+ O valor será estornado utilizando o mesmo método de pagamento
+ utilizado na compra.
+
+
+ O prazo para processamento do estorno pode variar conforme o
+ método de pagamento.
+
+
+ Em caso de dúvidas, utilize o formulário abaixo para entrar em
+ contato com nosso suporte.
+
+
+
+
+
+
+
+ Solicitar estorno ou tirar dúvidas sobre estorno
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/features/faq/types/faq-form-schema.ts b/src/features/faq/types/faq-form-schema.ts
new file mode 100644
index 0000000..f427a27
--- /dev/null
+++ b/src/features/faq/types/faq-form-schema.ts
@@ -0,0 +1,16 @@
+import { z } from 'zod'
+
+export const faqFormSchema = z.object({
+ name: z.string().min(1, { message: 'O nome é obrigatório.' }),
+ email: z.string().email({ message: 'Digite um e-mail válido.' }),
+ subject: z.string().min(1, { message: 'O assunto é obrigatório.' }),
+ message: z.string().min(1, { message: 'A mensagem é obrigatória.' })
+})
+
+export type FAQFormData = z.infer
+export const faqFormInitialValues: FAQFormData = {
+ name: '',
+ email: '',
+ subject: '',
+ message: ''
+}
diff --git a/src/features/forgot-password/pages/forgot-password.tsx b/src/features/forgot-password/pages/forgot-password.tsx
new file mode 100644
index 0000000..1919467
--- /dev/null
+++ b/src/features/forgot-password/pages/forgot-password.tsx
@@ -0,0 +1,109 @@
+import { Background } from '@/shared/components/background'
+import { Layout } from '@/shared/components/layout'
+import { motion } from 'framer-motion'
+import { Button } from '@/shared/components/button'
+import { useForm } from 'react-hook-form'
+import { zodResolver } from '@hookform/resolvers/zod'
+import {
+ forgotPasswordFormSchema,
+ ForgotPasswordFormData
+} from '../types/forgot-password-schema'
+import toast from 'react-hot-toast'
+import {
+ Form,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormMessage
+} from '@/shared/components/form'
+import { Input } from '@/shared/components/input'
+import { cardVariants, containerVariants } from '@/shared/utils/animations'
+import {
+ Card,
+ CardContent,
+ CardFooter,
+ CardHeader,
+ CardTitle
+} from '@/shared/components/card'
+import { BackgroundBlobs } from '@/shared/components/background-blobs'
+
+export function ForgotPasswordPage() {
+ const form = useForm({
+ resolver: zodResolver(forgotPasswordFormSchema),
+ defaultValues: {
+ email: ''
+ },
+ mode: 'onBlur'
+ })
+
+ const onSubmit = (values: ForgotPasswordFormData) => {
+ console.log(values)
+ toast.success(
+ 'Se o e-mail estiver cadastrado, você receberá as instruções para redefinir sua senha.',
+ {
+ duration: 5000
+ }
+ )
+ form.resetField('email')
+ }
+
+ return (
+
+
+
+
+
+
+ )
+}
diff --git a/src/features/forgot-password/types/forgot-password-schema.ts b/src/features/forgot-password/types/forgot-password-schema.ts
new file mode 100644
index 0000000..25dda8d
--- /dev/null
+++ b/src/features/forgot-password/types/forgot-password-schema.ts
@@ -0,0 +1,10 @@
+import { z } from 'zod'
+
+export const forgotPasswordFormSchema = z.object({
+ email: z.string().email({ message: 'O e-mail deve ser válido.' })
+})
+
+export type ForgotPasswordFormData = z.infer
+export const forgotPasswordFormInitialValues: ForgotPasswordFormData = {
+ email: ''
+}
diff --git a/src/features/home/components/footer.tsx b/src/features/home/components/footer.tsx
new file mode 100644
index 0000000..1df5118
--- /dev/null
+++ b/src/features/home/components/footer.tsx
@@ -0,0 +1,12 @@
+export function Footer() {
+ return (
+
+ )
+}
diff --git a/src/features/home/pages/home-page.tsx b/src/features/home/pages/home-page.tsx
index 911e40e..cc28c6a 100644
--- a/src/features/home/pages/home-page.tsx
+++ b/src/features/home/pages/home-page.tsx
@@ -1,14 +1,9 @@
import { Background } from '@/shared/components/background'
import { Layout } from '@/shared/components/layout'
-import { motion, Transition } from 'framer-motion'
+import { motion } from 'framer-motion'
import { Button } from '@/shared/components/button'
import { Accordion, AccordionItem } from '@/shared/components/accordion'
import { DotLottieReact } from '@lottiefiles/dotlottie-react'
-import berti from '@/assets/berti.jfif'
-import izabel from '@/assets/izabel.jfif'
-import rubio from '@/assets/rubio.jfif'
-import julia from '@/assets/julia.jfif'
-import sakamoto from '@/assets/sakamoto.jfif'
import { Fragment } from 'react/jsx-runtime'
import {
Card,
@@ -19,50 +14,66 @@ import {
CardTitle
} from '@/shared/components/card'
import { ArrowDown, ArrowRight, Check } from 'lucide-react'
+import { BackgroundBlobs } from '@/shared/components/background-blobs'
+import { Footer } from '@/features/home/components/footer'
+import { Link } from 'react-router-dom'
const plans = [
{
- title: 'Personal',
- price: '$5',
- features: ['2 Knowledge Bases', 'Sandbox', 'Single AI model'],
- buttonText: 'Get Started'
+ title: 'Pessoal',
+ price: 'R$ 25',
+ features: [
+ '2 Bases de conhecimento',
+ 'Ambiente de testes',
+ 'Um modelo de IA'
+ ],
+ buttonText: 'Começar'
},
{
- title: 'Professional',
- price: '$10',
- features: ['10 Knowledge Bases', 'Sandbox', 'Up to 5 AI models'],
- buttonText: 'Get Started'
+ title: 'Profissional',
+ price: 'R$ 50',
+ features: [
+ '10 Bases de conhecimento',
+ 'Ambiente de testes',
+ 'Até 5 modelos de IA'
+ ],
+ buttonText: 'Começar'
},
{
- title: 'Business',
- price: '$50',
- features: ['50 Knowledge Bases', 'Sandbox', 'Any AI model available'],
- buttonText: 'Get Started'
+ title: 'Empresarial',
+ price: 'R$ 250',
+ features: [
+ '50 Bases de conhecimento',
+ 'Ambiente de testes',
+ 'Qualquer modelo de IA disponível'
+ ],
+ buttonText: 'Começar'
}
]
const faqs = [
{
- title: 'What kind of file can I upload?',
+ title: 'Que tipo de arquivo posso fazer upload?',
content:
- 'Currently, you can upload PDF files. We are working on adding support for other file types in the future.'
+ 'Atualmente, você pode fazer upload de arquivos PDF. Estamos trabalhando para adicionar suporte a outros tipos de arquivo no futuro.'
},
{
- title: 'Can I create more than one model?',
+ title: 'Posso criar mais de um modelo?',
content:
- 'Yes, you can create multiple models with different knowledge bases.'
+ 'Sim, você pode criar múltiplos modelos com diferentes bases de conhecimento.'
},
{
- title: 'Do I need to code?',
+ title: 'Preciso saber programar?',
content:
- 'No, you only need to upload the files and we take care of the rest.'
+ 'Não, você só precisa fazer upload dos arquivos e nós cuidamos do resto.'
}
]
const process = [
{
- title: 'You Upload',
- content: 'Upload the PDF files you wish to make up the knowledge base',
+ title: 'Você envia',
+ content:
+ 'Faça upload dos arquivos PDF que deseja incluir na base de conhecimento',
image: (
- {/* Light mode blobs use CSS variables for consistent visibility */}
-
-
-
-
-
- >
- )
-}
+const owners = [
+ {
+ name: 'Enzo Sakamoto',
+ image: 'https://d1b8zs4rmj3xdl.cloudfront.net/sakamoto.jpeg',
+ role: 'Arquiteto de Software Júnior na XP Inc.',
+ linkedin: 'https://www.linkedin.com/in/enzosakamoto/'
+ },
+ {
+ name: 'Izabel Sampaio Goes',
+ image: 'https://d1b8zs4rmj3xdl.cloudfront.net/iza.jpeg',
+ role: 'Estagiária de Business Analytics na Amazon',
+ linkedin: 'https://www.linkedin.com/in/izabel-sampaio-goes/'
+ },
+ {
+ name: 'Rafael Rubio',
+ image: 'https://d1b8zs4rmj3xdl.cloudfront.net/rubio.png',
+ role: 'Estagiário de Desenvolvimento de Software na Socium',
+ linkedin: 'https://www.linkedin.com/in/rafael-rubio-carnes-b2561b212/'
+ },
+ {
+ name: 'Júlia Galhardi Cerqueira',
+ image: 'https://d1b8zs4rmj3xdl.cloudfront.net/julia.jpeg',
+ role: 'Estagiária',
+ linkedin: 'https://www.linkedin.com/in/j%C3%BAliacerqueira/'
+ },
+ {
+ name: 'Vinícius Berti',
+ image: 'https://d1b8zs4rmj3xdl.cloudfront.net/berti.jpeg',
+ role: 'Estagiário de Dados para Antifraude na Capim',
+ linkedin: 'https://www.linkedin.com/in/vinicius-berti-a80354209/'
+ }
+]
function LogoCarousel() {
const logos = [
- 'https://store-images.s-microsoft.com/image/apps.22898.1ee6619e-8cd6-4c91-a459-3abe6a6cf7b3.84da202a-9b47-4a76-be2c-79f143c64050.21add500-ed5b-42ee-b87d-ee415ae071fc',
- 'https://play-lh.googleusercontent.com/d2zqBFBEymSZKaVg_dRo1gh3hBFn7_Kl9rO74xkDmnJeLgDW0MoJD3cUx0QzZN6jdsg=w240-h480-rw',
- 'https://t2.tudocdn.net/716766?w=824&h=494',
- 'https://www.stickersdevs.com.br/wp-content/uploads/2021/03/amazon-logo-sticker-adesivo-devs.jpg',
- 'https://iguatemi.com.br/saopaulo/sites/saopaulo/files/2021-10/mistral.jpg'
+ {
+ url: 'https://store-images.s-microsoft.com/image/apps.22898.1ee6619e-8cd6-4c91-a459-3abe6a6cf7b3.84da202a-9b47-4a76-be2c-79f143c64050.21add500-ed5b-42ee-b87d-ee415ae071fc',
+ comingSoon: true
+ }, // Meta
+ {
+ url: 'https://play-lh.googleusercontent.com/d2zqBFBEymSZKaVg_dRo1gh3hBFn7_Kl9rO74xkDmnJeLgDW0MoJD3cUx0QzZN6jdsg=w240-h480-rw',
+ comingSoon: true
+ }, // Deep Seek
+ {
+ url: 'https://static.vecteezy.com/system/resources/previews/019/136/322/non_2x/amazon-logo-amazon-icon-free-free-vector.jpg',
+ comingSoon: false
+ }, // Amazon
+ {
+ url: 'https://t2.tudocdn.net/716766?w=824&h=494',
+ comingSoon: true
+ }, // Claude Sonnet
+ {
+ url: 'https://azure.microsoft.com/en-us/blog/wp-content/uploads/2024/02/MSFT_Azure_FEB12_319938_Blog_BlogHeader_240226_600x600_V1.jpg',
+ comingSoon: false
+ } // Mistral
]
const allLogos = [...logos, ...logos, ...logos, ...logos]
return (
@@ -177,13 +188,18 @@ function LogoCarousel() {
}}
>
{allLogos.map((logo, idx) => (
-
+
+ {logo.comingSoon && (
+
+ Em breve
+
+ )}
))}
@@ -197,26 +213,26 @@ const variants = {
visible: { filter: 'blur(0)', transform: 'translateY(0)', opacity: 1 }
}
-const title = 'Think beyond with Knowly'
+const title = 'Pense além com Knowly'
const words = title.split(' ')
export function HomePage() {
return (
-
+
-
- A productivity plataform that transforms your documents into a
- powerful, custom AI knowledge base. Stay organized, efficient, and
- empowered.
+ Uma plataforma de produtividade que transforma seus documentos em
+ uma base de conhecimento de IA personalizada e poderosa. Mantenha-se
+ organizado, eficiente e capacitado.
-
-
+
+
+
-
-
+
+
@@ -260,25 +285,33 @@ export function HomePage() {
whileInView="visible"
transition={{ staggerChildren: 0.04 }}
>
-
- How Knowly Works
-
+
+ Como o Knowly Funciona
+
+
+ Três passos simples para transformar seus documentos em IA
+
+
{process.map((content, idx) => (
-
+
+ {idx + 1}
+
+
{content.title}
@@ -288,15 +321,15 @@ export function HomePage() {
-
+
+
+ O Knowly foi criado por um grupo de cinco estudantes de Engenharia
+ da Computação durante o último ano de graduação no Instituto Mauá de
+ Tecnologia no Trabalho de Conclusão de Curso (TCC).
+
+
+ {owners.map((owner, index) => (
+
+
+