尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗O Elo Materno é uma plataforma web pensada para mães solo, que reúne em um só lugar apoio emocional, jurídico e prático. Entre as funcionalidades estão:
| Tecnologia | Para que é usada |
|---|---|
| Angular 21 + SSR | Framework do front-end, com renderização no servidor |
| Express 5 | Servidor Node que roda o SSR |
| TypeScript 5.9 | Linguagem do projeto |
| RxJS 7.8 | Programação reativa (observables) |
| Firebase (Auth + Firestore) + @angular/fire | Login de usuárias e banco de dados |
| Chart.js | Gráficos (ex.: questionários de bem-estar) |
| jsPDF | Geração de documentos em PDF |
| EmailJS | Envio do código de verificação de e-mail |
| Jitsi / JaaS (8x8) | Videochamadas |
| BrasilAPI | Consulta de CNPJ no cadastro de parceiros |
| VLibras | Tradução do conteúdo para Libras |
| Google Fonts, Font Awesome, Phosphor Icons, FlagCDN | Fontes, ícones e bandeiras do seletor de idioma |
| Vitest + jsdom | Testes unitários |
| Prettier | Formatação de código |
| Netlify | Hospedagem do site (com SSR) |
video-token/)| Tecnologia | Para que é usada |
|---|---|
| Cloudflare Workers + Wrangler | Backend leve que gera o token das chamadas e envia e-mails agendados |
| Cron Triggers (a cada 10 min) | Dispara os lembretes automáticos |
| jose | Criação e validação de tokens JWT (JaaS e login do Firebase) |
| Mailjet ou Brevo | Envio dos e-mails de lembrete (o código aceita os dois) |
| Firestore REST API + Google OAuth2 | O Worker lê e grava no banco usando uma conta de serviço |
Web Speech (speechSynthesis, leitura em voz alta), Notifications (aviso de consulta), Service Worker + Web Manifest (PWA), IntersectionObserver (animações), Web Share e Clipboard (compartilhar eventos) e localStorage (preferências).
Esta seção lista tudo o que o projeto usa e quanto cada item custa, inclusive o que hoje está no plano gratuito. O objetivo é que qualquer pessoa que for manter ou expandir o Elo Materno saiba quanto vai gastar conforme o número de usuárias cresce.
📅 Valores pesquisados em novembro de 2026 nas páginas oficiais de cada serviço. Preços mudam com frequência; confira os links antes de contratar.
💱 Conversão usada: US$ 1 = R$ 5,50 (arredondado) + 3,5% de IOF de compra internacional no cartão, ou seja, US$ 1 ≈ R$ 5,69. Os valores em reais são aproximados.
| Situação | Custo mensal (US$) | Custo mensal (R$ aprox.) | Custo anual (R$ aprox.) |
|---|---|---|---|
| Hoje (TCC / testes, tudo no plano grátis) | US$ 0 | R$ 0 | R$ 0 |
| Lançamento pequeno (~100 a 150 mães com consulta por mês) | US$ 108 | R$ 615 | R$ 7.380 |
| Crescimento (~1.000 usuários por mês) | US$ 533 + uso do Firebase | R$ 3.034 + Firebase | R$ 36.400 + Firebase |
O lançamento pequeno considera JaaS Basic (US$ 99) + Netlify Personal (US$ 9). O crescimento considera JaaS Standard (US$ 499) + Netlify Pro (US$ 20) + EmailJS Personal (US$ 9) + Cloudflare Workers Paid (US$ 5) + Firebase Blaze pago por uso. Some R$ 40/ano se registrarem um domínio próprio.
⚠️ A videochamada é cerca de 90% do custo. É também o primeiro limite que o projeto atinge: o plano grátis do JaaS acaba com pouco mais de 12 consultas no mês.
Usado para login e banco de dados. Não tem mensalidade: no plano Spark é grátis com limites; no plano Blaze paga-se só o que passar desses limites.
Plano grátis (Spark)
| Recurso | Limite grátis |
|---|---|
| Login (e-mail e redes sociais) | 50.000 usuários ativos por mês |
| Armazenamento no Firestore | 1 GiB no total |
| Leituras de documentos | 50.000 por dia |
| Gravações de documentos | 20.000 por dia |
| Exclusões de documentos | 20.000 por dia |
Plano pago (Blaze): valores cobrados acima da cota grátis, Firestore Standard edition
| Recurso | Região Iowa (us-central1) | Região São Paulo (southamerica-east1) |
|---|---|---|
| Leituras | US$ 0,03 a cada 100 mil | US$ 0,045 a cada 100 mil |
| Gravações | US$ 0,09 a cada 100 mil | US$ 0,135 a cada 100 mil |
| Exclusões | US$ 0,01 a cada 100 mil | US$ 0,015 a cada 100 mil |
| Armazenamento | ~US$ 0,15 por GiB/mês | US$ 0,135 por GiB/mês |
| Login acima de 50 mil usuários | ~US$ 0,0055 por usuário ativo | ~US$ 0,0055 por usuário ativo |
O preço depende da região escolhida quando o banco foi criado. Confira em Console do Firebase → Firestore → Configurações.
Cuidados
🔗 firebase.google.com/pricing · cloud.google.com/firestore/pricing
Cobra por créditos. Cada plano inclui uma quantidade de créditos por mês, que são gastos com deploys, tráfego e o SSR.
| Plano | Preço | Créditos por mês | R$ aprox./mês |
|---|---|---|---|
| Free | US$ 0 | 300 (limite rígido) | R$ 0 |
| Personal | US$ 9 | 1.000 | R$ 51 |
| Pro | US$ 20 | 3.000 (membros ilimitados) | R$ 114 |
| Enterprise | Sob consulta | Personalizado | — |
Quanto cada coisa gasta
| Ação | Créditos |
|---|---|
| Cada deploy em produção | 15 |
| Cada GB de tráfego (bandwidth) | 20 |
| Processamento do SSR / funções | 10 por GB-hora |
| Requisições | 2 a cada 10 mil |
| Deploy de preview (branch / pull request) | Grátis |
Créditos extras (só nos planos pagos): Personal US$ 5 por 500 créditos; Pro US$ 10 por 1.500 créditos.
Cuidados
main gera um deploy.main e usem os deploys de preview, que são grátis, para testar.video-token/)| Plano | Preço | O que inclui | R$ aprox./mês |
|---|---|---|---|
| Free | US$ 0 | 100.000 requisições por dia, 10 ms de CPU por chamada | R$ 0 |
| Paid | US$ 5/mês (mínimo) | 10 milhões de requisições/mês e 30 milhões de ms de CPU | R$ 28 |
| Excedente (Paid) | — | US$ 0,30 por milhão de requisições extras; US$ 0,02 por milhão de ms de CPU extras | — |
Para o uso atual do Elo Materno (tokens de vídeo + lembretes a cada 10 minutos), dificilmente o plano grátis vai acabar.
🔗 developers.cloudflare.com/workers/platform/pricing
Cobra por usuário ativo mensal (MAU). Cada dispositivo diferente (navegador, celular, tablet) que entra em uma chamada no mês conta como 1 usuário.
| Plano | Usuários por mês | Preço | R$ aprox./mês |
|---|---|---|---|
| Developer | 25 | Grátis | R$ 0 |
| Basic | 300 | US$ 99 | R$ 564 |
| Standard | 1.500 | US$ 499 | R$ 2.841 |
| Business | 3.000 | US$ 999 | R$ 5.687 |
| Enterprise | 5.000 ou mais | Sob consulta | — |
Custos adicionais
| Item | Preço |
|---|---|
| Usuário acima do plano | US$ 0,99 por usuário |
| Gravação de chamada | US$ 0,01 por minuto |
| Transcrição | US$ 0,06 por minuto |
| Ligação telefônica (saída) | 1 usuário + US$ 0,03 por minuto |
Cuidados
🔗 jaas.8x8.vc · 8x8.com/products/apis/video
| Plano | Envios por mês | Preço | R$ aprox./mês |
|---|---|---|---|
| Free | 200 (2 modelos, até 50 KB) | US$ 0 | R$ 0 |
| Personal | 2.000 | US$ 9 | R$ 51 |
| Professional | Mais envios e anexos maiores | US$ 15 | R$ 85 |
| Business | Até 25.000 | US$ 40 | R$ 228 |
O pagamento anual tem cerca de 20% de desconto. Cada cadastro gasta 1 envio, e reenviar o código gasta outro.
Dica: o Worker já usa Mailjet ou Brevo, que têm cotas grátis muito maiores. Dá para mandar o código de verificação por eles e dispensar o EmailJS.
O Worker funciona com qualquer um dos dois, então só é preciso pagar um.
| Serviço | Plano grátis | Primeiro plano pago | Próximo plano | R$ aprox. (1º pago) |
|---|---|---|---|---|
| Mailjet | 6.000 e-mails/mês (máx. 200 por dia), 1.000 contatos | Starter: US$ 9 (8.000 e-mails) | Essential: ~US$ 17–19 (15.000 e-mails) | R$ 51 |
| Brevo | 300 e-mails por dia (~9.000/mês) | Starter: US$ 9 (5.000 e-mails) | Standard: US$ 18 | R$ 51 |
Os planos grátis colocam a marca do serviço no rodapé dos e-mails.
🔗 mailjet.com/pricing · brevo.com/pricing
| Item | Preço | Quando seria necessário |
|---|---|---|
Domínio .com.br (Registro.br) | R$ 40 por ano | Para ter um endereço próprio (ex.: elomaterno.com.br) em vez de elomaterno.netlify.app |
| E-mail profissional no domínio (ex.: Google Workspace, Zoho) | Varia por plano, consulte | Para enviar e-mails de [email protected] em vez de um Gmail pessoal, o que melhora a entrega |
| Servidor próprio (VPS) para Jitsi | Varia por provedor | Se trocarem o JaaS por um Jitsi próprio |
| Google Play (publicar app Android) | US$ 25 (pagamento único) | Só se virarem app de loja; hoje o projeto é um PWA e não precisa |
| Apple Developer (publicar app iOS) | US$ 99 por ano | Só se virarem app de loja; hoje não precisa |
| Font Awesome Pro | Pago, consulte | Só se precisarem de ícones que não estão na versão grátis |
Estes itens não têm custo e não têm plano pago necessário para o projeto:
| Item | Por que é grátis |
|---|---|
| Angular, TypeScript, RxJS, Express, Chart.js, jsPDF, jose, Vitest, jsdom, Prettier, Wrangler, buffer | Bibliotecas open source (licenças MIT, Apache ou similares) |
| Node.js, npm, Git, VS Code | Ferramentas de desenvolvimento gratuitas |
| GitHub (repositório) | Repositórios públicos e privados são grátis no plano Free |
| BrasilAPI | API pública e gratuita |
| VLibras | Ferramenta pública do Governo Federal |
| Google Fonts, Phosphor Icons, Font Awesome Free, FlagCDN | Recursos gratuitos via CDN |
| Google OAuth2 e Secure Token (usados pelo Worker) | Fazem parte do Firebase/Google Cloud, sem cobrança separada |
| APIs do navegador (voz, notificações, PWA, compartilhar) | Já vêm no navegador da usuária |
Antes de começar, instale na sua máquina:
Para conferir se está tudo certo:
git --version
node -v
npm -v
💡 Não é obrigatório instalar o Angular CLI globalmente: os comandos
npm start,npm run buildenpm testjá usam a versão do projeto.
1. Clone o repositório
git clone https://github.com/analuiza2305/Elo-Angular.git
2. Entre na pasta do projeto
cd Elo-Angular
3. Instale as dependências
npm install
4. Inicie o servidor de desenvolvimento
npm start
5. Abra no navegador
Acesse http://localhost:4200. A página recarrega sozinha sempre que você salvar algum arquivo.
As configurações do front-end ficam em:
src/environments/environment.ts → usado no build de produção
src/environments/environment.development.ts → usado no npm start
Cada arquivo tem este formato:
export const environment = {
production: false,
firebase: {
apiKey: 'SUA_API_KEY',
authDomain: 'seu-projeto.firebaseapp.com',
projectId: 'seu-projeto',
storageBucket: 'seu-projeto.appspot.com',
messagingSenderId: '000000000000',
appId: '1:000000000000:web:xxxxxxxxxxxx',
measurementId: 'G-XXXXXXXXXX',
},
emailjs: {
serviceId: 'service_xxxxxxx',
templateId: 'template_xxxxxxx',
publicKey: 'xxxxxxxxxxxxxxxxx',
},
};
Onde encontrar cada valor:
⚠️ Sobre segurança: essas chaves do Firebase e do EmailJS são públicas por natureza — elas vão para o navegador de qualquer pessoa que abrir o site. Quem protege os dados são as regras de segurança do Firestore e as restrições de domínio configuradas em cada serviço, não o sigilo da chave. Nunca coloque aqui chaves privadas, contas de serviço (
*adminsdk*.json) ou chaves de API de servidor.
video-token/)A pasta video-token/ é um Cloudflare Worker separado do Angular. Ele gera os tokens das videochamadas (JaaS) e dispara e-mails de lembrete. Só é necessário mexer nele se você for trabalhar nessas funcionalidades; o site roda normalmente sem ele, apenas sem as chamadas de vídeo.
Rodar localmente:
cd video-token
npm install
cp .dev.vars.example .dev.vars # depois preencha com os valores reais
npm run dev
Publicar:
npm run deploy
As variáveis públicas ficam em video-token/wrangler.toml. Os segredos nunca vão para o repositório: localmente ficam em video-token/.dev.vars (já ignorado pelo Git) e, em produção, são cadastrados com:
npx wrangler secret put NOME_DO_SEGREDO
Segredos usados pelo Worker: JAAS_PRIVATE_KEY, GOOGLE_SERVICE_ACCOUNT, MAILJET_API_KEY, MAILJET_API_SECRET, BREVO_API_KEY e CHAVE_TESTE.
| Comando | O que faz |
|---|---|
npm start | Roda o projeto em modo de desenvolvimento em localhost:4200 |
npm run build | Gera a versão de produção na pasta dist/ |
npm run watch | Gera o build de desenvolvimento e refaz a cada alteração |
npm test | Executa os testes unitários com Vitest |
npm run serve:ssr:elomaterno | Roda a versão de produção com SSR (depois do build) |
Elo-Angular/
├── public/ # Imagens, fontes e favicon
├── src/
│ ├── app/
│ │ ├── components/ # Componentes reutilizáveis (header, footer, alertas...)
│ │ ├── core/ # Firebase, serviços centrais e guards de rota
│ │ ├── pages/ # Páginas da aplicação
│ │ └── services/ # Regras de negócio (lembretes, PDFs, questionários...)
│ └── environments/ # Configurações do Firebase e EmailJS
├── video-token/ # Cloudflare Worker (videochamada e e-mails)
├── angular.json
└── package.json
npm install dá erro de versão do Node
Confira com node -v. O Angular 21 precisa do Node 20.19 ou superior.
A porta 4200 já está em uso
Rode em outra porta: npm start -- --port 4300.
Erros de Firebase como window is not defined
O projeto usa SSR, então parte do código roda no servidor (Node), onde não existe window. Envolva chamadas que só funcionam no navegador com isPlatformBrowser (veja o comentário em src/app/core/firebase.ts).
Videochamada não conecta
Verifique se o Worker está publicado e se o endereço em src/app/pages/videochamada/videochamada.ts (URL_TOKEN_VIDEO) aponta para ele.
| Nome |
|---|
| Ana Luiza |
| Emily Rorigues |
| João Victor |
| Michelly Moreira |
| Samyra Alves |