Site institucional do Map-OS, o sistema open source de gestão de ordens de serviço, vendas e clientes.
- Visão geral
- Prévia
- Funcionalidades
- Stack
- Começando
- Variáveis de ambiente
- Scripts
- Estrutura do projeto
- Editando o conteúdo
- Formulários
- Tema e design
- SEO
- Deploy
- Contribuindo
- Mantenedores
Este repositório é o redesign do site mapos.com.br. O site antigo usava HTML, jQuery, Bootstrap e PHP. Esta versão foi reescrita em Next.js (App Router) e mantém todo o conteúdo original com um visual mais moderno.
É uma landing page única com navegação por âncoras, mais as páginas legais:
| Rota | Conteúdo |
|---|---|
/ |
Início, Apoiadores, Recursos, Sobre, Hospedar, Download, Comunidade, Newsletter e Contato |
/politica-privacidade |
Política de Privacidade |
/termos-de-uso |
Termos de Uso |
/sitemap.xml · /robots.txt |
Gerados automaticamente |
| Claro | Escuro | Mobile |
|---|---|---|
![]() |
![]() |
![]() |
- Página única e responsiva: menu fixo com desfoque, menu lateral no celular e rolagem suave até as seções
- Tema claro/escuro: segue o sistema operacional por padrão e tem um botão para alternar
- Animações de entrada com Motion, que respeitam
prefers-reduced-motion - Conteúdo centralizado em arquivos TypeScript, sem precisar mexer nos componentes
- Apoiadores com vencimento: saem do site sozinhos depois da data definida
- Formulários com server actions: validação com Zod, envio de e-mail pelo Resend e proteção antispam (campo oculto + limite de envios por IP)
- SEO: metadados, Open Graph, Twitter Card,
sitemap.xmlerobots.txt - Imagens otimizadas com
next/imagee fontes carregadas comnext/font
| Categoria | Tecnologia |
|---|---|
| Framework | Next.js 16 (App Router, Turbopack) + React 19 |
| Linguagem | TypeScript |
| Estilo | Tailwind CSS v4 + @tailwindcss/typography |
| Componentes | shadcn/ui (base Radix) |
| Ícones | lucide-react + simple-icons (marcas) |
| Animações | Motion |
| Tema | next-themes |
| Notificações | Sonner |
| Validação | Zod 4 |
| Resend |
- Node.js 20.9+ (recomendado: 22 LTS)
- npm 10+
# 1. Clone o repositório
git clone <url-deste-repositorio> site-mapos
cd site-mapos
# 2. Instale as dependências
npm install
# 3. Configure as variáveis de ambiente
cp .env.example .env.local
# 4. Rode em modo de desenvolvimento
npm run devAcesse http://localhost:3000.
Sem as variáveis de e-mail, o site funciona normalmente. Só os formulários mostram uma mensagem de erro amigável ao enviar.
Defina em .env.local (desenvolvimento) ou no painel do provedor de hospedagem (produção):
| Variável | Obrigatória | Descrição |
|---|---|---|
RESEND_API_KEY |
Sim* | Chave da API do Resend |
CONTACT_TO_EMAIL |
Sim* | Quem recebe as mensagens. Aceita vários, separados por vírgula |
CONTACT_FROM_EMAIL |
Não | Remetente, ex.: Map-OS <site@mapos.com.br>. O domínio precisa estar verificado no Resend. Padrão: onboarding@resend.dev |
* Necessárias apenas para os formulários enviarem e-mails.
| Comando | Descrição |
|---|---|
npm run dev |
Servidor de desenvolvimento com hot reload |
npm run build |
Build de produção |
npm start |
Serve o build de produção |
npm run lint |
Verifica o código com ESLint |
.
├── docs/ # Capturas de tela usadas neste README
├── public/img/ # Logos, favicons, prints do sistema e logos de apoiadores
└── src/
├── app/
│ ├── layout.tsx # Layout raiz: metadados/SEO, fontes, tema, header, footer e toasts
│ ├── page.tsx # Landing page (junta as seções)
│ ├── actions.ts # Server actions dos formulários (apoiador e newsletter)
│ ├── globals.css # Tailwind, tokens de cor (claro/escuro) e utilitários
│ ├── politica-privacidade/ # Página legal
│ ├── termos-de-uso/ # Página legal
│ ├── sitemap.ts # /sitemap.xml
│ └── robots.ts # /robots.txt
├── components/
│ ├── sections/ # Uma seção da landing por arquivo
│ │ ├── hero.tsx
│ │ ├── supporters.tsx
│ │ ├── features.tsx
│ │ ├── about.tsx # + about-gallery.tsx (galeria interativa)
│ │ ├── hosting.tsx
│ │ ├── download.tsx
│ │ ├── community.tsx
│ │ ├── newsletter.tsx
│ │ └── contact.tsx # Formulário "Seja um Apoiador"
│ ├── ui/ # Componentes shadcn/ui
│ ├── site-header.tsx # Menu fixo + menu mobile
│ ├── site-footer.tsx
│ ├── reveal.tsx # Animação de entrada ao rolar
│ ├── section-heading.tsx # Título padrão das seções
│ ├── brand-icon.tsx # Ícones de redes sociais (simple-icons)
│ ├── legal-page.tsx # Layout das páginas legais
│ ├── logo.tsx
│ ├── theme-provider.tsx
│ └── theme-toggle.tsx
├── content/
│ ├── site.ts # Todo o conteúdo editável do site
│ └── supporters.ts # Lista de apoiadores
└── lib/utils.ts
A maior parte das mudanças do dia a dia é feita em src/content/, sem tocar nos componentes.
| Export | O que controla |
|---|---|
links |
GitHub, releases, wiki, doação, hospedagem SysGo, WhatsApp |
social |
Redes sociais (rodapé e seção Comunidade) |
nav |
Itens do menu |
heroStats, aboutStats, communityStats |
Números exibidos nas seções |
features |
Cartões da seção Recursos (título, descrição, ícone lucide) |
aboutHighlights |
Abas da galeria "Conheça o Sistema" (texto + imagem) |
hostingPerks |
Vantagens da hospedagem SysGo |
release |
Versão atual do Map-OS e textos da seção Download |
maintainers, contact |
Mantenedores, localização e telefone |
Atualize só o campo version:
export const release = {
version: "v4.54.0",
// ...
}- Coloque o logo em
public/img/apoiador/(de preferência PNG com fundo transparente) - Adicione um item à lista:
{
name: "Nome da Empresa",
logo: "/img/apoiador/empresa.png",
description: "Uma frase sobre o apoio ao projeto.",
link: "https://empresa.com.br",
vencimento: "2027-06-30", // opcional (AAAA-MM-DD)
},Depois da data de vencimento, o apoiador some do site sozinho. A página inicial é regerada uma vez por dia (revalidate = 86400 em src/app/page.tsx), então a remoção acontece em até 24h, sem novo deploy.
Edite direto o JSX em src/app/politica-privacidade/page.tsx e src/app/termos-de-uso/page.tsx. A formatação do texto vem do plugin typography.
Os dois formulários são server actions (src/app/actions.ts) usados com useActionState, sem API REST separada.
| Formulário | Seção | Campos |
|---|---|---|
| Seja um Apoiador | #contato |
Empresa*, Site, Nome*, WhatsApp/Telefone, E-mail*, Mensagem |
| Newsletter | Antes do contato | E-mail* |
Como funcionam:
- Validação no servidor com Zod. Os erros aparecem abaixo de cada campo.
- Antispam: um campo oculto (
nickname) que só robôs preenchem, mais um limite de 5 envios por IP a cada 10 minutos. - Envio pelo Resend para
CONTACT_TO_EMAIL, comreply-toapontando para o e-mail de quem preencheu. Assim dá para responder direto do cliente de e-mail. - Retorno: uma notificação (toast) de sucesso ou erro. Quando há erro, o que a pessoa digitou continua preenchido.
Observações
- O limite por IP fica na memória do processo. Em ambientes serverless com várias instâncias ele é aproximado. Para um controle rígido, use um armazenamento compartilhado (ex.: Upstash Redis).
- A newsletter hoje só envia um e-mail avisando de cada nova inscrição. Para montar uma lista de contatos, integre com um serviço como Resend Audiences, Mailchimp ou Brevo em
subscribeNewsletter.
-
Cores: definidas como variáveis CSS (OKLCH) em
src/app/globals.css, nos blocos:root(claro) e.dark(escuro). A cor principal (--primary) é o laranja do logo do Map-OS. -
Utilitários próprios:
bg-grid(grade de fundo do hero) etext-gradient(texto em degradê). -
Tipografia: Geist, carregada com
next/font. -
Novos componentes shadcn/ui:
npx shadcn@latest add <componente>
- Metadados globais, Open Graph e Twitter Card em
src/app/layout.tsx(metadataBase: https://mapos.com.br) - Título por página com o template
%s | Map-OS sitemap.xmlerobots.txtgerados emsrc/app/sitemap.tsesrc/app/robots.ts- HTML semântico em pt-BR, textos alternativos nas imagens e rótulos de acessibilidade na navegação
Se o domínio mudar, atualize a URL em layout.tsx, sitemap.ts e robots.ts.
- Importe o repositório em vercel.com/new
- Cadastre as variáveis de ambiente
- Faça o deploy. A Vercel detecta o Next.js sozinha.
- Aponte o domínio
mapos.com.brpara o projeto em Settings → Domains
npm ci
npm run build
PORT=3000 npm startUse um gerenciador de processos (PM2, systemd) e um proxy reverso (Nginx, Caddy) com HTTPS. Repasse o cabeçalho X-Forwarded-For para o limite por IP funcionar.
Este projeto precisa de um servidor Node por causa dos formulários e da regeração diária da página. Não funciona como export estático (
output: "export").
- Crie um branch:
git checkout -b feat/minha-melhoria - Faça as alterações e rode
npm run lintenpm run build - Confira no navegador os temas claro e escuro e a versão mobile
- Abra um Pull Request descrevendo a mudança (com prints, se for visual)
Contribuições para o sistema Map-OS (não para o site) vão no repositório RamonSilva20/mapos.
| Nome | Contato |
|---|---|
| Gianluca Bine | gian@mapos.com.br |
| Wilmerson | wilmerson@mapos.com.br |
Comunidade: GitHub · WhatsApp · Instagram · Facebook · Twitter/X
Hospedagem oficial: SysGo


