尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Frontend do projeto Nutriz, construído com React + TypeScript + Vite. A rota /artigos exibe a leitura dos artigos da seção "Artigos para te apoiar em cada fase" da landing page — é acessível tanto deslogada (publicRouter) quanto logada (routerPrivate, vinda da Central de Conteúdos), por isso está registrada nos dois roteadores. O artigo ativo é definido pelo query param a (ex.: /artigos?a=2), e o botão "Voltar" muda de destino conforme o contexto (landing para visitante, Central de Conteúdos para usuária logada).查看完整 README ↗
Frontend do projeto Nutriz, construído com React + TypeScript + Vite.
src/
├── assets/ # Imagens, ícones e outros arquivos estáticos
├── components/
│ ├── full/ # Componentes completos/compostos da aplicação
│ ├── layout/ # Componentes de layout (Header, Footer, etc.)
│ └── ui/ # Componentes de UI reutilizáveis (shadcn/radix)
├── config/ # Configurações gerais da aplicação
├── context/ # Contextos React (estado global)
├── hooks/ # Custom hooks
├── lib/ # Funções utilitárias e helpers
├── pages/
│ ├── private/ # Páginas que exigem autenticação (ex: home)
│ └── public/ # Páginas públicas (ex: landing-page, login)
├── router/ # Configuração de rotas
└── services/
└── types/ # Tipagens usadas nos serviços/API
A rota /artigos exibe a leitura dos artigos da seção "Artigos para te apoiar em cada fase" da landing page — é acessível tanto deslogada (publicRouter) quanto logada (routerPrivate, vinda da Central de Conteúdos), por isso está registrada nos dois roteadores. O artigo ativo é definido pelo query param a (ex.: /artigos?a=2), e o botão "Voltar" muda de destino conforme o contexto (landing para visitante, Central de Conteúdos para usuária logada).
src/pages/public/articles/data.ts. Landing, Central de Conteúdos e a tela de artigo individual importam direto desse módulo.prefers-reduced-motion.src/assets/artigos/). O vídeo usa Article.videoUrl quando definido (embed real); sem URL, mostra a capa com o selo "Vídeo em breve" em vez de simular um player.Page (título/descrição/botão de voltar); não há mais busca nem função de compartilhar.A rota privada /conteudo-educativo (src/pages/private/content-hub/) é a home de artigos da área logada, acessível pelo menu hambúrguer. Destaques, grid "Mais conteúdos", vídeos em destaque, dicas rápidas e um accordion de dúvidas frequentes — todos os cards/vídeos abrem a mesma tela de leitura de artigos acima.
A EVA é a assistente de IA que atende nutrizes 24/7. Ela é um widget flutuante
global (FAB no canto inferior direito → modal de chat), disponível em qualquer
página permitida. Consome o microserviço nutriz-ia-service (FastAPI, porta
8000) via WebSocket com streaming.
src/pages/private/eva/widget/ (eva-widget.tsx,
eva-chat-panel.tsx, eva-welcome-panel.tsx, use-eva-access.ts).src/App.tsx, ao lado do RouterProvider.src/pages/private/eva/components/. Hook de streaming: hooks/use-eva-chat.ts.O gate fica em use-eva-access.ts, construído sobre useAuth() + EnumUserType:
common).adm e nurse — o FAB nem é montado (checagem no topo da árvore,
não via CSS). O backend também recusa esses papéis no /ws/chat.common): conecta em /ws/chat com auth.token.POST /session/anonymous → token efêmero → /ws/chat-public.
Rate limit, detecção de PII e anti-jailbreak são aplicados no backend; close
codes 4029 (rate limit) e 4008 (jailbreak) encerram com aviso amigável.eva:welcome-seen:<id_user>).conversation/message) para auditoria; a listagem visual virá numa fase
futura consumindo o GET /conversations já existente no IA service.
Em .env.development:
VITE_EVA_API_URL=http://localhost:8000
VITE_EVA_DEV_TOKEN=
VITE_EVA_API_URL: única URL necessária — a base HTTP do IA service (usada
no POST /session/anonymous). A URL do WebSocket (/ws/chat e
/ws/chat-public) é derivada dela no código (http→ws, https→wss),
então em produção basta https://...onrender.com. Barra final é normalizada
(com ou sem / no fim funciona — foi o bug do //session/anonymous → 404).VITE_EVA_WS_URL (opcional, retrocompatível): sobrepõe a URL do WebSocket.
Só defina se o WS ficar em host/porta diferente do HTTP; caso contrário não é
necessária (fica derivada de VITE_EVA_API_URL).VITE_EVA_DEV_TOKEN: somente desenvolvimento. Quando preenchido, substitui o
token da sessão logada na conexão do chat. Deixe vazio em qualquer outro cenário.# no repositório nutriz-ia-service
docker compose up -d
Sobe a API na porta 8000 e o banco pgvector com migrations. O IA service já
aceita a origin do Vite (http://localhost:5173) via CORS.
http://localhost:5173/ (deslogado), clique no FAB, aceite o
aviso LGPD e converse. Recarregar descarta o histórico.localStorage.setItem("data", JSON.stringify({ token: "<TOKEN>", id_user: "<UUID_DA_USUARIA>", name: "Usuaria Teste", type: "common", addresses: [] }));
location.reload();
O FAB aparece; o chat conecta em /ws/chat. Para confirmar o gate, repita com
type: "nurse" e verifique que o FAB não aparece.
Close codes 4001 (sessão) e 4003 (consentimento) bloqueiam o input com aviso;
quedas de conexão disparam reconexão com backoff (1s → 2s → 4s).
pnpm install
.env.development e preencha VITE_API_URL com o link que será enviado no privado.pnpm dev
pnpm build # Gera o build de produção
pnpm preview # Faz o preview do build de produção
pnpm lint # Verifica lint (biome)
pnpm lint:fix # Corrige problemas de lint automaticamente
pnpm format # Formata o código