diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 487fee4..70bfb59 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -80,6 +80,11 @@ const config: Config = { position: 'left', label: 'Tutorial', }, + { + to: '/servicos', // Novo item - Serviços + label: 'Serviços', + position: 'left' + }, { to: '/blog', label: 'Blog', position: 'left' }, { href: 'https://github.com/facebook/docusaurus', diff --git a/package-lock.json b/package-lock.json index 915a177..22b269e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "takeode", + "name": "takeode.com", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "takeode", + "name": "takeode.com", "version": "0.0.0", "dependencies": { "@docusaurus/core": "3.7.0", diff --git a/src/ChatWidget/ChatWidget.tsx b/src/ChatWidget/ChatWidget.tsx new file mode 100644 index 0000000..06759f5 --- /dev/null +++ b/src/ChatWidget/ChatWidget.tsx @@ -0,0 +1,175 @@ +import React, { useState } from 'react'; +import styles from './styles.module.css'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; + +type ChatOption = 'whatsapp' | 'messenger' | 'internal'; + +interface ChatWidgetProps { + whatsappNumber?: string; + messengerPageId?: string; + initialMessage?: string; +} + +const ChatWidget: React.FC = ({ + whatsappNumber = '5562996641935', // Substitua pelo número real de WhatsApp + messengerPageId = '123456789', // Substitua pelo ID da página do Facebook + initialMessage = 'Olá! Como posso ajudar você hoje?', +}) => { + const [isOpen, setIsOpen] = useState(false); + const [chatOption, setChatOption] = useState(null); + const [message, setMessage] = useState(''); + const [chatHistory, setChatHistory] = useState>([ + { text: initialMessage, isUser: false } + ]); + + const { siteConfig } = useDocusaurusContext(); + const siteName = siteConfig.title; + + const toggleChat = () => { + setIsOpen(!isOpen); + if (!isOpen) { + setChatOption(null); + } + }; + + const selectChatOption = (option: ChatOption) => { + setChatOption(option); + + if (option === 'whatsapp') { + // Abrir WhatsApp em uma nova aba + window.open(`https://wa.me/${whatsappNumber}?text=Olá! Estou entrando em contato pelo site ${siteName}`, '_blank'); + setIsOpen(false); + } else if (option === 'messenger') { + // Abrir Messenger em uma nova aba + window.open(`https://m.me/${messengerPageId}`, '_blank'); + setIsOpen(false); + } + // Para a opção 'internal', mantemos o chat aberto e mostramos a interface + }; + + const sendMessage = (e: React.FormEvent) => { + e.preventDefault(); + if (!message.trim()) return; + + // Adicionar mensagem do usuário ao histórico + setChatHistory([...chatHistory, { text: message, isUser: true }]); + + // Simular resposta automática após 1 segundo + setTimeout(() => { + setChatHistory(prev => [ + ...prev, + { + text: `Obrigado por sua mensagem! Um de nossos atendentes entrará em contato em breve.`, + isUser: false + } + ]); + }, 1000); + + setMessage(''); + }; + + return ( +
+ {isOpen && ( +
+ {!chatOption ? ( +
+

Como podemos ajudar?

+ + + +
+ ) : chatOption === 'internal' && ( +
+
+

Chat de Suporte

+ +
+
+ {chatHistory.map((msg, index) => ( +
+ {msg.text} +
+ ))} +
+
+ setMessage(e.target.value)} + placeholder="Digite sua mensagem..." + className={styles.chatInput} + /> + +
+
+ )} +
+ )} + +
+ ); +}; + +export default ChatWidget; \ No newline at end of file diff --git a/src/ChatWidget/index.ts b/src/ChatWidget/index.ts new file mode 100644 index 0000000..3114c39 --- /dev/null +++ b/src/ChatWidget/index.ts @@ -0,0 +1 @@ +export { default } from './ChatWidget'; \ No newline at end of file diff --git a/src/ChatWidget/styles.module.css b/src/ChatWidget/styles.module.css new file mode 100644 index 0000000..c91eb83 --- /dev/null +++ b/src/ChatWidget/styles.module.css @@ -0,0 +1,186 @@ +/* Contêiner principal do widget de chat */ +.chatWidgetContainer { + position: fixed; + bottom: 20px; + right: 20px; + z-index: 1000; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + } + + /* Botão de alternância do chat */ + .chatToggleButton { + width: 60px; + height: 60px; + border-radius: 50%; + background-color: #4a86e8; + color: white; + border: none; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + cursor: pointer; + font-size: 24px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; + } + + .chatToggleButton:hover { + transform: scale(1.1); + background-color: #3b78e7; + } + + .chatIcon { + font-size: 28px; + } + + .closeIcon { + font-size: 36px; + } + + /* Janela de chat principal */ + .chatWindow { + position: absolute; + bottom: 80px; + right: 0; + width: 320px; + max-height: 450px; + background-color: white; + border-radius: 10px; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2); + overflow: hidden; + display: flex; + flex-direction: column; + } + + /* Opções de chat */ + .chatOptions { + padding: 16px; + } + + .chatOptions h3 { + margin-top: 0; + margin-bottom: 16px; + text-align: center; + color: #333; + } + + .optionButton { + display: flex; + align-items: center; + width: 100%; + padding: 12px 16px; + margin-bottom: 10px; + border: 1px solid #e0e0e0; + border-radius: 8px; + background-color: #f8f8f8; + cursor: pointer; + font-size: 16px; + transition: all 0.2s ease; + } + + .optionButton:hover { + background-color: #f0f0f0; + border-color: #d0d0d0; + } + + .optionIcon { + width: 24px; + height: 24px; + margin-right: 10px; + } + + /* Chat interno */ + .internalChat { + display: flex; + flex-direction: column; + height: 100%; + max-height: 450px; + } + + .chatHeader { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 16px; + background-color: #4a86e8; + color: white; + } + + .chatHeader h3 { + margin: 0; + font-size: 16px; + } + + .backButton { + background: none; + border: none; + color: white; + cursor: pointer; + font-size: 14px; + text-decoration: underline; + padding: 0; + } + + .chatMessages { + flex: 1; + padding: 16px; + overflow-y: auto; + max-height: 300px; + } + + .message { + margin-bottom: 12px; + padding: 8px 12px; + border-radius: 8px; + max-width: 80%; + word-wrap: break-word; + } + + .userMessage { + background-color: #e3f2fd; + margin-left: auto; + text-align: right; + } + + .botMessage { + background-color: #f1f1f1; + } + + .chatInputForm { + display: flex; + padding: 12px; + border-top: 1px solid #e0e0e0; + } + + .chatInput { + flex: 1; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 20px; + outline: none; + font-size: 14px; + } + + .sendButton { + background-color: #4a86e8; + color: white; + border: none; + border-radius: 20px; + padding: 8px 16px; + margin-left: 8px; + cursor: pointer; + font-size: 14px; + } + + .sendButton:hover { + background-color: #3b78e7; + } + + /* Responsividade para dispositivos móveis */ + @media (max-width: 480px) { + .chatWindow { + width: 300px; + max-width: calc(100vw - 40px); + right: 0; + } + } \ No newline at end of file diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 9f71a5d..9476f2d 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -16,6 +16,8 @@ } } + + .buttons { display: flex; align-items: center; diff --git a/src/pages/servicos.module.css b/src/pages/servicos.module.css new file mode 100644 index 0000000..d7d086b --- /dev/null +++ b/src/pages/servicos.module.css @@ -0,0 +1,97 @@ +/* Container principal */ +.servicesContainer { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + padding: 2rem 0; + max-width: 1200px; + margin: 0 auto; + } + + /* Cards de serviço */ + .serviceSection { + display: flex; + flex-direction: column; + margin: 0; + padding: 1.5rem; + border-radius: 8px; + background-color: var(--ifm-color-emphasis-100); + transition: all 0.3s ease; + height: 100%; + } + + .serviceImageContainer { + width: 100%; + height: 200px; + overflow: hidden; + border-radius: 6px; + margin-bottom: 1.5rem; + } + + .serviceImage { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s ease; + } + + .serviceTitle { + color: var(--ifm-color-primary); + margin-bottom: 1rem; + font-size: 1.5rem; + text-align: center; + } + + .serviceDescription { + font-size: 1rem; + line-height: 1.6; + color: var(--ifm-font-color-base); + margin-bottom: 1rem; + flex-grow: 1; + } + + .serviceFeatures ul { + padding-left: 1.25rem; + margin: 0.5rem 0; + } + + .serviceFeatures li { + margin-bottom: 0.25rem; + font-size: 0.9rem; + } + + /* Efeitos hover */ + .serviceSection:hover { + transform: translateY(-5px); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); + } + + .serviceSection:hover .serviceImage { + transform: scale(1.05); + } + + .heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; + background: linear-gradient(135deg, var(--ifm-color-primary) 0%, #1a1a1a 100%); + } + + /* Responsividade */ + @media (max-width: 768px) { + .servicesContainer { + grid-template-columns: 1fr; + padding: 1rem; + } + + .serviceSection { + margin-bottom: 1.5rem; + } + } + + @media (min-width: 1200px) { + .servicesContainer { + grid-template-columns: repeat(3, 1fr); + } + } \ No newline at end of file diff --git a/src/pages/servicos.tsx b/src/pages/servicos.tsx new file mode 100644 index 0000000..d4114fe --- /dev/null +++ b/src/pages/servicos.tsx @@ -0,0 +1,105 @@ +// src/pages/servicos.tsx +import React, { JSX } from 'react'; +import Layout from '@theme/Layout'; +import clsx from 'clsx'; +import styles from './servicos.module.css'; // Mantenha seus estilos +import Link from '@docusaurus/Link'; // Importe o componente Link + +// Mantenha a importação das imagens se quiser usá-las na visão geral +const WebDevImg = require('@site/static/img/web-development.jpg').default; +const MvpAppsImg = require('@site/static/img/mvp-apps.png').default; +const DesignImg = require('@site/static/img/design-uxui.jpg').default; // Corrigido 'desing' para 'design' no nome da variável, se o arquivo for 'design' + +// O cabeçalho pode continuar o mesmo +function ServicesHeader() { + return ( +
+
+

Serviços

+

Nossas soluções profissionais

+
+
+ ); +} + +// --- Componente para o Card de Serviço --- +// (Opcional, mas ajuda a organizar) +interface ServiceCardProps { + title: string; + description: string; + imageUrl: string; + linkTo: string; // URL da página de detalhes + altText: string; +} + +function ServiceCard({ title, description, imageUrl, linkTo, altText }: ServiceCardProps) { + return ( +
{/* Adicione uma classe 'serviceCard' se quiser estilizar diferente */} +
+ {altText} +
+

