Landing page institucional do Projeto CIDAI, uma iniciativa voluntária sem fins lucrativos dedicada a oferecer cuidados odontológicos, suporte psicológico e tratamento humanizado a idosos residentes em instituições de longa permanência (ILPIs).
- Sobre o Projeto
- Deploy
- Stack Tecnológica
- Arquitetura
- Estrutura de Arquivos
- Design System
- Funcionalidades
- Decisões Técnicas
- Como Executar Localmente
- Deploy na Vercel
O CIDAI é um projeto extensionista que reúne voluntários da área da saúde para promover qualidade de vida a idosos institucionalizados. A landing page serve como vitrine digital do projeto, com os objetivos de:
- Apresentar a missão, valores e impacto social do CIDAI
- Recrutar novos voluntários via integração com WhatsApp
- Emitir certificados de participação em PDF para voluntários
- Exibir métricas de impacto de forma animada e engajante
A aplicação está publicada e acessível em:
https://cidai-project.vercel.app
Hospedada na Vercel com deploy contínuo a partir da branch main do repositório GitHub. Cada push para main dispara um novo deploy automaticamente.
| Camada | Tecnologia | Versão |
|---|---|---|
| UI Library | React | 19.2.0 |
| Linguagem | TypeScript | 5.6.3 |
| Bundler / Dev Server | Vite | 7.1.9 |
| Roteamento | wouter | 3.3.5 |
| Estilização | Tailwind CSS | 4.1.14 |
| Componentes base | shadcn/ui + Radix UI | — |
| Animações | Framer Motion | 12.23.24 |
| Formulários | React Hook Form | 7.66.0 |
| Validação de schema | Zod | 3.25.76 |
| State management | TanStack Query (React Query) | 5.60.5 |
| Geração de PDF | jsPDF | 4.0.0 |
| Ícones | Lucide React | 0.545.0 |
| Notificações toast | Sonner | 2.0.7 |
O projeto é uma Single Page Application (SPA) puramente client-side, sem backend próprio. Toda interação que exigiria persistência de dados é delegada a serviços externos:
- Captação de voluntários — redirecionamento para WhatsApp com dados pré-preenchidos via URL
wa.me - Emissão de certificados — geração de PDF 100% no navegador via jsPDF, sem upload ou armazenamento
Browser
└── React SPA (Vite)
├── Roteador (wouter)
│ ├── / → Home (landing page)
│ └── * → NotFound
├── Providers
│ ├── QueryClientProvider (React Query)
│ └── TooltipProvider (Radix UI)
└── Componentes
├── Navbar / Footer (layout.tsx)
├── Seções da Home (home.tsx)
└── Modais (modals.tsx)
├── VolunteerModal → WhatsApp
└── CertificateModal → jsPDF → PDF no browser
Não há chamadas a APIs REST próprias. A aplicação opera totalmente offline após o carregamento inicial.
cidai-landing-page/
├── client/ # Código-fonte do frontend
│ ├── public/
│ │ └── favicon.png
│ ├── index.html # Entry point HTML
│ └── src/
│ ├── components/
│ │ ├── ui/ # Componentes shadcn/ui (apenas os utilizados)
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ ├── dialog.tsx
│ │ │ ├── form.tsx
│ │ │ ├── input.tsx
│ │ │ ├── label.tsx
│ │ │ ├── section.tsx # Wrapper de seção com blob backgrounds
│ │ │ ├── toast.tsx
│ │ │ ├── toaster.tsx
│ │ │ └── tooltip.tsx
│ │ ├── layout.tsx # Navbar e Footer
│ │ └── modals.tsx # Modal de voluntário e de certificado
│ ├── hooks/
│ │ └── use-toast.ts # Sistema de toast com reducer
│ ├── lib/
│ │ ├── utils.ts # Helper cn() (clsx + tailwind-merge)
│ │ ├── queryClient.ts # Instância do React Query
│ │ └── data.ts # Conteúdo e configurações estáticas
│ ├── pages/
│ │ ├── home.tsx # Landing page principal
│ │ └── not-found.tsx # Página 404
│ ├── App.tsx # Componente raiz com providers e rotas
│ ├── main.tsx # Entry point React
│ └── index.css # Estilos globais e tema Tailwind
├── attached_assets/ # Imagens e assets do projeto
│ ├── Logo_do_Projeto_CIDAI_*.png
│ └── generated_images/
│ ├── happy_elderly_people_with_healthy_smiles.png
│ └── caring_volunteer_helping_elderly_person.png
├── dist/ # Output do build (gerado automaticamente)
├── package.json
├── tsconfig.json
├── vite.config.ts
├── postcss.config.js
└── components.json # Configuração do CLI do shadcn
| Token | Valor | Uso |
|---|---|---|
| Principal | #1C3F3A |
Verde-escuro — cor da marca |
| Creme | #EBE8D8 |
Backgrounds e destaques suaves |
| Acento | #458FF6 |
Azul — calls-to-action secundários |
| Texto | #2D3748 |
Cinza escuro — textos principais |
| Fundo | #FFFFFF |
Fundo base |
As cores são definidas como variáveis CSS no client/src/index.css e consumidas pelo Tailwind CSS v4 via @theme.
- Fonte: Inter (Google Fonts) — pesos 300 a 700
- Border radius padrão:
0.5rem
O componente customizado section.tsx encapsula cada seção da página com suporte a blob backgrounds decorativos posicionados via prop blob="left" | "right" | "none", criando o efeito de gradiente difuso característico do design.
| Seção | ID | Descrição |
|---|---|---|
| Hero | — | Título, subtítulo e CTAs principais |
| Nossa Missão | #missao |
Cards com os três pilares do projeto |
| Sobre Nós | #sobre |
Texto institucional, imagem e depoimento |
| Impacto | #impacto |
Contadores animados de métricas sociais |
| Certificado | #certificado |
Preview do certificado e CTA de emissão |
- Fixa no topo, transparente no topo e com fundo
backdrop-blurao rolar - Destaque automático do link da seção visível no viewport
- Menu hambúrguer em mobile com animação de entrada
- Coleta: nome completo, e-mail, telefone e área de atuação
- Validação com Zod (mínimos de caracteres, formato de e-mail)
- Submissão: redireciona para
wa.me/5511975455253com os dados pré-formatados na mensagem - Nenhum dado é armazenado — privacidade por design
- Protegido por palavra-chave (
souvoluntario) - Validação de CPF no formato
000.000.000-00 - PDF gerado 100% no navegador via jsPDF:
- Formato A4 paisagem
- Background creme e paleta da marca
- Marca d'água com logo do CIDAI (via
GStatecom opacidade reduzida) - Borda interna, tipografia hierárquica e linha de assinatura
- Data de emissão automática
- Abre em nova aba — sem servidor, sem upload
- Entradas de elemento com Framer Motion (
opacity + y,opacity + scale) - Contadores de impacto com animação por
springao entrar na viewport (whileInView) - Hover elevado nos cards da missão (
whileHover: { y: -10 }) - Certificado preview com rotação e hover transition
- Botão flutuante fixo no canto inferior direito
- Link direto no footer e nos itens de "Contato" da navbar
Landing page de página única com navegação por âncoras. O wouter tem ~2 KB (vs ~50 KB do React Router v6), suficiente para gerenciar / e o fallback 404 sem overhead.
A v4 substitui o tailwind.config.js por configuração via CSS puro com @theme e @layer, centralizando tudo no index.css e eliminando um arquivo de configuração separado.
shadcn/ui não é uma biblioteca empacotada — os componentes são copiados diretamente para o código-fonte. Isso garante controle total, sem dependência de versão de terceiros para UI e customização trivial. Apenas os 10 componentes efetivamente utilizados estão no projeto.
Elimina a necessidade de servidor. A palavra-chave (souvoluntario) é um filtro básico de acesso — adequado ao contexto de um projeto voluntário, sem dados sensíveis envolvidos.
- Custo zero de hospedagem
- Sem manutenção de servidor
- Privacidade garantida: nenhum dado pessoal é transmitido a um servidor próprio
- Node.js >= 18
- npm >= 9
git clone https://github.com/digonexs/cidai-project.git
cd cidai-projectnpm installnpm run devDisponível em http://localhost:5173 com Hot Module Replacement (HMR).
| Script | Comando | Descrição |
|---|---|---|
| Desenvolvimento | npm run dev |
Servidor de dev com HMR |
| Build | npm run build |
Build otimizado em dist/ |
| Preview | npm run preview |
Serve o build de produção localmente |
| Type check | npm run check |
Verificação de tipos TypeScript |
O projeto está configurado para deploy automático na Vercel.
URL de produção: https://cidai-project.vercel.app
- Push para a branch
maindispara o pipeline da Vercel automaticamente - A Vercel executa
npm run build, que gera a pastadist/ - O conteúdo de
dist/é servido como site estático na CDN global da Vercel
O vite.config.ts define:
- Root:
client/ - Output:
dist/ - Aliases:
@/→client/src/@assets/→attached_assets/
Nenhuma variável de ambiente é necessária — a aplicação é 100% estática.
Projeto desenvolvido com propósito social. Cada linha de código representa cuidado e dignidade.