{title}

+

+ {description} +

+ {/* Adiciona o Link/Botão */} +
+ + Saiba Mais + +
+
+ ); +} + + +// --- Componente Principal da Página --- +export default function ServicesOverview(): JSX.Element { // Renomeado para ServicesOverview para clareza + return ( + + + + +
+ {/* Usar a classe 'servicesContainer' que você já tinha */} +
+ + {/* Usar o componente ServiceCard para cada serviço */} + + + + + + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/pages/servicos/desenvolvimento-web.tsx b/src/pages/servicos/desenvolvimento-web.tsx new file mode 100644 index 0000000..324ed60 --- /dev/null +++ b/src/pages/servicos/desenvolvimento-web.tsx @@ -0,0 +1,82 @@ +// src/pages/servicos/desenvolvimento-web.tsx +import React, { JSX } from 'react'; +import Layout from '@theme/Layout'; +// Se você criar um CSS Module específico para detalhes: +// import styles from './servico-detalhe.module.css'; +// Se for usar libs de galeria, importe aqui: +// import ImageGallery from 'react-image-gallery'; +// import 'react-image-gallery/styles/css/image-gallery.css'; + +// Exemplo de dados para a galeria (coloque suas imagens reais) +const images = [ + { + original: '/img/servicos/desenvolvimento-web/imagem1.jpg', // Crie esta pasta e adicione imagens + thumbnail: '/img/servicos/desenvolvimento-web/thumb1.jpg', + }, + // Adicione mais imagens... +]; + +export default function ServicoDesenvolvimentoWeb(): JSX.Element { + return ( + {/* Descrição SEO específica */} + + {/* Você pode reutilizar o componente de header se quiser um banner */} + {/* */} + + {/* Use a classe do CSS Module se criou um */} +
{/* Layout básico do Docusaurus */} +

Desenvolvimento Web

+

Aqui vai a introdução sobre o serviço de Desenvolvimento Web.

+ + {/* --- Seção de Descrição Completa --- */} +
+

Descrição Completa

+

+ Detalhe aqui tudo sobre o desenvolvimento web: tecnologias usadas (React, Node, etc.), + tipos de projetos (sites institucionais, e-commerce, sistemas internos), + metodologia de trabalho, etc. Seja bem específico! +

+ {/* Mais parágrafos, listas, etc. */} +
+ + {/* --- Seção da Galeria de Imagens --- */} +
+

Galeria / Exemplos de Projetos

+
+ {/* */} +

(Componente da galeria de imagens será adicionado aqui)

+ {/* Exemplo com imagens estáticas por enquanto */} + Exemplo Projeto Web 1 + {/* Adicione mais imagens ou a galeria */} +
+
+ + {/* --- Seção de Benefícios --- */} +
+

Benefícios

+
    +
  • Sites responsivos e otimizados para performance.
  • +
  • Design moderno e alinhado com sua marca.
  • +
  • Segurança e escalabilidade.
  • +
  • Integração com outras ferramentas.
  • + {/* Adicione mais benefícios */} +
+
+ + {/* --- Seção Call-to-Action (CTA) --- */} +
+

Pronto para começar seu projeto web?

+

+ Solicite um orçamento sem compromisso e veja como podemos transformar sua presença online. +

+ + Solicitar Orçamento Agora + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/servicos/design-ux-ui.tsx b/src/pages/servicos/design-ux-ui.tsx new file mode 100644 index 0000000..cab259d --- /dev/null +++ b/src/pages/servicos/design-ux-ui.tsx @@ -0,0 +1,92 @@ +// src/pages/servicos/design-ux-ui.tsx +import React, { JSX } from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +// Se for usar libs de galeria, importe aqui: +// import ImageGallery from 'react-image-gallery'; +// import 'react-image-gallery/styles/css/image-gallery.css'; + +// Exemplo de dados para a galeria (coloque suas imagens reais) +const images = [ + { + original: '/img/servicos/design-uxui/ui-mockup.jpg', // Crie esta pasta e adicione imagens + thumbnail: '/img/servicos/design-uxui/thumb-mockup.jpg', + }, + { + original: '/img/servicos/design-uxui/wireframe.png', + thumbnail: '/img/servicos/design-uxui/thumb-wireframe.png', + }, + { + original: '/img/servicos/design-uxui/user-journey.png', + thumbnail: '/img/servicos/design-uxui/thumb-journey.png', + }, + // Adicione mais imagens... +]; + +export default function ServicoDesignUxUi(): JSX.Element { + return ( + {/* Descrição SEO específica */} + +
{/* Layout básico do Docusaurus */} +

Design UX/UI

+

Criamos interfaces que não são apenas bonitas, mas também funcionais, intuitivas e focadas em proporcionar a melhor experiência para o seu usuário final.

+ + {/* --- Seção de Descrição Completa --- */} +
+

A Importância do UX e UI Design

+

+ **UX (User Experience) Design** foca na jornada completa do usuário ao interagir com seu produto ou serviço. Envolve pesquisa, entendimento das necessidades do usuário, arquitetura da informação, fluxos de navegação e testes para garantir que a experiência seja lógica, fácil e satisfatória. +

+

+ **UI (User Interface) Design** é a parte visual e interativa. Cuida da aparência da interface (cores, tipografia, ícones, layouts) e como os elementos interativos se comportam, garantindo que seja esteticamente agradável, consistente com a marca e fácil de usar. +

+

+ Nosso processo combina UX e UI para entregar soluções digitais que engajam usuários e alcançam os objetivos do seu negócio. Utilizamos ferramentas como Figma, Sketch e Adobe XD para criar wireframes, protótipos interativos e designs finais de alta fidelidade. +

+ {/* Adicione mais detalhes sobre o processo, entregáveis, ferramentas, etc. */} +
+ + {/* --- Seção da Galeria de Imagens --- */} +
+

Exemplos / Processo de Design

+
+ {/* */} +

(Componente da galeria de imagens com exemplos de wireframes, mockups, protótipos, user flows)

+ {/* Exemplo com imagens estáticas por enquanto */} + Exemplo Wireframe + Exemplo Mockup UI + Exemplo Jornada do Usuário + {/* Adicione mais imagens ou a galeria */} +
+
+ + {/* --- Seção de Benefícios --- */} +
+

Benefícios de um Bom Design UX/UI

+
    +
  • **Maior Engajamento:** Usuários permanecem mais tempo e interagem mais.
  • +
  • **Aumento da Conversão:** Facilita a jornada do usuário até a ação desejada.
  • +
  • **Redução de Custos:** Menos necessidade de retrabalho e suporte.
  • +
  • **Fortalecimento da Marca:** Transmite profissionalismo e confiança.
  • +
  • **Melhor Usabilidade:** Torna seu produto acessível e fácil de usar.
  • + {/* Adicione mais benefícios específicos da Takeode */} +
+
+ + {/* --- Seção Call-to-Action (CTA) --- */} +
+

Quer melhorar a experiência dos seus usuários?

+

+ Entre em contato para discutir como nosso serviço de Design UX/UI pode elevar o nível do seu site ou aplicativo. +

+ + Otimizar Minha Interface + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/servicos/mvp-apps.tsx b/src/pages/servicos/mvp-apps.tsx new file mode 100644 index 0000000..dc01da2 --- /dev/null +++ b/src/pages/servicos/mvp-apps.tsx @@ -0,0 +1,90 @@ +// src/pages/servicos/mvp-de-apps.tsx +import React, { JSX } from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; // Importar Link se ainda não estiver lá +// Se for usar libs de galeria, importe aqui: +// import ImageGallery from 'react-image-gallery'; +// import 'react-image-gallery/styles/css/image-gallery.css'; + +// Exemplo de dados para a galeria (coloque suas imagens reais) +const images = [ + { + original: '/img/servicos/mvp-apps/app-tela1.jpg', // Crie esta pasta e adicione imagens + thumbnail: '/img/servicos/mvp-apps/thumb-app1.jpg', + }, + { + original: '/img/servicos/mvp-apps/app-fluxo.png', + thumbnail: '/img/servicos/mvp-apps/thumb-fluxo.png', + }, + // Adicione mais imagens... +]; + +export default function ServicoMvpDeApps(): JSX.Element { + return ( + {/* Descrição SEO específica */} + +
{/* Layout básico do Docusaurus */} +

MVP de Apps

+

Transforme sua ideia inovadora em um aplicativo funcional rapidamente com nosso serviço de desenvolvimento de MVP (Produto Mínimo Viável).

+ + {/* --- Seção de Descrição Completa --- */} +
+

O que é um MVP e por que começar com um?

+

+ Um MVP é a versão mais simples do seu aplicativo, contendo apenas as funcionalidades essenciais para resolver o problema principal do seu público-alvo. Lançar um MVP permite: +

+
    +
  • Validar sua ideia no mercado real com baixo investimento inicial.
  • +
  • Coletar feedback valioso de usuários reais (early adopters).
  • +
  • Iterar e adicionar novas funcionalidades de forma mais assertiva.
  • +
  • Reduzir riscos e tempo de desenvolvimento.
  • +
+

+ Utilizamos metodologias ágeis e tecnologias modernas (como React Native, Flutter, ou desenvolvimento nativo focado) para entregar seu MVP com qualidade e velocidade. Analisamos sua ideia, definimos o escopo essencial e partimos para o desenvolvimento focado no valor central. +

+ {/* Adicione mais detalhes sobre o processo, tecnologias, etc. */} +
+ + {/* --- Seção da Galeria de Imagens --- */} +
+

Exemplos / Processo

+
+ {/* */} +

(Componente da galeria de imagens com exemplos de telas de MVPs, fluxos, etc.)

+ {/* Exemplo com imagens estáticas por enquanto */} + Exemplo Tela MVP + Exemplo Fluxo App + {/* Adicione mais imagens ou a galeria */} +
+
+ + {/* --- Seção de Benefícios --- */} +
+

Benefícios de Desenvolver seu MVP Conosco

+
    +
  • **Velocidade:** Lançamento rápido para validação ágil.
  • +
  • **Custo-Efetivo:** Foco no essencial, otimizando seu investimento.
  • +
  • **Validação de Mercado:** Teste sua ideia antes de grandes aportes.
  • +
  • **Flexibilidade:** Adapte o produto com base em feedback real.
  • +
  • **Foco no Usuário:** Desenvolvimento centrado nas necessidades principais.
  • + {/* Adicione mais benefícios específicos da Takeode */} +
+
+ + {/* --- Seção Call-to-Action (CTA) --- */} +
+

Tem uma ideia de aplicativo?

+

+ Vamos conversar sobre como um MVP pode ser o primeiro passo para o sucesso. Peça um orçamento! +

+ + Validar Minha Ideia + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/theme/Root.tsx b/src/theme/Root.tsx new file mode 100644 index 0000000..629a46e --- /dev/null +++ b/src/theme/Root.tsx @@ -0,0 +1,16 @@ +import React, { JSX, ReactNode } from 'react'; +import ChatWidget from '../ChatWidget'; + +// Componente Root que envolve toda a aplicação Docusaurus +export default function Root({ children }: { children: ReactNode }): JSX.Element { + return ( + <> + {children} + + + ); +} \ No newline at end of file diff --git a/static/img/chat-icon.png b/static/img/chat-icon.png new file mode 100644 index 0000000..ac86671 Binary files /dev/null and b/static/img/chat-icon.png differ diff --git a/static/img/desing-uxui.jpg b/static/img/desing-uxui.jpg new file mode 100644 index 0000000..8d16985 Binary files /dev/null and b/static/img/desing-uxui.jpg differ diff --git a/static/img/mvp-apps.png b/static/img/mvp-apps.png new file mode 100644 index 0000000..eaae792 Binary files /dev/null and b/static/img/mvp-apps.png differ diff --git a/static/img/web-development.jpg b/static/img/web-development.jpg new file mode 100644 index 0000000..4e8c901 Binary files /dev/null and b/static/img/web-development.jpg differ diff --git a/static/img/whatsapp-icon.png b/static/img/whatsapp-icon.png new file mode 100644 index 0000000..984a501 Binary files /dev/null and b/static/img/whatsapp-icon.png differ