Compare commits
6 Commits
cd6bcf5b3d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| dc697c8962 | |||
| 667447c389 | |||
| e3f35d808d | |||
| fdfb4606f0 | |||
| e5c18bb6fc | |||
| 6dfdf01830 |
Vendored
+5
-31
@@ -99,8 +99,8 @@
|
|||||||
<!-- Primary Meta Tags -->
|
<!-- Primary Meta Tags -->
|
||||||
<title>Avanzato Tecnologia | TI Gerenciada, Cloud e Seguranca em Guarulhos/SP</title>
|
<title>Avanzato Tecnologia | TI Gerenciada, Cloud e Seguranca em Guarulhos/SP</title>
|
||||||
<meta name="title" content="Avanzato Tecnologia | TI Gerenciada, Cloud e Seguranca em Guarulhos/SP" />
|
<meta name="title" content="Avanzato Tecnologia | TI Gerenciada, Cloud e Seguranca em Guarulhos/SP" />
|
||||||
<meta name="description" content="Solucoes em TI Gerenciada, Cloud Computing e Seguranca da Informacao. +23 anos de experiencia, +500 clientes atendidos. Suporte 24/7." />
|
<meta name="description" content="Solucoes em TI Gerenciada, Cloud Computing e Seguranca da Informacao. +23 anos de experiencia, +500 clientes atendidos. Suporte 24/7 em Guarulhos e regiao." />
|
||||||
<meta name="app-version" content="1.3.4" />
|
<meta name="app-version" content="1.0.0" />
|
||||||
<meta name="keywords" content="TI Gerenciada, Cloud Computing, Seguranca da Informacao, Suporte Tecnico, Tecnologia da Informacao, Guarulhos, Sao Paulo, Infraestrutura de TI, Backup, Firewall, Consultoria TI" />
|
<meta name="keywords" content="TI Gerenciada, Cloud Computing, Seguranca da Informacao, Suporte Tecnico, Tecnologia da Informacao, Guarulhos, Sao Paulo, Infraestrutura de TI, Backup, Firewall, Consultoria TI" />
|
||||||
<meta name="author" content="Avanzato Tecnologia" />
|
<meta name="author" content="Avanzato Tecnologia" />
|
||||||
<meta name="robots" content="index, follow" id="meta-robots" />
|
<meta name="robots" content="index, follow" id="meta-robots" />
|
||||||
@@ -239,37 +239,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script type="module" crossorigin src="/assets/index-DFuPBbfP.js"></script>
|
<script type="module" crossorigin src="/assets/index-DLMsdH5y.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-CWiRqhwC.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-8ILJAHKZ.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root">
|
<div id="root"></div>
|
||||||
<section class="hero">
|
|
||||||
<h1>Avanzato Tecnologia - TI Gerenciada, Cloud e Seguranca</h1>
|
|
||||||
<p>+23 anos de experiencia em TI para empresas. +500 clientes atendidos em Guarulhos, Sao Paulo e regiao.</p>
|
|
||||||
<p>Servicos: Suporte Tecnico 24/7, Cloud Computing, Seguranca da Informacao, Backup Corporativo, VoIP, Firewall, Monitoramento.</p>
|
|
||||||
<div><a href="/avaliacao">Avaliacao Gratuita</a> <a href="/contato">Falar com Especialista</a></div>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h2>Por que escolher a Avanzato?</h2>
|
|
||||||
<ul>
|
|
||||||
<li>Suporte 24/7 com equipe especializada</li>
|
|
||||||
<li>+23 anos de experiencia em TI empresarial</li>
|
|
||||||
<li>+500 clientes atendidos em diversos segmentos</li>
|
|
||||||
<li>Atendimento em Guarulhos, Grande SP e interior</li>
|
|
||||||
<li>Relatorios tecnicos mensais detalhados</li>
|
|
||||||
</ul>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h2>Segmentos que Atendemos</h2>
|
|
||||||
<p>Contabilidades, Advocacias, Industrias, BPO, Clinicas, Imobiliarias, Condominios, Logistica, Monitoramento.</p>
|
|
||||||
<p><a href="/onde-atuamos">Ver onde atuamos</a></p>
|
|
||||||
</section>
|
|
||||||
<section>
|
|
||||||
<h2>Onde Atuamos</h2>
|
|
||||||
<p>Guarulhos (matriz), Mogi das Cruzes, Ipiranga, Vila Formosa, Cerqueira Cesar, Santana, Bras, Ribeirao Preto.</p>
|
|
||||||
<p><a href="/onde-atuamos">Ver todas as localidades</a></p>
|
|
||||||
</section></div>
|
|
||||||
|
|
||||||
<!-- Facebook Pixel noscript (moved from head to body to fix parse5 warning) -->
|
<!-- Facebook Pixel noscript (moved from head to body to fix parse5 warning) -->
|
||||||
<noscript>
|
<noscript>
|
||||||
|
|||||||
Vendored
+42
@@ -239,4 +239,46 @@
|
|||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
|
<!-- Avanzato Tools -->
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.9</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/spf-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/dkim-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/dmarc-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/mx-lookup</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/ssl-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/email-security-score</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/microsoft-365-analyzer</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
</urlset>
|
</urlset>
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
# Release HML
|
|
||||||
|
|
||||||
Data: ter 2 jun 2026 12:43:57 -03
|
|
||||||
|
|
||||||
Ambiente:
|
|
||||||
HML
|
|
||||||
|
|
||||||
Descrição:
|
|
||||||
Paginas e SEO master
|
|
||||||
|
|
||||||
Branch:
|
|
||||||
develop
|
|
||||||
|
|
||||||
Arquivos alterados antes do commit:
|
|
||||||
D dist/.DS_Store
|
|
||||||
D dist/assets/index-C1GgsDvQ.js
|
|
||||||
D dist/assets/index-Cg4oF5jQ.css
|
|
||||||
M dist/index.html
|
|
||||||
M dist/robots.txt
|
|
||||||
M dist/sitemap.xml
|
|
||||||
M index.html
|
|
||||||
D infra/releases/2026-06-02_10-42-22_HML.md
|
|
||||||
D infra/releases/2026-06-02_11-45-35_HML.md
|
|
||||||
D infra/releases/2026-06-02_12-07-34_HML.md
|
|
||||||
M node_modules/.tmp/tsconfig.app.tsbuildinfo
|
|
||||||
M public/version.json
|
|
||||||
M scripts/build-static-routes.sh
|
|
||||||
M src/config/site.ts
|
|
||||||
M src/sections/Footer.tsx
|
|
||||||
M vite.config.ts
|
|
||||||
?? infra/releases/2026-06-02_12-43-57_HML.md
|
|
||||||
?? scripts/prerender.cjs
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Preparado para publicação
|
|
||||||
|
|
||||||
Commit:
|
|
||||||
80dbb986
|
|
||||||
|
|
||||||
Arquivos no commit:
|
|
||||||
dist/.DS_Store
|
|
||||||
dist/assets/index-C1GgsDvQ.js
|
|
||||||
dist/assets/index-Cg4oF5jQ.css
|
|
||||||
dist/index.html
|
|
||||||
dist/robots.txt
|
|
||||||
dist/sitemap.xml
|
|
||||||
index.html
|
|
||||||
infra/releases/2026-06-02_10-42-22_HML.md
|
|
||||||
infra/releases/2026-06-02_11-45-35_HML.md
|
|
||||||
infra/releases/2026-06-02_12-07-34_HML.md
|
|
||||||
infra/releases/2026-06-02_12-43-57_HML.md
|
|
||||||
node_modules/.tmp/tsconfig.app.tsbuildinfo
|
|
||||||
public/version.json
|
|
||||||
scripts/build-static-routes.sh
|
|
||||||
scripts/prerender.cjs
|
|
||||||
src/config/site.ts
|
|
||||||
src/sections/Footer.tsx
|
|
||||||
vite.config.ts
|
|
||||||
|
|
||||||
Status final:
|
|
||||||
Publicado no Gitea / aguardando pipeline HML
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# Release HML
|
||||||
|
|
||||||
|
Data: qua 3 jun 2026 22:07:59 -03
|
||||||
|
|
||||||
|
Ambiente:
|
||||||
|
HML
|
||||||
|
|
||||||
|
Descrição:
|
||||||
|
Aplicativos de Atrair Leads
|
||||||
|
|
||||||
|
Branch:
|
||||||
|
develop
|
||||||
|
|
||||||
|
Arquivos alterados antes do commit:
|
||||||
|
M dist/index.html
|
||||||
|
D infra/releases/2026-06-02_22-34-39_HML.md
|
||||||
|
M src/App.tsx
|
||||||
|
M src/sections/About.tsx
|
||||||
|
M src/sections/CondominiosCTA.tsx
|
||||||
|
M src/sections/Hero.tsx
|
||||||
|
M src/sections/Navigation.tsx
|
||||||
|
M src/sections/Services.tsx
|
||||||
|
?? infra/releases/2026-06-03_22-07-58_HML.md
|
||||||
|
?? nginx/
|
||||||
|
?? public/about-image.webp
|
||||||
|
?? public/hero-dashboard.webp
|
||||||
|
?? public/service-cloud.webp
|
||||||
|
?? public/service-security.webp
|
||||||
|
?? public/service-support.webp
|
||||||
|
?? public/service-ti.webp
|
||||||
|
|
||||||
|
Status:
|
||||||
|
Preparado para publicação
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
fdfb4606
|
||||||
|
|
||||||
|
Arquivos no commit:
|
||||||
|
dist/index.html
|
||||||
|
infra/releases/2026-06-02_22-34-39_HML.md
|
||||||
|
infra/releases/2026-06-03_22-07-58_HML.md
|
||||||
|
nginx/avanzato.conf
|
||||||
|
public/about-image.webp
|
||||||
|
public/hero-dashboard.webp
|
||||||
|
public/service-cloud.webp
|
||||||
|
public/service-security.webp
|
||||||
|
public/service-support.webp
|
||||||
|
public/service-ti.webp
|
||||||
|
src/App.tsx
|
||||||
|
src/sections/About.tsx
|
||||||
|
src/sections/CondominiosCTA.tsx
|
||||||
|
src/sections/Hero.tsx
|
||||||
|
src/sections/Navigation.tsx
|
||||||
|
src/sections/Services.tsx
|
||||||
|
|
||||||
|
Status final:
|
||||||
|
Publicado no Gitea / aguardando pipeline HML
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Release PROD
|
||||||
|
|
||||||
|
Data: qua 3 jun 2026 22:19:56 -03
|
||||||
|
|
||||||
|
Ambiente:
|
||||||
|
PROD
|
||||||
|
|
||||||
|
Descrição:
|
||||||
|
Aplicativos de Atrair Leads
|
||||||
|
|
||||||
|
Branch:
|
||||||
|
main
|
||||||
|
|
||||||
|
Commit:
|
||||||
|
667447c3
|
||||||
|
|
||||||
|
Último commit develop:
|
||||||
|
e3f35d80
|
||||||
|
|
||||||
|
Arquivos alterados no último commit:
|
||||||
|
|
||||||
|
|
||||||
|
Status:
|
||||||
|
Preparado para publicação em produção
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# ============================================================================
|
||||||
|
# Configuracao Nginx - Avanzato Tecnologia
|
||||||
|
# ============================================================================
|
||||||
|
# Inclui: CSP, HSTS, X-Frame-Options, cache headers, gzip, brotli
|
||||||
|
# Copiar para: /etc/nginx/sites-available/avanzato.com.br
|
||||||
|
# Ativar: ln -s /etc/nginx/sites-available/avanzato.com.br /etc/nginx/sites-enabled/
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name avanzato.com.br www.avanzato.com.br;
|
||||||
|
|
||||||
|
# Redirecionar HTTP para HTTPS
|
||||||
|
return 301 https://$server_name$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
server_name avanzato.com.br www.avanzato.com.br;
|
||||||
|
|
||||||
|
# SSL (certbot gerencia automaticamente)
|
||||||
|
ssl_certificate /etc/letsencrypt/live/avanzato.com.br/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/avanzato.com.br/privkey.pem;
|
||||||
|
ssl_trusted_certificate /etc/letsencrypt/live/avanzato.com.br/chain.pem;
|
||||||
|
|
||||||
|
# SSL hardening
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 1d;
|
||||||
|
ssl_session_tickets off;
|
||||||
|
|
||||||
|
# HSTS - HTTP Strict Transport Security
|
||||||
|
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||||
|
|
||||||
|
# Root do projeto
|
||||||
|
root /var/www/avanzato/dist;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
# Gzip compression
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_min_length 1024;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_types
|
||||||
|
text/plain
|
||||||
|
text/css
|
||||||
|
text/xml
|
||||||
|
text/javascript
|
||||||
|
application/json
|
||||||
|
application/javascript
|
||||||
|
application/xml+rss
|
||||||
|
application/atom+xml
|
||||||
|
image/svg+xml
|
||||||
|
font/woff2;
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# CACHE HEADERS - Assets estaticos
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
# Imagens, fontes, videos - 1 mes
|
||||||
|
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|woff|woff2|ttf|eot|mp4|webm)$ {
|
||||||
|
expires 1M;
|
||||||
|
add_header Cache-Control "public, immutable" always;
|
||||||
|
add_header Vary "Accept-Encoding" always;
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# CSS e JS - 1 ano (tem hash no nome)
|
||||||
|
location ~* \.(css|js)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable" always;
|
||||||
|
add_header Vary "Accept-Encoding" always;
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# HTML - nao cachear
|
||||||
|
location ~* \.html$ {
|
||||||
|
expires -1;
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
|
||||||
|
add_header Pragma "no-cache" always;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# SECURITY HEADERS
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
# Content Security Policy
|
||||||
|
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://connect.facebook.net https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self' https://dns.google https://crt.sh https://mkt.avanzato.com.br https://www.google-analytics.com https://www.facebook.com; frame-src 'self' https://mkt.avanzato.com.br; media-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requests;" always;
|
||||||
|
|
||||||
|
# X-Frame-Options - protecao contra clickjacking
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
|
||||||
|
# X-Content-Type-Options
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
|
||||||
|
# Referrer Policy
|
||||||
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||||
|
|
||||||
|
# Permissions Policy
|
||||||
|
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), magnetometer=(), gyroscope=()" always;
|
||||||
|
|
||||||
|
# Cross-Origin Opener Policy
|
||||||
|
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||||
|
|
||||||
|
# Cross-Origin Resource Policy
|
||||||
|
add_header Cross-Origin-Resource-Policy "cross-origin" always;
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# REACT ROUTER - SPA fallback
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sitemap e robots - acessiveis
|
||||||
|
location = /sitemap.xml {
|
||||||
|
try_files $uri =404;
|
||||||
|
add_header Content-Type "application/xml" always;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /robots.txt {
|
||||||
|
try_files $uri =404;
|
||||||
|
add_header Content-Type "text/plain" always;
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
@@ -239,4 +239,46 @@
|
|||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|
||||||
|
<!-- Avanzato Tools -->
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.9</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/spf-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/dkim-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/dmarc-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/mx-lookup</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/ssl-checker</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/email-security-score</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://avanzato.com.br/ferramentas/microsoft-365-analyzer</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
</urlset>
|
</urlset>
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "1.3.4",
|
"version": "1.4.0",
|
||||||
"date": "2026-06-02",
|
"date": "2026-06-02",
|
||||||
"environment": "auto-detect"
|
"environment": "auto-detect"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"current": "1.4.0",
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"version": "1.4.0",
|
||||||
|
"date": "2026-06-02",
|
||||||
|
"title": "Avanzato Tools - Fase 1",
|
||||||
|
"changes": [
|
||||||
|
"7 ferramentas gratuitas: SPF Checker, DKIM Checker, DMARC Checker, MX Lookup, SSL Checker, Email Security Score, Microsoft 365 Analyzer",
|
||||||
|
"Pagina principal /ferramentas com grid de ferramentas",
|
||||||
|
"Sistema de 2 consultas gratuitas + cadastro para ilimitado",
|
||||||
|
"Captura de 'dor de TI' e urgencia para scoring de leads",
|
||||||
|
"Integracao com avaliacao gratuita e contato",
|
||||||
|
"Prerender de todas as 8 paginas de ferramentas para SEO",
|
||||||
|
"Sitemap atualizado com 8 novas URLs",
|
||||||
|
"Schema.org FAQPage nas paginas de ferramentas"
|
||||||
|
],
|
||||||
|
"file": "avanzato-site-v1.4.0.zip"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ NC='\033[0m'
|
|||||||
echo -e "${BLUE}[Post-Build]${NC} Gerando paginas estaticas para rotas..."
|
echo -e "${BLUE}[Post-Build]${NC} Gerando paginas estaticas para rotas..."
|
||||||
|
|
||||||
DIST_DIR="${1:-dist}"
|
DIST_DIR="${1:-dist}"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
|
||||||
if [ ! -d "$DIST_DIR" ]; then
|
if [ ! -d "$DIST_DIR" ]; then
|
||||||
@@ -73,6 +74,14 @@ ROUTES=(
|
|||||||
"suporte-ti-recrutamento-selecao"
|
"suporte-ti-recrutamento-selecao"
|
||||||
"privacidade"
|
"privacidade"
|
||||||
"termos"
|
"termos"
|
||||||
|
"ferramentas"
|
||||||
|
"ferramentas/spf-checker"
|
||||||
|
"ferramentas/dkim-checker"
|
||||||
|
"ferramentas/dmarc-checker"
|
||||||
|
"ferramentas/mx-lookup"
|
||||||
|
"ferramentas/ssl-checker"
|
||||||
|
"ferramentas/email-security-score"
|
||||||
|
"ferramentas/microsoft-365-analyzer"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Copiar index.html como base
|
# Copiar index.html como base
|
||||||
|
|||||||
@@ -47,6 +47,15 @@ const ROUTES = [
|
|||||||
{ path: '/suporte-ti-clinicas', title: 'TI para Clinicas - Avanzato Tecnologia', desc: 'Solucoes de TI para clinicas: odontologia, fisioterapia, medica, veterinaria. LGPD, prontuario digital, telemedicina.' },
|
{ path: '/suporte-ti-clinicas', title: 'TI para Clinicas - Avanzato Tecnologia', desc: 'Solucoes de TI para clinicas: odontologia, fisioterapia, medica, veterinaria. LGPD, prontuario digital, telemedicina.' },
|
||||||
{ path: '/suporte-ti-imobiliarias', title: 'TI para Imobiliarias - Avanzato Tecnologia', desc: 'Solucoes de TI para imobiliarias: sistemas de gestao, CRM, site de imoveis. Residencial, comercial, industrial.' },
|
{ path: '/suporte-ti-imobiliarias', title: 'TI para Imobiliarias - Avanzato Tecnologia', desc: 'Solucoes de TI para imobiliarias: sistemas de gestao, CRM, site de imoveis. Residencial, comercial, industrial.' },
|
||||||
{ path: '/tecnologias', title: 'Tecnologias que Trabalhamos - Avanzato Tecnologia', desc: 'Conheca as tecnologias que a Avanzato domina: Cisco, VMware, Microsoft, Linux, pfSense, Proxmox e muito mais.' },
|
{ path: '/tecnologias', title: 'Tecnologias que Trabalhamos - Avanzato Tecnologia', desc: 'Conheca as tecnologias que a Avanzato domina: Cisco, VMware, Microsoft, Linux, pfSense, Proxmox e muito mais.' },
|
||||||
|
// Avanzato Tools
|
||||||
|
{ path: '/ferramentas', title: 'Ferramentas Gratuitas de TI - Avanzato Tools', desc: 'Ferramentas gratuitas para diagnosticar seguranca de e-mail, SSL, Microsoft 365 e infraestrutura de TI. SPF Checker, DKIM Checker, DMARC Checker, SSL Checker e mais.' },
|
||||||
|
{ path: '/ferramentas/spf-checker', title: 'SPF Checker - Verifique sua Protecao de E-mail | Avanzato', desc: 'Verifique se o registro SPF do seu dominio esta configurado corretamente. Proteja contra spoofing e phishing. Ferramenta gratuita.' },
|
||||||
|
{ path: '/ferramentas/dkim-checker', title: 'DKIM Checker - Valide Assinatura Digital de E-mail | Avanzato', desc: 'Valide a assinatura digital DKIM do seu dominio. Garanta que seus e-mails sejam autenticados e nao vao para spam.' },
|
||||||
|
{ path: '/ferramentas/dmarc-checker', title: 'DMARC Checker - Analise sua Politica DMARC | Avanzato', desc: 'Analise a politica DMARC do seu dominio. Descubra se voce esta protegido contra phishing e spoofing de e-mail.' },
|
||||||
|
{ path: '/ferramentas/mx-lookup', title: 'MX Lookup - Consulte seus Servidores de E-mail | Avanzato', desc: 'Consulte os registros MX do seu dominio. Verifique a infraestrutura de recebimento de e-mails e o provedor.' },
|
||||||
|
{ path: '/ferramentas/ssl-checker', title: 'SSL Checker - Verifique seu Certificado SSL | Avanzato', desc: 'Verifique a validade e configuracao do certificado SSL do seu site. Garanta seguranca HTTPS para seus visitantes.' },
|
||||||
|
{ path: '/ferramentas/email-security-score', title: 'Email Security Score - Avaliacao Completa | Avanzato', desc: 'Avalie a seguranca completa do e-mail do seu dominio. Score de 0 a 100 com SPF, DKIM, DMARC, MX e recomendacoes.' },
|
||||||
|
{ path: '/ferramentas/microsoft-365-analyzer', title: 'Microsoft 365 Analyzer - Diagnostico M365 | Avanzato', desc: 'Analise a configuracao do Microsoft 365 do seu dominio. Descubra oportunidades de melhoria e seguranca.' },
|
||||||
];
|
];
|
||||||
|
|
||||||
// Conteudo HTML prerenderizado para cada tipo de pagina
|
// Conteudo HTML prerenderizado para cada tipo de pagina
|
||||||
@@ -125,6 +134,41 @@ function generateContent(route) {
|
|||||||
</ul>
|
</ul>
|
||||||
<div><a href="/contato">Falar com Especialista</a></div>
|
<div><a href="/contato">Falar com Especialista</a></div>
|
||||||
</article>`;
|
</article>`;
|
||||||
|
} else if (route.path === '/ferramentas') {
|
||||||
|
content = `
|
||||||
|
<article>
|
||||||
|
<h1>Avanzato Tools - Ferramentas Gratuitas de TI</h1>
|
||||||
|
<p>Ferramentas gratuitas de diagnostico tecnico para empresas. Verifique a seguranca do seu e-mail, SSL, Microsoft 365 e infraestrutura de TI.</p>
|
||||||
|
<h2>Ferramentas Disponiveis</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/ferramentas/spf-checker">SPF Checker</a> - Verifique sua protecao contra spoofing</li>
|
||||||
|
<li><a href="/ferramentas/dkim-checker">DKIM Checker</a> - Valide assinatura digital de e-mail</li>
|
||||||
|
<li><a href="/ferramentas/dmarc-checker">DMARC Checker</a> - Analise sua politica anti-phishing</li>
|
||||||
|
<li><a href="/ferramentas/mx-lookup">MX Lookup</a> - Consulte servidores de e-mail</li>
|
||||||
|
<li><a href="/ferramentas/ssl-checker">SSL Checker</a> - Verifique certificado SSL</li>
|
||||||
|
<li><a href="/ferramentas/email-security-score">Email Security Score</a> - Avaliacao completa</li>
|
||||||
|
<li><a href="/ferramentas/microsoft-365-analyzer">Microsoft 365 Analyzer</a> - Diagnostico M365</li>
|
||||||
|
</ul>
|
||||||
|
<p>2 consultas gratuitas por ferramenta. Cadastro rapido para consultas ilimitadas.</p>
|
||||||
|
<div><a href="/avaliacao">Avaliacao Gratuita de TI</a> <a href="/contato">Falar com Especialista</a></div>
|
||||||
|
</article>`;
|
||||||
|
} else if (route.path.startsWith('/ferramentas/')) {
|
||||||
|
const toolName = route.title.split(' - ')[0];
|
||||||
|
content = `
|
||||||
|
<article>
|
||||||
|
<h1>${toolName}</h1>
|
||||||
|
<p>${route.desc}</p>
|
||||||
|
<h2>Como usar</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Digite o dominio que deseja verificar (ex: avanzato.com.br)</li>
|
||||||
|
<li>Clique em "Verificar"</li>
|
||||||
|
<li>Receba o resultado em segundos com recomendacoes</li>
|
||||||
|
</ol>
|
||||||
|
<h2>Perguntas Frequentes</h2>
|
||||||
|
<p><strong>Preciso cadastrar?</strong> Nao nas primeiras 2 consultas. Apos isso, cadastro rapido gratuito.</p>
|
||||||
|
<p><strong>Os resultados sao confiaveis?</strong> Sim, consultamos servidores DNS publicos em tempo real.</p>
|
||||||
|
<div><a href="/ferramentas">Ver todas as ferramentas</a> <a href="/avaliacao">Avaliacao Gratuita</a></div>
|
||||||
|
</article>`;
|
||||||
} else if (route.path === '/cases') {
|
} else if (route.path === '/cases') {
|
||||||
content = `
|
content = `
|
||||||
<article>
|
<article>
|
||||||
|
|||||||
+161
-130
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState, lazy, Suspense } from 'react';
|
||||||
import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom';
|
import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom';
|
||||||
import { gsap } from 'gsap';
|
import { gsap } from 'gsap';
|
||||||
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
||||||
@@ -8,68 +8,80 @@ import WhatsAppWidget from './components/WhatsAppWidget';
|
|||||||
import CookieConsent from './components/CookieConsent';
|
import CookieConsent from './components/CookieConsent';
|
||||||
import HomologationBanner from './components/HomologationBanner';
|
import HomologationBanner from './components/HomologationBanner';
|
||||||
|
|
||||||
// Páginas
|
// Página inicial carrega direto (mais acessada)
|
||||||
import Home from './pages/Home';
|
import Home from './pages/Home';
|
||||||
import Sobre from './pages/Sobre';
|
|
||||||
import Blog from './pages/Blog';
|
|
||||||
import BlogPost from './pages/BlogPost';
|
|
||||||
import Cases from './pages/Cases';
|
|
||||||
import Contato from './pages/Contato';
|
|
||||||
import Privacidade from './pages/Privacidade';
|
|
||||||
import Termos from './pages/Termos';
|
|
||||||
import NotFound from './pages/NotFound';
|
import NotFound from './pages/NotFound';
|
||||||
|
|
||||||
|
// Todas as outras páginas com lazy loading para reduzir bundle inicial
|
||||||
|
const Sobre = lazy(() => import('./pages/Sobre'));
|
||||||
|
const Blog = lazy(() => import('./pages/Blog'));
|
||||||
|
const BlogPost = lazy(() => import('./pages/BlogPost'));
|
||||||
|
const Cases = lazy(() => import('./pages/Cases'));
|
||||||
|
const Contato = lazy(() => import('./pages/Contato'));
|
||||||
|
const Privacidade = lazy(() => import('./pages/Privacidade'));
|
||||||
|
const Termos = lazy(() => import('./pages/Termos'));
|
||||||
|
|
||||||
// Páginas de Serviços
|
// Páginas de Serviços
|
||||||
import TiGerenciada from './pages/services/TiGerenciada';
|
const TiGerenciada = lazy(() => import('./pages/services/TiGerenciada'));
|
||||||
import CloudComputing from './pages/services/CloudComputing';
|
const CloudComputing = lazy(() => import('./pages/services/CloudComputing'));
|
||||||
import Seguranca from './pages/services/Seguranca';
|
const Seguranca = lazy(() => import('./pages/services/Seguranca'));
|
||||||
import Suporte from './pages/services/Suporte';
|
const Suporte = lazy(() => import('./pages/services/Suporte'));
|
||||||
import Redes from './pages/services/Redes';
|
const Redes = lazy(() => import('./pages/services/Redes'));
|
||||||
import Pabx from './pages/services/Pabx';
|
const Pabx = lazy(() => import('./pages/services/Pabx'));
|
||||||
import Backup from './pages/services/Backup';
|
const Backup = lazy(() => import('./pages/services/Backup'));
|
||||||
import Servidores from './pages/services/Servidores';
|
const Servidores = lazy(() => import('./pages/services/Servidores'));
|
||||||
import Consultoria from './pages/services/Consultoria';
|
const Consultoria = lazy(() => import('./pages/services/Consultoria'));
|
||||||
import Noc from './pages/services/Noc';
|
const Noc = lazy(() => import('./pages/services/Noc'));
|
||||||
|
|
||||||
// Páginas de Tecnologias (SEO)
|
// Páginas de Tecnologias (SEO)
|
||||||
import Tecnologias from './pages/Tecnologias';
|
const Tecnologias = lazy(() => import('./pages/Tecnologias'));
|
||||||
import WindowsServer from './pages/tech/WindowsServer';
|
const WindowsServer = lazy(() => import('./pages/tech/WindowsServer'));
|
||||||
import Linux from './pages/tech/Linux';
|
const Linux = lazy(() => import('./pages/tech/Linux'));
|
||||||
import PfSense from './pages/tech/PfSense';
|
const PfSense = lazy(() => import('./pages/tech/PfSense'));
|
||||||
import Proxmox from './pages/tech/Proxmox';
|
const Proxmox = lazy(() => import('./pages/tech/Proxmox'));
|
||||||
import Vmware from './pages/tech/Vmware';
|
const Vmware = lazy(() => import('./pages/tech/Vmware'));
|
||||||
import Sharepoint from './pages/tech/Sharepoint';
|
const Sharepoint = lazy(() => import('./pages/tech/Sharepoint'));
|
||||||
import Cisco from './pages/tech/Cisco';
|
const Cisco = lazy(() => import('./pages/tech/Cisco'));
|
||||||
|
|
||||||
// Avaliador de Maturidade Tecnológica
|
// Avaliador de Maturidade Tecnológica
|
||||||
import Avaliador from './pages/Avaliador';
|
const Avaliador = lazy(() => import('./pages/Avaliador'));
|
||||||
import Condominios from './pages/Condominios';
|
const Condominios = lazy(() => import('./pages/Condominios'));
|
||||||
|
|
||||||
// Landing Pages por Nicho
|
// Landing Pages por Nicho
|
||||||
import Contabilidade from './pages/nichos/Contabilidade';
|
const Contabilidade = lazy(() => import('./pages/nichos/Contabilidade'));
|
||||||
import Advocacia from './pages/nichos/Advocacia';
|
const Advocacia = lazy(() => import('./pages/nichos/Advocacia'));
|
||||||
import Monitoramento from './pages/nichos/Monitoramento';
|
const Monitoramento = lazy(() => import('./pages/nichos/Monitoramento'));
|
||||||
import FirewallPfSense from './pages/nichos/FirewallPfSense';
|
const FirewallPfSense = lazy(() => import('./pages/nichos/FirewallPfSense'));
|
||||||
import BackupCorporativo from './pages/nichos/BackupCorporativo';
|
const BackupCorporativo = lazy(() => import('./pages/nichos/BackupCorporativo'));
|
||||||
import VoipEmpresarial from './pages/nichos/VoipEmpresarial';
|
const VoipEmpresarial = lazy(() => import('./pages/nichos/VoipEmpresarial'));
|
||||||
|
|
||||||
// SEO Local - Onde Atuamos
|
// SEO Local - Onde Atuamos
|
||||||
import OndeAtuamos from './pages/OndeAtuamos';
|
const OndeAtuamos = lazy(() => import('./pages/OndeAtuamos'));
|
||||||
import LocalGuarulhos from './pages/local-guarulhos';
|
const LocalGuarulhos = lazy(() => import('./pages/local-guarulhos'));
|
||||||
import LocalMogi from './pages/local-mogi-das-cruzes';
|
const LocalMogi = lazy(() => import('./pages/local-mogi-das-cruzes'));
|
||||||
import LocalIpiranga from './pages/local-ipiranga';
|
const LocalIpiranga = lazy(() => import('./pages/local-ipiranga'));
|
||||||
import LocalVilaFormosa from './pages/local-vila-formosa';
|
const LocalVilaFormosa = lazy(() => import('./pages/local-vila-formosa'));
|
||||||
import LocalCerqueiraCesar from './pages/local-cerqueira-cesar';
|
const LocalCerqueiraCesar = lazy(() => import('./pages/local-cerqueira-cesar'));
|
||||||
import LocalSantana from './pages/local-santana';
|
const LocalSantana = lazy(() => import('./pages/local-santana'));
|
||||||
import LocalBras from './pages/local-bras';
|
const LocalBras = lazy(() => import('./pages/local-bras'));
|
||||||
import LocalRibeiraoPreto from './pages/local-ribeirao-preto';
|
const LocalRibeiraoPreto = lazy(() => import('./pages/local-ribeirao-preto'));
|
||||||
|
|
||||||
// Nichos adicionais
|
// Nichos adicionais
|
||||||
import NichoIndustria from './pages/nicho-industria';
|
const NichoIndustria = lazy(() => import('./pages/nicho-industria'));
|
||||||
import NichoPortaria from './pages/nicho-portaria-remota';
|
const NichoPortaria = lazy(() => import('./pages/nicho-portaria-remota'));
|
||||||
import NichoClinicas from './pages/nicho-clinicas';
|
const NichoClinicas = lazy(() => import('./pages/nicho-clinicas'));
|
||||||
import NichoImobiliarias from './pages/nicho-imobiliarias';
|
const NichoImobiliarias = lazy(() => import('./pages/nicho-imobiliarias'));
|
||||||
import NichoRecrutamento from './pages/nicho-recrutamento-selecao';
|
const NichoRecrutamento = lazy(() => import('./pages/nicho-recrutamento-selecao'));
|
||||||
|
|
||||||
|
// Avanzato Tools
|
||||||
|
const Ferramentas = lazy(() => import('./pages/ferramentas'));
|
||||||
|
const SpfChecker = lazy(() => import('./pages/ferramentas/SpfChecker'));
|
||||||
|
const DkimChecker = lazy(() => import('./pages/ferramentas/DkimChecker'));
|
||||||
|
const DmarcChecker = lazy(() => import('./pages/ferramentas/DmarcChecker'));
|
||||||
|
const MxLookup = lazy(() => import('./pages/ferramentas/MxLookup'));
|
||||||
|
const SslChecker = lazy(() => import('./pages/ferramentas/SslChecker'));
|
||||||
|
const EmailSecurityScore = lazy(() => import('./pages/ferramentas/EmailSecurityScore'));
|
||||||
|
const Microsoft365Analyzer = lazy(() => import('./pages/ferramentas/Microsoft365Analyzer'));
|
||||||
|
|
||||||
import './App.css';
|
import './App.css';
|
||||||
|
|
||||||
@@ -78,20 +90,20 @@ gsap.registerPlugin(ScrollTrigger);
|
|||||||
// Componente para scroll ao topo ao mudar de página
|
// Componente para scroll ao topo ao mudar de página
|
||||||
function ScrollToTop() {
|
function ScrollToTop() {
|
||||||
const { pathname } = useLocation();
|
const { pathname } = useLocation();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
// Refresh ScrollTrigger ao mudar de página
|
// Refresh ScrollTrigger ao mudar de página
|
||||||
ScrollTrigger.refresh();
|
ScrollTrigger.refresh();
|
||||||
}, [pathname]);
|
}, [pathname]);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Componente de Progress Bar
|
// Componente de Progress Bar
|
||||||
function ProgressBar() {
|
function ProgressBar() {
|
||||||
const [scrollProgress, setScrollProgress] = useState(0);
|
const [scrollProgress, setScrollProgress] = useState(0);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleScroll = () => {
|
const handleScroll = () => {
|
||||||
const scrollTop = window.scrollY;
|
const scrollTop = window.scrollY;
|
||||||
@@ -103,7 +115,7 @@ function ProgressBar() {
|
|||||||
window.addEventListener('scroll', handleScroll, { passive: true });
|
window.addEventListener('scroll', handleScroll, { passive: true });
|
||||||
return () => window.removeEventListener('scroll', handleScroll);
|
return () => window.removeEventListener('scroll', handleScroll);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="progress-bar"
|
className="progress-bar"
|
||||||
@@ -112,6 +124,13 @@ function ProgressBar() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Loading simples para lazy load
|
||||||
|
const PageLoader = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] flex items-center justify-center">
|
||||||
|
<div className="w-8 h-8 border-2 border-[#cbf400] border-t-transparent rounded-full animate-spin" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<Router>
|
<Router>
|
||||||
@@ -119,88 +138,100 @@ function App() {
|
|||||||
<div className="relative bg-[#0e0e0e] min-h-screen">
|
<div className="relative bg-[#0e0e0e] min-h-screen">
|
||||||
<ProgressBar />
|
<ProgressBar />
|
||||||
<Navigation />
|
<Navigation />
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<Routes>
|
<Suspense fallback={<PageLoader />}>
|
||||||
{/* Página Inicial */}
|
<Routes>
|
||||||
<Route path="/" element={<Home />} />
|
{/* Página Inicial - carrega direto */}
|
||||||
|
<Route path="/" element={<Home />} />
|
||||||
{/* Sobre */}
|
|
||||||
<Route path="/sobre" element={<Sobre />} />
|
|
||||||
|
|
||||||
{/* Serviços */}
|
|
||||||
<Route path="/servicos/ti-gerenciada" element={<TiGerenciada />} />
|
|
||||||
<Route path="/servicos/cloud-computing" element={<CloudComputing />} />
|
|
||||||
<Route path="/servicos/seguranca" element={<Seguranca />} />
|
|
||||||
<Route path="/servicos/suporte" element={<Suporte />} />
|
|
||||||
<Route path="/servicos/redes" element={<Redes />} />
|
|
||||||
<Route path="/servicos/pabx" element={<Pabx />} />
|
|
||||||
<Route path="/servicos/backup" element={<Backup />} />
|
|
||||||
<Route path="/servicos/servidores" element={<Servidores />} />
|
|
||||||
<Route path="/servicos/consultoria" element={<Consultoria />} />
|
|
||||||
<Route path="/servicos/noc" element={<Noc />} />
|
|
||||||
|
|
||||||
{/* Blog */}
|
|
||||||
<Route path="/blog" element={<Blog />} />
|
|
||||||
<Route path="/blog/:slug" element={<BlogPost />} />
|
|
||||||
|
|
||||||
{/* Cases */}
|
|
||||||
<Route path="/cases" element={<Cases />} />
|
|
||||||
|
|
||||||
{/* Tecnologias (SEO) */}
|
|
||||||
<Route path="/tecnologias" element={<Tecnologias />} />
|
|
||||||
<Route path="/suporte-windows-server" element={<WindowsServer />} />
|
|
||||||
<Route path="/suporte-linux-empresas" element={<Linux />} />
|
|
||||||
<Route path="/suporte-pfsense" element={<PfSense />} />
|
|
||||||
<Route path="/suporte-proxmox" element={<Proxmox />} />
|
|
||||||
<Route path="/suporte-vmware" element={<Vmware />} />
|
|
||||||
<Route path="/suporte-sharepoint" element={<Sharepoint />} />
|
|
||||||
<Route path="/suporte-redes-cisco" element={<Cisco />} />
|
|
||||||
|
|
||||||
{/* Avaliador de Maturidade */}
|
|
||||||
<Route path="/avaliacao" element={<Avaliador />} />
|
|
||||||
|
|
||||||
{/* Tecnologia para Condomínios */}
|
|
||||||
<Route path="/tecnologia-para-condominios" element={<Condominios />} />
|
|
||||||
|
|
||||||
{/* Landing Pages por Nicho */}
|
|
||||||
<Route path="/ti-para-contabilidades" element={<Contabilidade />} />
|
|
||||||
<Route path="/ti-para-advocacias" element={<Advocacia />} />
|
|
||||||
<Route path="/monitoramento-empresarial" element={<Monitoramento />} />
|
|
||||||
<Route path="/firewall-pfsense-empresarial" element={<FirewallPfSense />} />
|
|
||||||
<Route path="/backup-corporativo" element={<BackupCorporativo />} />
|
|
||||||
<Route path="/voip-empresarial" element={<VoipEmpresarial />} />
|
|
||||||
|
|
||||||
{/* SEO Local - Onde Atuamos */}
|
{/* Sobre */}
|
||||||
<Route path="/onde-atuamos" element={<OndeAtuamos />} />
|
<Route path="/sobre" element={<Sobre />} />
|
||||||
<Route path="/suporte-ti-guarulhos" element={<LocalGuarulhos />} />
|
|
||||||
<Route path="/suporte-ti-mogi-das-cruzes" element={<LocalMogi />} />
|
|
||||||
<Route path="/suporte-ti-ipiranga" element={<LocalIpiranga />} />
|
|
||||||
<Route path="/suporte-ti-vila-formosa" element={<LocalVilaFormosa />} />
|
|
||||||
<Route path="/suporte-ti-cerqueira-cesar" element={<LocalCerqueiraCesar />} />
|
|
||||||
<Route path="/suporte-ti-santana" element={<LocalSantana />} />
|
|
||||||
<Route path="/suporte-ti-bras" element={<LocalBras />} />
|
|
||||||
<Route path="/suporte-ti-ribeirao-preto" element={<LocalRibeiraoPreto />} />
|
|
||||||
|
|
||||||
{/* Nichos adicionais */}
|
{/* Serviços */}
|
||||||
<Route path="/suporte-ti-industria" element={<NichoIndustria />} />
|
<Route path="/servicos/ti-gerenciada" element={<TiGerenciada />} />
|
||||||
<Route path="/suporte-ti-portaria-remota" element={<NichoPortaria />} />
|
<Route path="/servicos/cloud-computing" element={<CloudComputing />} />
|
||||||
<Route path="/suporte-ti-clinicas" element={<NichoClinicas />} />
|
<Route path="/servicos/seguranca" element={<Seguranca />} />
|
||||||
<Route path="/suporte-ti-imobiliarias" element={<NichoImobiliarias />} />
|
<Route path="/servicos/suporte" element={<Suporte />} />
|
||||||
<Route path="/suporte-ti-recrutamento-selecao" element={<NichoRecrutamento />} />
|
<Route path="/servicos/redes" element={<Redes />} />
|
||||||
|
<Route path="/servicos/pabx" element={<Pabx />} />
|
||||||
|
<Route path="/servicos/backup" element={<Backup />} />
|
||||||
|
<Route path="/servicos/servidores" element={<Servidores />} />
|
||||||
|
<Route path="/servicos/consultoria" element={<Consultoria />} />
|
||||||
|
<Route path="/servicos/noc" element={<Noc />} />
|
||||||
|
|
||||||
{/* Contato */}
|
{/* Blog */}
|
||||||
<Route path="/contato" element={<Contato />} />
|
<Route path="/blog" element={<Blog />} />
|
||||||
|
<Route path="/blog/:slug" element={<BlogPost />} />
|
||||||
{/* Páginas Legais */}
|
|
||||||
<Route path="/privacidade" element={<Privacidade />} />
|
{/* Cases */}
|
||||||
<Route path="/termos" element={<Termos />} />
|
<Route path="/cases" element={<Cases />} />
|
||||||
|
|
||||||
{/* 404 */}
|
{/* Tecnologias (SEO) */}
|
||||||
<Route path="*" element={<NotFound />} />
|
<Route path="/tecnologias" element={<Tecnologias />} />
|
||||||
</Routes>
|
<Route path="/suporte-windows-server" element={<WindowsServer />} />
|
||||||
|
<Route path="/suporte-linux-empresas" element={<Linux />} />
|
||||||
|
<Route path="/suporte-pfsense" element={<PfSense />} />
|
||||||
|
<Route path="/suporte-proxmox" element={<Proxmox />} />
|
||||||
|
<Route path="/suporte-vmware" element={<Vmware />} />
|
||||||
|
<Route path="/suporte-sharepoint" element={<Sharepoint />} />
|
||||||
|
<Route path="/suporte-redes-cisco" element={<Cisco />} />
|
||||||
|
|
||||||
|
{/* Avaliador de Maturidade */}
|
||||||
|
<Route path="/avaliacao" element={<Avaliador />} />
|
||||||
|
|
||||||
|
{/* Tecnologia para Condomínios */}
|
||||||
|
<Route path="/tecnologia-para-condominios" element={<Condominios />} />
|
||||||
|
|
||||||
|
{/* Landing Pages por Nicho */}
|
||||||
|
<Route path="/ti-para-contabilidades" element={<Contabilidade />} />
|
||||||
|
<Route path="/ti-para-advocacias" element={<Advocacia />} />
|
||||||
|
<Route path="/monitoramento-empresarial" element={<Monitoramento />} />
|
||||||
|
<Route path="/firewall-pfsense-empresarial" element={<FirewallPfSense />} />
|
||||||
|
<Route path="/backup-corporativo" element={<BackupCorporativo />} />
|
||||||
|
<Route path="/voip-empresarial" element={<VoipEmpresarial />} />
|
||||||
|
|
||||||
|
{/* SEO Local - Onde Atuamos */}
|
||||||
|
<Route path="/onde-atuamos" element={<OndeAtuamos />} />
|
||||||
|
<Route path="/suporte-ti-guarulhos" element={<LocalGuarulhos />} />
|
||||||
|
<Route path="/suporte-ti-mogi-das-cruzes" element={<LocalMogi />} />
|
||||||
|
<Route path="/suporte-ti-ipiranga" element={<LocalIpiranga />} />
|
||||||
|
<Route path="/suporte-ti-vila-formosa" element={<LocalVilaFormosa />} />
|
||||||
|
<Route path="/suporte-ti-cerqueira-cesar" element={<LocalCerqueiraCesar />} />
|
||||||
|
<Route path="/suporte-ti-santana" element={<LocalSantana />} />
|
||||||
|
<Route path="/suporte-ti-bras" element={<LocalBras />} />
|
||||||
|
<Route path="/suporte-ti-ribeirao-preto" element={<LocalRibeiraoPreto />} />
|
||||||
|
|
||||||
|
{/* Nichos adicionais */}
|
||||||
|
<Route path="/suporte-ti-industria" element={<NichoIndustria />} />
|
||||||
|
<Route path="/suporte-ti-portaria-remota" element={<NichoPortaria />} />
|
||||||
|
<Route path="/suporte-ti-clinicas" element={<NichoClinicas />} />
|
||||||
|
<Route path="/suporte-ti-imobiliarias" element={<NichoImobiliarias />} />
|
||||||
|
<Route path="/suporte-ti-recrutamento-selecao" element={<NichoRecrutamento />} />
|
||||||
|
|
||||||
|
{/* Contato */}
|
||||||
|
<Route path="/contato" element={<Contato />} />
|
||||||
|
|
||||||
|
{/* Páginas Legais */}
|
||||||
|
<Route path="/privacidade" element={<Privacidade />} />
|
||||||
|
<Route path="/termos" element={<Termos />} />
|
||||||
|
|
||||||
|
{/* Avanzato Tools */}
|
||||||
|
<Route path="/ferramentas" element={<Ferramentas />} />
|
||||||
|
<Route path="/ferramentas/spf-checker" element={<SpfChecker />} />
|
||||||
|
<Route path="/ferramentas/dkim-checker" element={<DkimChecker />} />
|
||||||
|
<Route path="/ferramentas/dmarc-checker" element={<DmarcChecker />} />
|
||||||
|
<Route path="/ferramentas/mx-lookup" element={<MxLookup />} />
|
||||||
|
<Route path="/ferramentas/ssl-checker" element={<SslChecker />} />
|
||||||
|
<Route path="/ferramentas/email-security-score" element={<EmailSecurityScore />} />
|
||||||
|
<Route path="/ferramentas/microsoft-365-analyzer" element={<Microsoft365Analyzer />} />
|
||||||
|
|
||||||
|
{/* 404 */}
|
||||||
|
<Route path="*" element={<NotFound />} />
|
||||||
|
</Routes>
|
||||||
|
</Suspense>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<Footer />
|
<Footer />
|
||||||
<WhatsAppWidget />
|
<WhatsAppWidget />
|
||||||
<CookieConsent />
|
<CookieConsent />
|
||||||
|
|||||||
@@ -0,0 +1,368 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { ArrowLeft, ArrowRight, CheckCircle, AlertTriangle, XCircle, Info, Loader2 } from 'lucide-react';
|
||||||
|
|
||||||
|
export interface ResultadoFerramenta {
|
||||||
|
status: 'success' | 'warning' | 'error' | 'info';
|
||||||
|
titulo: string;
|
||||||
|
mensagem: string;
|
||||||
|
detalhes?: Record<string, string>;
|
||||||
|
recomendacoes?: string[];
|
||||||
|
score?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FerramentaLayoutProps {
|
||||||
|
nome: string;
|
||||||
|
descricao: string;
|
||||||
|
icone: React.ReactNode;
|
||||||
|
placeholder: string;
|
||||||
|
explicacao: string;
|
||||||
|
comoFunciona: string[];
|
||||||
|
perguntasUteis: { q: string; a: string }[];
|
||||||
|
onConsultar: (dominio: string) => Promise<ResultadoFerramenta>;
|
||||||
|
schema?: Record<string, any>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const contagemKey = (slug: string) => `avanzato-tools-count-${slug}`;
|
||||||
|
const cadastroKey = 'avanzato-tools-cadastro';
|
||||||
|
|
||||||
|
const FerramentaLayout = ({
|
||||||
|
nome,
|
||||||
|
descricao,
|
||||||
|
icone,
|
||||||
|
placeholder,
|
||||||
|
explicacao,
|
||||||
|
comoFunciona,
|
||||||
|
perguntasUteis,
|
||||||
|
onConsultar,
|
||||||
|
}: FerramentaLayoutProps) => {
|
||||||
|
const [dominio, setDominio] = useState('');
|
||||||
|
const [resultado, setResultado] = useState<ResultadoFerramenta | null>(null);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [erro, setErro] = useState('');
|
||||||
|
const [mostrarCadastro, setMostrarCadastro] = useState(false);
|
||||||
|
const [cadastrado, setCadastrado] = useState(false);
|
||||||
|
const [consultas, setConsultas] = useState(() => {
|
||||||
|
const slug = window.location.pathname.split('/').pop() || '';
|
||||||
|
return parseInt(localStorage.getItem(contagemKey(slug)) || '0', 10);
|
||||||
|
});
|
||||||
|
const [feedbackUtil, setFeedbackUtil] = useState<'sim' | 'nao' | null>(null);
|
||||||
|
const [feedbackTexto, setFeedbackTexto] = useState('');
|
||||||
|
const [mostrarDor, setMostrarDor] = useState(false);
|
||||||
|
const [dorTI, setDorTI] = useState('');
|
||||||
|
const [urgencia, setUrgencia] = useState('');
|
||||||
|
|
||||||
|
const slug = window.location.pathname.split('/').pop() || '';
|
||||||
|
|
||||||
|
const podeConsultar = () => {
|
||||||
|
if (cadastrado) return true;
|
||||||
|
if (consultas < 2) return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleConsultar = async () => {
|
||||||
|
if (!dominio.trim()) {
|
||||||
|
setErro('Digite um dominio valido (ex: avanzato.com.br)');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!podeConsultar()) {
|
||||||
|
setMostrarCadastro(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setErro('');
|
||||||
|
setLoading(true);
|
||||||
|
setResultado(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await onConsultar(dominio.trim());
|
||||||
|
setResultado(res);
|
||||||
|
|
||||||
|
// Incrementar contagem
|
||||||
|
const novaContagem = consultas + 1;
|
||||||
|
setConsultas(novaContagem);
|
||||||
|
localStorage.setItem(contagemKey(slug), String(novaContagem));
|
||||||
|
|
||||||
|
// Se atingiu limite, mostrar cadastro
|
||||||
|
if (novaContagem >= 2 && !cadastrado) {
|
||||||
|
setTimeout(() => setMostrarDor(true), 2000);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
setErro('Erro ao consultar. Verifique o dominio e tente novamente.');
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleCadastro = (e: React.FormEvent) => {
|
||||||
|
e.preventDefault();
|
||||||
|
setCadastrado(true);
|
||||||
|
localStorage.setItem(cadastroKey, 'true');
|
||||||
|
setMostrarCadastro(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const statusIcon = (status: string) => {
|
||||||
|
switch (status) {
|
||||||
|
case 'success': return <CheckCircle className="w-8 h-8 text-green-400" />;
|
||||||
|
case 'warning': return <AlertTriangle className="w-8 h-8 text-yellow-400" />;
|
||||||
|
case 'error': return <XCircle className="w-8 h-8 text-red-400" />;
|
||||||
|
default: return <Info className="w-8 h-8 text-blue-400" />;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const doresTI = [
|
||||||
|
'Seguranca da informacao',
|
||||||
|
'Backup',
|
||||||
|
'Microsoft 365',
|
||||||
|
'Firewall',
|
||||||
|
'Servidores',
|
||||||
|
'Lentidao da rede',
|
||||||
|
'VPN / Home Office',
|
||||||
|
'Suporte aos usuarios',
|
||||||
|
'Custos de TI',
|
||||||
|
'LGPD',
|
||||||
|
'Ransomware',
|
||||||
|
'Outro',
|
||||||
|
];
|
||||||
|
|
||||||
|
const urgencias = [
|
||||||
|
'Apenas pesquisando',
|
||||||
|
'Quero melhorar nos proximos meses',
|
||||||
|
'Preciso resolver este mes',
|
||||||
|
'Preciso resolver imediatamente',
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="max-w-4xl mx-auto">
|
||||||
|
{/* Header */}
|
||||||
|
<div className="mb-8">
|
||||||
|
<Link to="/ferramentas" className="inline-flex items-center gap-2 text-gray-400 hover:text-[#cbf400] transition-colors mb-4">
|
||||||
|
<ArrowLeft className="w-4 h-4" />
|
||||||
|
Todas as ferramentas
|
||||||
|
</Link>
|
||||||
|
<div className="flex items-center gap-4 mb-4">
|
||||||
|
<div className="p-3 bg-[#cbf400]/10 rounded-xl text-[#cbf400]">{icone}</div>
|
||||||
|
<div>
|
||||||
|
<h1 className="text-3xl font-bold text-white">{nome}</h1>
|
||||||
|
<p className="text-gray-300">{descricao}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Formulario */}
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#2a2a2a] mb-8">
|
||||||
|
<div className="flex gap-4">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={dominio}
|
||||||
|
onChange={(e) => setDominio(e.target.value)}
|
||||||
|
onKeyDown={(e) => e.key === 'Enter' && handleConsultar()}
|
||||||
|
placeholder={placeholder}
|
||||||
|
className="flex-1 bg-[#0e0e0e] border border-[#2a2a2a] rounded-xl px-4 py-3 text-white placeholder-gray-500 focus:border-[#cbf400] focus:outline-none"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
onClick={handleConsultar}
|
||||||
|
disabled={loading}
|
||||||
|
className="bg-[#cbf400] text-[#0e0e0e] px-6 py-3 rounded-xl font-semibold hover:bg-[#b8e000] transition-colors disabled:opacity-50 flex items-center gap-2"
|
||||||
|
>
|
||||||
|
{loading && <Loader2 className="w-4 h-4 animate-spin" />}
|
||||||
|
{loading ? 'Analisando...' : 'Verificar'}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{erro && <p className="text-red-400 mt-3 text-sm">{erro}</p>}
|
||||||
|
|
||||||
|
{!cadastrado && consultas >= 2 && (
|
||||||
|
<p className="text-yellow-400 mt-3 text-sm">
|
||||||
|
Voce usou {consultas} consultas. <button onClick={() => setMostrarCadastro(true)} className="underline hover:text-[#cbf400]">Cadastre-se gratuitamente</button> para consultas ilimitadas.
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Resultado */}
|
||||||
|
{resultado && (
|
||||||
|
<div className={`bg-[#1a1a1a] rounded-2xl p-6 border mb-8 ${
|
||||||
|
resultado.status === 'success' ? 'border-green-500/30' :
|
||||||
|
resultado.status === 'warning' ? 'border-yellow-500/30' :
|
||||||
|
resultado.status === 'error' ? 'border-red-500/30' : 'border-blue-500/30'
|
||||||
|
}`}>
|
||||||
|
<div className="flex items-center gap-4 mb-4">
|
||||||
|
{statusIcon(resultado.status)}
|
||||||
|
<div>
|
||||||
|
<h2 className="text-xl font-semibold text-white">{resultado.titulo}</h2>
|
||||||
|
{resultado.score !== undefined && (
|
||||||
|
<div className="flex items-center gap-2 mt-1">
|
||||||
|
<div className="w-32 h-2 bg-gray-700 rounded-full overflow-hidden">
|
||||||
|
<div
|
||||||
|
className={`h-full rounded-full ${
|
||||||
|
resultado.score >= 80 ? 'bg-green-400' :
|
||||||
|
resultado.score >= 50 ? 'bg-yellow-400' : 'bg-red-400'
|
||||||
|
}`}
|
||||||
|
style={{ width: `${resultado.score}%` }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<span className="text-sm font-medium text-white">{resultado.score}/100</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p className="text-gray-300 mb-4">{resultado.mensagem}</p>
|
||||||
|
|
||||||
|
{resultado.detalhes && Object.entries(resultado.detalhes).length > 0 && (
|
||||||
|
<div className="bg-[#0e0e0e] rounded-xl p-4 mb-4">
|
||||||
|
{Object.entries(resultado.detalhes).map(([key, value]) => (
|
||||||
|
<div key={key} className="flex justify-between py-2 border-b border-[#2a2a2a] last:border-0">
|
||||||
|
<span className="text-gray-400">{key}</span>
|
||||||
|
<span className="text-white font-mono text-sm">{value}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{resultado.recomendacoes && resultado.recomendacoes.length > 0 && (
|
||||||
|
<div>
|
||||||
|
<h3 className="text-sm font-semibold text-[#cbf400] mb-2">Recomendacoes</h3>
|
||||||
|
<ul className="space-y-2">
|
||||||
|
{resultado.recomendacoes.map((r, i) => (
|
||||||
|
<li key={i} className="flex items-start gap-2 text-gray-300 text-sm">
|
||||||
|
<CheckCircle className="w-4 h-4 text-[#cbf400] mt-0.5 shrink-0" />
|
||||||
|
{r}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Cadastro */}
|
||||||
|
{mostrarCadastro && !cadastrado && (
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#cbf400]/30 mb-8">
|
||||||
|
<h2 className="text-xl font-semibold text-white mb-2">Cadastro Rapido Gratuito</h2>
|
||||||
|
<p className="text-gray-300 text-sm mb-4">
|
||||||
|
Voce ja usou 2 consultas gratuitas. Cadastre-se para consultas ilimitadas e relatorios completos.
|
||||||
|
</p>
|
||||||
|
<form onSubmit={handleCadastro} className="space-y-3">
|
||||||
|
<input type="text" placeholder="Nome" required className="w-full bg-[#0e0e0e] border border-[#2a2a2a] rounded-xl px-4 py-3 text-white placeholder-gray-500 focus:border-[#cbf400] focus:outline-none" />
|
||||||
|
<input type="email" placeholder="E-mail corporativo" required className="w-full bg-[#0e0e0e] border border-[#2a2a2a] rounded-xl px-4 py-3 text-white placeholder-gray-500 focus:border-[#cbf400] focus:outline-none" />
|
||||||
|
<input type="text" placeholder="Empresa" required className="w-full bg-[#0e0e0e] border border-[#2a2a2a] rounded-xl px-4 py-3 text-white placeholder-gray-500 focus:border-[#cbf400] focus:outline-none" />
|
||||||
|
<p className="text-gray-500 text-xs">
|
||||||
|
Autorizo a Avanzato Tecnologia a enviar conteudos tecnicos, diagnosticos e informacoes sobre solucoes de TI, seguranca e Microsoft 365.
|
||||||
|
</p>
|
||||||
|
<button type="submit" className="bg-[#cbf400] text-[#0e0e0e] px-6 py-3 rounded-xl font-semibold hover:bg-[#b8e000] transition-colors">
|
||||||
|
Cadastrar e Continuar
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Dor de TI */}
|
||||||
|
{mostrarDor && !cadastrado && (
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-6 border border-yellow-500/30 mb-8">
|
||||||
|
<h2 className="text-lg font-semibold text-white mb-4">Qual e hoje sua maior dor em TI?</h2>
|
||||||
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-2 mb-4">
|
||||||
|
{doresTI.map(d => (
|
||||||
|
<button key={d} onClick={() => setDorTI(d)} className={`p-2 rounded-lg text-sm transition-colors ${dorTI === d ? 'bg-[#cbf400] text-[#0e0e0e]' : 'bg-[#0e0e0e] text-gray-300 hover:bg-[#2a2a2a]'}`}>
|
||||||
|
{d}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
{dorTI && (
|
||||||
|
<div className="mt-4">
|
||||||
|
<h3 className="text-sm font-semibold text-white mb-2">Qual a urgencia?</h3>
|
||||||
|
<div className="flex flex-wrap gap-2 mb-4">
|
||||||
|
{urgencias.map(u => (
|
||||||
|
<button key={u} onClick={() => setUrgencia(u)} className={`px-3 py-2 rounded-lg text-sm transition-colors ${urgencia === u ? 'bg-[#cbf400] text-[#0e0e0e]' : 'bg-[#0e0e0e] text-gray-300 hover:bg-[#2a2a2a]'}`}>
|
||||||
|
{u}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{dorTI && urgencia && (
|
||||||
|
<div className="flex gap-4 mt-4">
|
||||||
|
<Link to="/avaliacao" className="bg-[#cbf400] text-[#0e0e0e] px-6 py-3 rounded-xl font-semibold hover:bg-[#b8e000] transition-colors inline-flex items-center gap-2">
|
||||||
|
Solicitar Avaliacao Gratuita <ArrowRight className="w-4 h-4" />
|
||||||
|
</Link>
|
||||||
|
<button onClick={() => setMostrarCadastro(true)} className="border border-[#cbf400] text-[#cbf400] px-6 py-3 rounded-xl font-semibold hover:bg-[#cbf400]/10 transition-colors">
|
||||||
|
Cadastrar para Relatorio Completo
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Feedback */}
|
||||||
|
{resultado && (
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#2a2a2a] mb-8">
|
||||||
|
<h3 className="text-lg font-semibold text-white mb-3">Esta ferramenta foi util?</h3>
|
||||||
|
{feedbackUtil === null ? (
|
||||||
|
<div className="flex gap-4">
|
||||||
|
<button onClick={() => setFeedbackUtil('sim')} className="bg-green-500/20 text-green-400 px-6 py-2 rounded-lg hover:bg-green-500/30 transition-colors">
|
||||||
|
Sim, foi util
|
||||||
|
</button>
|
||||||
|
<button onClick={() => setFeedbackUtil('nao')} className="bg-red-500/20 text-red-400 px-6 py-2 rounded-lg hover:bg-red-500/30 transition-colors">
|
||||||
|
Nao, faltou algo
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
) : feedbackUtil === 'sim' ? (
|
||||||
|
<div>
|
||||||
|
<p className="text-green-400 mb-4">Que otimo! A Avanzato investe em ferramentas gratuitas para ajudar empresas a proteger sua infraestrutura de TI.</p>
|
||||||
|
<div className="flex flex-wrap gap-3">
|
||||||
|
<Link to="/avaliacao" className="bg-[#cbf400] text-[#0e0e0e] px-4 py-2 rounded-lg font-medium hover:bg-[#b8e000] transition-colors inline-flex items-center gap-2">
|
||||||
|
Solicitar Avaliacao Gratuita <ArrowRight className="w-4 h-4" />
|
||||||
|
</Link>
|
||||||
|
<button onClick={() => setMostrarCadastro(true)} className="border border-[#cbf400] text-[#cbf400] px-4 py-2 rounded-lg hover:bg-[#cbf400]/10 transition-colors">
|
||||||
|
Receber Relatorio Completo
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div>
|
||||||
|
<p className="text-gray-300 mb-2">O que faltou ou o que podemos melhorar?</p>
|
||||||
|
<textarea
|
||||||
|
value={feedbackTexto}
|
||||||
|
onChange={(e) => setFeedbackTexto(e.target.value)}
|
||||||
|
className="w-full bg-[#0e0e0e] border border-[#2a2a2a] rounded-xl px-4 py-3 text-white placeholder-gray-500 focus:border-[#cbf400] focus:outline-none h-24"
|
||||||
|
placeholder="Conte-nos como podemos melhorar..."
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Conteudo explicativo */}
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#2a2a2a] mb-8">
|
||||||
|
<h2 className="text-xl font-semibold text-white mb-4">O que e {nome.split(' ')[0]}?</h2>
|
||||||
|
<p className="text-gray-300 mb-6">{explicacao}</p>
|
||||||
|
|
||||||
|
<h3 className="text-lg font-semibold text-white mb-3">Como funciona</h3>
|
||||||
|
<ol className="space-y-2 mb-6">
|
||||||
|
{comoFunciona.map((passo, i) => (
|
||||||
|
<li key={i} className="flex items-start gap-3 text-gray-300">
|
||||||
|
<span className="w-6 h-6 bg-[#cbf400]/20 text-[#cbf400] rounded-full flex items-center justify-center text-sm font-medium shrink-0">{i + 1}</span>
|
||||||
|
{passo}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* FAQ da ferramenta */}
|
||||||
|
{perguntasUteis.length > 0 && (
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#2a2a2a] mb-8">
|
||||||
|
<h2 className="text-xl font-semibold text-white mb-4">Perguntas Frequentes sobre {nome.split(' ')[0]}</h2>
|
||||||
|
<div className="space-y-4">
|
||||||
|
{perguntasUteis.map((faq, i) => (
|
||||||
|
<div key={i} className="border-b border-[#2a2a2a] pb-4 last:border-0">
|
||||||
|
<h3 className="text-[#cbf400] font-medium mb-1">{faq.q}</h3>
|
||||||
|
<p className="text-gray-300 text-sm">{faq.a}</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FerramentaLayout;
|
||||||
@@ -0,0 +1,373 @@
|
|||||||
|
// ============================================================================
|
||||||
|
// DNS/SSL API - Consultas via APIs publicas
|
||||||
|
// ============================================================================
|
||||||
|
// Usa APIs gratuitas para consultar registros DNS, SSL, MX, SPF, DKIM, DMARC
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
import type { ResultadoFerramenta } from './FerramentaLayout';
|
||||||
|
|
||||||
|
// Helper para chamar a API do Google DNS
|
||||||
|
async function queryDNS(name: string, type: string): Promise<any> {
|
||||||
|
try {
|
||||||
|
const res = await fetch(`https://dns.google/resolve?name=${encodeURIComponent(name)}&type=${type}`);
|
||||||
|
return await res.json();
|
||||||
|
} catch {
|
||||||
|
return { Status: 2, Answer: [] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verificar SPF
|
||||||
|
export async function checkSPF(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
const data = await queryDNS(dominio, 'TXT');
|
||||||
|
const records = (data.Answer || []).filter((r: any) => r.data && r.data.includes('v=spf1'));
|
||||||
|
|
||||||
|
if (records.length === 0) {
|
||||||
|
return {
|
||||||
|
status: 'error',
|
||||||
|
titulo: 'SPF Nao Encontrado',
|
||||||
|
mensagem: `O dominio ${dominio} nao possui um registro SPF configurado. Sem SPF, qualquer pessoa pode enviar e-mails em nome do seu dominio, o que facilita ataques de phishing e spoofing.`,
|
||||||
|
detalhes: { Dominio: dominio, Registro: 'Nao encontrado' },
|
||||||
|
recomendacoes: [
|
||||||
|
'Crie um registro TXT no DNS com a politica SPF',
|
||||||
|
'Exemplo: v=spf1 include:_spf.google.com ~all (para Microsoft 365/Google Workspace)',
|
||||||
|
'Use o mecanismo ~all (softfail) inicialmente para testes',
|
||||||
|
'Monitore os logs antes de usar -all (hardfail)',
|
||||||
|
'Consulte a Avanzato para configuracao personalizada',
|
||||||
|
],
|
||||||
|
score: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const spf = records[0].data.replace(/"/g, '');
|
||||||
|
const hasAll = spf.includes('-all') || spf.includes('~all') || spf.includes('?all');
|
||||||
|
const isHardFail = spf.includes('-all');
|
||||||
|
const includes = spf.match(/include:[^\s]+/g) || [];
|
||||||
|
const ip4 = spf.match(/ip4:[^\s]+/g) || [];
|
||||||
|
const ip6 = spf.match(/ip6:[^\s]+/g) || [];
|
||||||
|
|
||||||
|
let status: 'success' | 'warning' | 'error' = 'warning';
|
||||||
|
let score = 60;
|
||||||
|
let recomendacoes: string[] = [];
|
||||||
|
|
||||||
|
if (isHardFail) { status = 'success'; score = 90; }
|
||||||
|
else if (spf.includes('~all')) { status = 'warning'; score = 70; recomendacoes.push('Considere mudar ~all para -all para protecao mais forte'); }
|
||||||
|
else if (!hasAll) { status = 'error'; score = 30; recomendacoes.push('Adicione ~all ou -all ao final do seu SPF'); }
|
||||||
|
|
||||||
|
if (includes.length > 10) { score -= 20; recomendacoes.push('Voce tem muitos includes. Mais de 10 lookups pode quebrar o SPF'); }
|
||||||
|
|
||||||
|
return {
|
||||||
|
status,
|
||||||
|
titulo: status === 'success' ? 'SPF Configurado Corretamente' : 'SPF Configurado com Ressalvas',
|
||||||
|
mensagem: `O dominio ${dominio} possui um registro SPF ${isHardFail ? 'com protecao rigida (-all)' : hasAll ? 'mas sem protecao rigida' : 'mas sem mecanismo de falha'}.`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
Registro: spf.substring(0, 100),
|
||||||
|
Mecanismo: isHardFail ? '-all (hardfail)' : spf.includes('~all') ? '~all (softfail)' : 'Sem all',
|
||||||
|
Includes: String(includes.length),
|
||||||
|
'IPs v4': String(ip4.length),
|
||||||
|
'IPs v6': String(ip6.length),
|
||||||
|
},
|
||||||
|
recomendacoes: recomendacoes.length > 0 ? recomendacoes : ['Seu SPF esta bem configurado!', 'Monitore regularmente para garantir que todos os servidores legitimos estejam incluidos'],
|
||||||
|
score,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verificar DKIM
|
||||||
|
export async function checkDKIM(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
const selectors = ['default', 'google', 'selector1', 'selector2', 'mail', 'dkim'];
|
||||||
|
let found = false;
|
||||||
|
let validSelector = '';
|
||||||
|
let dkimRecord = '';
|
||||||
|
|
||||||
|
for (const selector of selectors) {
|
||||||
|
const data = await queryDNS(`${selector}._domainkey.${dominio}`, 'TXT');
|
||||||
|
if (data.Answer && data.Answer.length > 0) {
|
||||||
|
const record = data.Answer[0].data;
|
||||||
|
if (record.includes('v=DKIM1') || record.includes('k=rsa')) {
|
||||||
|
found = true;
|
||||||
|
validSelector = selector;
|
||||||
|
dkimRecord = record.replace(/"/g, '').substring(0, 80);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
return {
|
||||||
|
status: 'warning',
|
||||||
|
titulo: 'DKIM Nao Encontrado',
|
||||||
|
mensagem: `Nao foi possivel encontrar um registro DKIM valido para ${dominio} com os selectors comuns. Isso nao significa que nao existe, mas pode indicar que nao esta configurado ou usa um selector personalizado.`,
|
||||||
|
detalhes: { Dominio: dominio, 'Selectors testados': selectors.join(', ') },
|
||||||
|
recomendacoes: [
|
||||||
|
'Verifique qual selector seu servidor de e-mail usa',
|
||||||
|
'Para Microsoft 365: selector1 e selector2',
|
||||||
|
'Para Google Workspace: google',
|
||||||
|
'Entre em contato com seu administrador de e-mail',
|
||||||
|
'A Avanzato pode configurar DKIM para seu dominio',
|
||||||
|
],
|
||||||
|
score: 30,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: 'success',
|
||||||
|
titulo: 'DKIM Configurado',
|
||||||
|
mensagem: `DKIM encontrado com o selector "${validSelector}". Seu dominio possui assinatura digital para autenticacao de e-mails.`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
Selector: validSelector,
|
||||||
|
Registro: dkimRecord + '...',
|
||||||
|
},
|
||||||
|
recomendacoes: [
|
||||||
|
'DKIM esta configurado corretamente!',
|
||||||
|
'Certifique-se de que todos os servidores de e-mail assinam com DKIM',
|
||||||
|
'Renove as chaves DKIM periodicamente',
|
||||||
|
],
|
||||||
|
score: 85,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verificar DMARC
|
||||||
|
export async function checkDMARC(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
const data = await queryDNS(`_dmarc.${dominio}`, 'TXT');
|
||||||
|
const records = (data.Answer || []).filter((r: any) => r.data && r.data.includes('v=DMARC1'));
|
||||||
|
|
||||||
|
if (records.length === 0) {
|
||||||
|
return {
|
||||||
|
status: 'error',
|
||||||
|
titulo: 'DMARC Nao Encontrado',
|
||||||
|
mensagem: `O dominio ${dominio} nao possui DMARC configurado. Sem DMARC, voce nao recebe relatorios sobre falhas de autenticacao e nao pode instruir provedores a rejeitar e-mails falsos.`,
|
||||||
|
detalhes: { Dominio: dominio, Registro: 'Nao encontrado' },
|
||||||
|
recomendacoes: [
|
||||||
|
'Crie um registro TXT em _dmarc.seudominio.com',
|
||||||
|
'Exemplo: v=DMARC1; p=quarantine; rua=mailto:dmarc@seudominio.com',
|
||||||
|
'Comece com p=none para monitorar, depois mude para quarantine ou reject',
|
||||||
|
'Configure rua para receber relatorios agregados',
|
||||||
|
'Consulte a Avanzato para configuracao completa',
|
||||||
|
],
|
||||||
|
score: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const dmarc = records[0].data.replace(/"/g, '');
|
||||||
|
const policy = dmarc.match(/p=(\w+)/)?.[1] || 'none';
|
||||||
|
const rua = dmarc.match(/rua=([^;]+)/)?.[1] || 'Nao configurado';
|
||||||
|
|
||||||
|
let status: 'success' | 'warning' | 'error' = 'warning';
|
||||||
|
let score = 50;
|
||||||
|
|
||||||
|
if (policy === 'reject') { status = 'success'; score = 100; }
|
||||||
|
else if (policy === 'quarantine') { status = 'warning'; score = 75; }
|
||||||
|
else { status = 'error'; score = 40; }
|
||||||
|
|
||||||
|
return {
|
||||||
|
status,
|
||||||
|
titulo: policy === 'reject' ? 'DMARC com Protecao Maxima' : 'DMARC Configurado',
|
||||||
|
mensagem: `DMARC encontrado com politica "${policy}". ${policy === 'reject' ? 'E-mails que falham na autenticacao serao rejeitados.' : policy === 'quarantine' ? 'E-mails suspeitos vao para spam.' : 'Apenas monitorando, sem acao sobre e-mails falsos.'}`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
Politica: policy,
|
||||||
|
'Relatorios (rua)': rua,
|
||||||
|
Registro: dmarc.substring(0, 80) + '...',
|
||||||
|
},
|
||||||
|
recomendacoes: policy === 'reject'
|
||||||
|
? ['Excelente! Sua protecao DMARC esta no nivel maximo']
|
||||||
|
: [`Considere mudar p=${policy} para p=reject para protecao total`, 'Monitore os relatorios rua antes de mudar para reject'],
|
||||||
|
score,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// MX Lookup
|
||||||
|
export async function checkMX(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
const data = await queryDNS(dominio, 'MX');
|
||||||
|
const records = (data.Answer || []).sort((a: any, b: any) => a.preference - b.preference);
|
||||||
|
|
||||||
|
if (records.length === 0) {
|
||||||
|
return {
|
||||||
|
status: 'error',
|
||||||
|
titulo: 'Registros MX Nao Encontrados',
|
||||||
|
mensagem: `O dominio ${dominio} nao possui registros MX. Sem MX, o dominio nao pode receber e-mails.`,
|
||||||
|
detalhes: { Dominio: dominio, Status: 'Sem MX' },
|
||||||
|
recomendacoes: [
|
||||||
|
'Configure registros MX no DNS do seu dominio',
|
||||||
|
'Para Microsoft 365: siga o assistente de configuracao',
|
||||||
|
'Para Google Workspace: adicione os MX do Google',
|
||||||
|
],
|
||||||
|
score: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const mxProviders = records.map((r: any) => r.data).join(', ');
|
||||||
|
const isMicrosoft = mxProviders.toLowerCase().includes('microsoft') || mxProviders.toLowerCase().includes('outlook') || mxProviders.toLowerCase().includes('protection');
|
||||||
|
const isGoogle = mxProviders.toLowerCase().includes('google') || mxProviders.toLowerCase().includes('aspmx');
|
||||||
|
const provider = isMicrosoft ? 'Microsoft 365 / Exchange Online' : isGoogle ? 'Google Workspace' : 'Outro / Servidor Proprio';
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: 'success',
|
||||||
|
titulo: `${records.length} Servidor(es) MX Encontrado(s)`,
|
||||||
|
mensagem: `O dominio ${dominio} esta configurado para receber e-mails via ${provider}.`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
'Servidores MX': String(records.length),
|
||||||
|
Provedor: provider,
|
||||||
|
'Prioridade mais alta': records[0].data,
|
||||||
|
},
|
||||||
|
recomendacoes: [
|
||||||
|
'Sua infraestrutura de e-mail esta configurada',
|
||||||
|
`Voce esta usando: ${provider}`,
|
||||||
|
'Mantenha pelo menos 2 servidores MX para redundancia',
|
||||||
|
],
|
||||||
|
score: 90,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// SSL Checker
|
||||||
|
export async function checkSSL(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
try {
|
||||||
|
// Usar a API do crt.sh para verificar certificados
|
||||||
|
const res = await fetch(`https://crt.sh/?q=${encodeURIComponent(dominio)}&output=json`);
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
|
if (!data || data.length === 0) {
|
||||||
|
return {
|
||||||
|
status: 'warning',
|
||||||
|
titulo: 'Certificado SSL Nao Encontrado',
|
||||||
|
mensagem: `Nao foi possivel encontrar informacoes de certificado SSL para ${dominio} no banco de dados publico. Isso pode significar que o site nao usa HTTPS ou o certificado nao e publico.`,
|
||||||
|
score: 30,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const cert = data[0];
|
||||||
|
const issuer = cert.issuer_name || 'Desconhecido';
|
||||||
|
const notAfter = cert.not_after ? new Date(cert.not_after) : null;
|
||||||
|
const diasRestantes = notAfter ? Math.floor((notAfter.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) : 0;
|
||||||
|
const isExpired = diasRestantes < 0;
|
||||||
|
const isExpiringSoon = diasRestantes < 30 && diasRestantes > 0;
|
||||||
|
|
||||||
|
let status: 'success' | 'warning' | 'error' = 'success';
|
||||||
|
let score = 90;
|
||||||
|
|
||||||
|
if (isExpired) { status = 'error'; score = 0; }
|
||||||
|
else if (isExpiringSoon) { status = 'warning'; score = 50; }
|
||||||
|
|
||||||
|
return {
|
||||||
|
status,
|
||||||
|
titulo: isExpired ? 'Certificado SSL Expirado!' : isExpiringSoon ? 'Certificado SSL Vence em Breve' : 'Certificado SSL Valido',
|
||||||
|
mensagem: isExpired
|
||||||
|
? `O certificado SSL de ${dominio} EXPIROU em ${notAfter?.toLocaleDateString('pt-BR')}. Seu site esta inseguro!`
|
||||||
|
: `Certificado SSL de ${dominio} emitido por ${issuer.split('=').pop()}. ${isExpiringSoon ? `Vence em ${diasRestantes} dias.` : `Valido ate ${notAfter?.toLocaleDateString('pt-BR')}.`}`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
Emissor: issuer.split('=').pop() || issuer,
|
||||||
|
'Valido ate': notAfter?.toLocaleDateString('pt-BR') || 'Desconhecido',
|
||||||
|
'Dias restantes': String(diasRestantes),
|
||||||
|
},
|
||||||
|
recomendacoes: isExpired
|
||||||
|
? ['RENOVE IMEDIATAMENTE seu certificado SSL', 'Use Let\'s Encrypt (gratuito) ou contrate um certificado pago', 'Entre em contato com a Avanzato para renovacao urgente']
|
||||||
|
: isExpiringSoon
|
||||||
|
? [`Renove seu certificado nos proximos ${diasRestantes} dias`, 'Configure renovacao automatica', 'Considere usar Let\'s Encrypt com auto-renew']
|
||||||
|
: ['Seu certificado SSL esta valido!', 'Configure renovacao automatica para evitar expiracao', 'Monitore a data de vencimento'],
|
||||||
|
score,
|
||||||
|
};
|
||||||
|
} catch {
|
||||||
|
return {
|
||||||
|
status: 'info',
|
||||||
|
titulo: 'Verificacao de SSL',
|
||||||
|
mensagem: `Nao foi possivel verificar o SSL de ${dominio} externamente. Verifique diretamente no navegador clicando no cadeado ao lado da URL.`,
|
||||||
|
score: 50,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Email Security Score
|
||||||
|
export async function checkEmailSecurity(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
const [spf, dkim, dmarc, mx] = await Promise.all([
|
||||||
|
checkSPF(dominio),
|
||||||
|
checkDKIM(dominio),
|
||||||
|
checkDMARC(dominio),
|
||||||
|
checkMX(dominio),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const scores = [spf.score || 0, dkim.score || 0, dmarc.score || 0, mx.score || 0];
|
||||||
|
const media = Math.floor(scores.reduce((a, b) => a + b, 0) / scores.length);
|
||||||
|
|
||||||
|
let status: 'success' | 'warning' | 'error' = 'success';
|
||||||
|
if (media < 50) status = 'error';
|
||||||
|
else if (media < 80) status = 'warning';
|
||||||
|
|
||||||
|
return {
|
||||||
|
status,
|
||||||
|
titulo: `Email Security Score: ${media}/100`,
|
||||||
|
mensagem: media >= 80
|
||||||
|
? `A seguranca de e-mail de ${dominio} esta boa! Score: ${media}/100.`
|
||||||
|
: media >= 50
|
||||||
|
? `A seguranca de e-mail de ${dominio} precisa de atencao. Score: ${media}/100.`
|
||||||
|
: `A seguranca de e-mail de ${dominio} esta critica! Score: ${media}/100.`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
'Score Total': `${media}/100`,
|
||||||
|
'SPF': `${spf.score}/100 (${spf.status === 'success' ? 'OK' : 'Problema'})`,
|
||||||
|
'DKIM': `${dkim.score}/100 (${dkim.status === 'success' ? 'OK' : 'Atenção'})`,
|
||||||
|
'DMARC': `${dmarc.score}/100 (${dmarc.status === 'success' ? 'OK' : 'Problema'})`,
|
||||||
|
'MX': `${mx.score}/100 (${mx.status === 'success' ? 'OK' : 'Problema'})`,
|
||||||
|
},
|
||||||
|
recomendacoes: [
|
||||||
|
...spf.recomendacoes || [],
|
||||||
|
...dmarc.recomendacoes || [],
|
||||||
|
...(dkim.score && dkim.score < 80 ? dkim.recomendacoes || [] : []),
|
||||||
|
].filter((v, i, a) => a.indexOf(v) === i).slice(0, 6),
|
||||||
|
score: media,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Microsoft 365 Analyzer
|
||||||
|
export async function checkMicrosoft365(dominio: string): Promise<ResultadoFerramenta> {
|
||||||
|
const [mx, spf, dmarc, dkim] = await Promise.all([
|
||||||
|
checkMX(dominio),
|
||||||
|
checkSPF(dominio),
|
||||||
|
checkDMARC(dominio),
|
||||||
|
checkDKIM(dominio),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const isMicrosoft365 = mx.detalhes?.Provedor?.includes('Microsoft');
|
||||||
|
const m365Score = isMicrosoft365 ? 40 : 0;
|
||||||
|
const spfScore = spf.score || 0;
|
||||||
|
const dmarcScore = dmarc.score || 0;
|
||||||
|
const dkimScore = dkim.score || 0;
|
||||||
|
const total = Math.min(100, m365Score + Math.floor((spfScore + dmarcScore + dkimScore) / 3 * 0.6));
|
||||||
|
|
||||||
|
let status: 'success' | 'warning' | 'error' = 'success';
|
||||||
|
if (total < 40) status = 'error';
|
||||||
|
else if (total < 70) status = 'warning';
|
||||||
|
|
||||||
|
return {
|
||||||
|
status,
|
||||||
|
titulo: `Microsoft 365 Analyzer: ${total}/100`,
|
||||||
|
mensagem: isMicrosoft365
|
||||||
|
? `O dominio ${dominio} esta configurado com Microsoft 365. Score de seguranca: ${total}/100.`
|
||||||
|
: `O dominio ${dominio} nao parece usar Microsoft 365 como servidor de e-mail principal. Score de seguranca: ${total}/100.`,
|
||||||
|
detalhes: {
|
||||||
|
Dominio: dominio,
|
||||||
|
'Usa Microsoft 365': isMicrosoft365 ? 'Sim' : 'Nao detectado',
|
||||||
|
'Score Total': `${total}/100`,
|
||||||
|
'SPF': `${spfScore}/100`,
|
||||||
|
'DKIM': `${dkimScore}/100`,
|
||||||
|
'DMARC': `${dmarcScore}/100`,
|
||||||
|
},
|
||||||
|
recomendacoes: isMicrosoft365
|
||||||
|
? [
|
||||||
|
...(total < 80 ? ['Configure DKIM corretamente para Microsoft 365'] : []),
|
||||||
|
...(dmarcScore < 80 ? ['Fortaleca a politica DMARC'] : []),
|
||||||
|
'Habilite ATP (Advanced Threat Protection) no Microsoft 365',
|
||||||
|
'Configure regras de anti-spam e anti-malware',
|
||||||
|
'Ative a autenticacao de dois fatores para todos os usuarios',
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
'Se voce usa Microsoft 365, verifique se os registros MX estao corretos',
|
||||||
|
'Configure SPF com include:_spf.microsoft.com',
|
||||||
|
'Ative DKIM no portal do Microsoft 365',
|
||||||
|
'Configure DMARC para monitoramento',
|
||||||
|
],
|
||||||
|
score: total,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -130,6 +130,7 @@ export const NAV_LINKS = [
|
|||||||
},
|
},
|
||||||
{ name: 'Tecnologias', href: '/tecnologias' },
|
{ name: 'Tecnologias', href: '/tecnologias' },
|
||||||
{ name: 'Avaliacao TI', href: '/avaliacao' },
|
{ name: 'Avaliacao TI', href: '/avaliacao' },
|
||||||
|
{ name: 'Ferramentas', href: '/ferramentas' },
|
||||||
{ name: 'Onde Atuamos', href: '/onde-atuamos' },
|
{ name: 'Onde Atuamos', href: '/onde-atuamos' },
|
||||||
{ name: 'Cases', href: '/cases' },
|
{ name: 'Cases', href: '/cases' },
|
||||||
{ name: 'Blog', href: '/blog' },
|
{ name: 'Blog', href: '/blog' },
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Mail } from 'lucide-react';
|
||||||
|
import { checkDKIM } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'O que e DKIM?', a: 'DKIM e uma assinatura digital criptografica que garante que um e-mail nao foi alterado durante o transporte e realmente veio do servidor autorizado.' },
|
||||||
|
{ q: 'Como ativar DKIM no Microsoft 365?', a: 'No centro de administracao do Microsoft 365, va em Politicas de e-mail > DKIM. Selecione seu dominio e ative as assinaturas. Os selectors serao selector1 e selector2.' },
|
||||||
|
{ q: 'DKIM e obrigatorio?', a: 'Nao e obrigatorio, mas altamente recomendado. Gmail, Microsoft e outros provedores priorizam e-mails com DKIM autenticado.' },
|
||||||
|
{ q: 'Quais selectors a ferramenta verifica?', a: 'Verificamos os selectors mais comuns: default, google, selector1, selector2, mail e dkim.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'DKIM Checker', url: 'https://avanzato.com.br/ferramentas/dkim-checker' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name: 'DKIM Checker',
|
||||||
|
description: 'Ferramenta gratuita para verificar configuracao DKIM de dominios.',
|
||||||
|
url: 'https://avanzato.com.br/ferramentas/dkim-checker',
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const DkimChecker = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="DKIM Checker Gratuito | Avanzato Tools"
|
||||||
|
description="Valide a assinatura digital DKIM do seu dominio. Garanta que seus e-mails sejam autenticos. Ferramenta gratuita da Avanzato."
|
||||||
|
keywords="dkim checker, verificar dkim, domainkeys, assinatura digital email, autenticacao email"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="DKIM Checker Gratuito"
|
||||||
|
descricao="Valide a assinatura digital DKIM do seu dominio para garantir a autenticidade dos e-mails enviados."
|
||||||
|
icone={<Mail />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="DKIM (DomainKeys Identified Mail) e uma assinatura digital que seu servidor de e-mail adiciona a cada mensagem enviada. O destinatario pode verificar essa assinatura consultando uma chave publica no DNS do seu dominio. Sem DKIM, provedores de e-mail como Gmail e Outlook tem dificuldade para confirmar que a mensagem realmente veio do seu servidor, o que aumenta a chance de seus e-mails irem para a pasta de spam."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio que deseja verificar no campo acima.',
|
||||||
|
'Nossa ferramenta testa os selectors DKIM mais comuns.',
|
||||||
|
'Consultamos os registros TXT nos servidores DNS publicos.',
|
||||||
|
'Analisamos a chave publica e configuracao do DKIM.',
|
||||||
|
'Voce recebe um score e recomendacoes personalizadas.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkDKIM}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default DkimChecker;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Lock } from 'lucide-react';
|
||||||
|
import { checkDMARC } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'O que e DMARC?', a: 'DMARC e um protocolo que instrui provedores de e-mail a rejeitar ou colocar em quarentena mensagens que nao passam na autenticacao SPF ou DKIM.' },
|
||||||
|
{ q: 'Qual politica DMARC devo usar?', a: 'Comece com p=none para monitorar, depois mude para p=quarantine e finalmente p=reject para protecao maxima.' },
|
||||||
|
{ q: 'O que sao relatorios DMARC?', a: 'Sao e-mails automaticos enviados por provedores (Google, Microsoft) informando quem esta tentando usar seu dominio para enviar e-mails.' },
|
||||||
|
{ q: 'DMARC sozinho protege contra phishing?', a: 'Nao. DMARC funciona junto com SPF e DKIM. Os tres juntos formam a triade de seguranca de e-mail.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'DMARC Checker', url: 'https://avanzato.com.br/ferramentas/dmarc-checker' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name: 'DMARC Checker',
|
||||||
|
description: 'Ferramenta gratuita para analisar politica DMARC de dominios.',
|
||||||
|
url: 'https://avanzato.com.br/ferramentas/dmarc-checker',
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const DmarcChecker = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="DMARC Checker Gratuito | Avanzato Tools"
|
||||||
|
description="Analise a politica DMARC do seu dominio. Proteja contra phishing e spoofing. Ferramenta gratuita da Avanzato."
|
||||||
|
keywords="dmarc checker, verificar dmarc, politica dmarc, protecao email, anti phishing"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="DMARC Checker Gratuito"
|
||||||
|
descricao="Analise a politica DMARC do seu dominio e descubra se voce esta protegido contra phishing e spoofing."
|
||||||
|
icone={<Lock />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="DMARC (Domain-based Message Authentication, Reporting, and Conformance) e um protocolo que instrui provedores de e-mail sobre como tratar mensagens que falham na autenticacao SPF ou DKIM. Com DMARC, voce pode instruir provedores a rejeitar e-mails falsos e ainda recebe relatorios sobre tentativas de uso nao autorizado do seu dominio."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio que deseja analisar no campo acima.',
|
||||||
|
'Consultamos o registro DMARC nos servidores DNS.',
|
||||||
|
'Analisamos a politica configurada (none, quarantine, reject).',
|
||||||
|
'Verificamos se voce esta recebendo relatorios (rua).',
|
||||||
|
'Receba recomendacoes para fortalecer sua protecao.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkDMARC}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default DmarcChecker;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { BarChart3 } from 'lucide-react';
|
||||||
|
import { checkEmailSecurity } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'O que o Email Security Score avalia?', a: 'Avaliamos 4 componentes: SPF (autorizacao de servidores), DKIM (assinatura digital), DMARC (politica de conformidade) e MX (infraestrutura de e-mail).' },
|
||||||
|
{ q: 'Qual score minimo recomendado?', a: 'Recomendamos score minimo de 80. Abaixo de 70, sua empresa esta vulneravel a spoofing e phishing.' },
|
||||||
|
{ q: 'Como melhorar meu score?', a: 'Comece corrigindo os componentes com nota mais baixa. Configurar DMARC com p=reject e o impacto mais significativo.' },
|
||||||
|
{ q: 'O score e atualizado em tempo real?', a: 'Sim. Cada consulta verifica o estado atual dos seus registros DNS publicos.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'Email Security Score', url: 'https://avanzato.com.br/ferramentas/email-security-score' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name: 'Email Security Score',
|
||||||
|
description: 'Ferramenta gratuita para avaliar seguranca completa de e-mail de dominios.',
|
||||||
|
url: 'https://avanzato.com.br/ferramentas/email-security-score',
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const EmailSecurityScore = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="Email Security Score | Avanzato Tools"
|
||||||
|
description="Avalie a seguranca de e-mail do seu dominio. Score de 0 a 100 com recomendacoes. SPF, DKIM, DMARC e MX. Gratuito."
|
||||||
|
keywords="email security score, seguranca email, score email, avaliar email, protecao email"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="Email Security Score"
|
||||||
|
descricao="Avalie a seguranca completa do e-mail do seu dominio com um score de 0 a 100 e recomendacoes detalhadas."
|
||||||
|
icone={<BarChart3 />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="Nossa ferramenta Email Security Score analisa todos os aspectos da seguranca de e-mail do seu dominio em uma unica consulta: SPF, DKIM, DMARC e registros MX. Cada componente e avaliado individualmente e voce recebe um score global de 0 a 100, com recomendacoes praticas e priorizadas para melhorar a seguranca."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio que deseja avaliar no campo acima.',
|
||||||
|
'Analisamos SPF, DKIM, DMARC e MX simultaneamente.',
|
||||||
|
'Cada componente recebe uma nota de 0 a 100.',
|
||||||
|
'Calculamos o score global de seguranca de e-mail.',
|
||||||
|
'Voce recebe um plano de acao priorizado para melhorias.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkEmailSecurity}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default EmailSecurityScore;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Building2 } from 'lucide-react';
|
||||||
|
import { checkMicrosoft365 } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'A ferramenta funciona so para Microsoft 365?', a: 'Sim, esta ferramenta e especifica para Microsoft 365. Para analise generica de e-mail, use nosso Email Security Score.' },
|
||||||
|
{ q: 'O que verifica no Microsoft 365?', a: 'Verificamos: registros MX apontando para Microsoft, SPF com include:_spf.microsoft.com, DKIM ativado e DMARC configurado.' },
|
||||||
|
{ q: 'Como ativar DKIM no Microsoft 365?', a: 'No Centro de Administracao > Seguranca > DKIM. Selecione o dominio e ative. Os selectors sao selector1 e selector2.' },
|
||||||
|
{ q: 'A Avanzato oferece suporte Microsoft 365?', a: 'Sim. Somos especialistas em Microsoft 365 e oferecemos migracao, configuracao, suporte e seguranca.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'Microsoft 365 Analyzer', url: 'https://avanzato.com.br/ferramentas/microsoft-365-analyzer' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name: 'Microsoft 365 Analyzer',
|
||||||
|
description: 'Ferramenta gratuita para analisar configuracao Microsoft 365 de dominios.',
|
||||||
|
url: 'https://avanzato.com.br/ferramentas/microsoft-365-analyzer',
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const Microsoft365Analyzer = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="Microsoft 365 Analyzer | Avanzato Tools"
|
||||||
|
description="Analise a configuracao do Microsoft 365 do seu dominio. Verifique seguranca e otimizacao. Ferramenta gratuita da Avanzato."
|
||||||
|
keywords="microsoft 365 analyzer, verificar microsoft 365, configuracao m365, seguranca microsoft 365"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="Microsoft 365 Analyzer"
|
||||||
|
descricao="Analise a configuracao do Microsoft 365 do seu dominio e descubra oportunidades de melhoria e seguranca."
|
||||||
|
icone={<Building2 />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="O Microsoft 365 e a suite de produtividade mais usada por empresas no mundo, mas muitas configuracoes de seguranca ficam desativadas por padrao. Nossa ferramenta analisa se seu dominio esta corretamente configurado com o Microsoft 365, verifica SPF, DKIM e DMARC especificos para o ambiente Microsoft, e identifica oportunidades de melhoria."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio configurado no Microsoft 365.',
|
||||||
|
'Verificamos se os registros MX apontam para a Microsoft.',
|
||||||
|
'Analisamos SPF, DKIM e DMARC especificos para Microsoft 365.',
|
||||||
|
'Identificamos configuracoes de seguranca recomendadas.',
|
||||||
|
'Receba um relatorio com acoes priorizadas.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkMicrosoft365}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default Microsoft365Analyzer;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Server } from 'lucide-react';
|
||||||
|
import { checkMX } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'O que sao registros MX?', a: 'Registros MX sao entradas DNS que indicam quais servidores de e-mail recebem mensagens enviadas ao seu dominio.' },
|
||||||
|
{ q: 'Quantos servidores MX devo ter?', a: 'Recomendamos pelo menos 2 servidores MX com prioridades diferentes para redundancia. Se o primeiro falhar, o segundo assume.' },
|
||||||
|
{ q: 'Como migrar e-mail para Microsoft 365?', a: 'Voce precisa alterar os registros MX para apontar para os servidores Microsoft. A Avanzato pode fazer essa migracao sem perda de e-mails.' },
|
||||||
|
{ q: 'MX afeta envio de e-mails?', a: 'Nao. Registros MX controlam apenas o recebimento. Para envio, use SPF, DKIM e DMARC.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'MX Lookup', url: 'https://avanzato.com.br/ferramentas/mx-lookup' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name: 'MX Lookup',
|
||||||
|
description: 'Ferramenta gratuita para consultar registros MX de dominios.',
|
||||||
|
url: 'https://avanzato.com.br/ferramentas/mx-lookup',
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const MxLookup = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="MX Lookup Gratuito | Avanzato Tools"
|
||||||
|
description="Consulte os registros MX do seu dominio. Verifique a infraestrutura de e-mail. Ferramenta gratuita da Avanzato."
|
||||||
|
keywords="mx lookup, consultar mx, registros mx, servidor email, infraestrutura email"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="MX Lookup Gratuito"
|
||||||
|
descricao="Consulte os registros MX do seu dominio e verifique a infraestrutura de recebimento de e-mails."
|
||||||
|
icone={<Server />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="Registros MX (Mail Exchange) definem quais servidores sao responsaveis por receber e-mails enviados ao seu dominio. Sem registros MX configurados corretamente, seu dominio nao pode receber e-mails. Empresas que migram para Microsoft 365 ou Google Workspace precisam atualizar seus registros MX para apontar para os servidores corretos."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio que deseja consultar no campo acima.',
|
||||||
|
'Nossa ferramenta consulta os registros MX nos servidores DNS.',
|
||||||
|
'Identificamos o provedor de e-mail (Microsoft 365, Google, etc).',
|
||||||
|
'Mostramos a prioridade de cada servidor MX.',
|
||||||
|
'Verificamos redundancia e configuracao.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkMX}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default MxLookup;
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Shield } from 'lucide-react';
|
||||||
|
import { checkSPF } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'O que e SPF?', a: 'SPF (Sender Policy Framework) e um registro DNS que define quais servidores de e-mail estao autorizados a enviar mensagens em nome do seu dominio. Ele ajuda a prevenir spoofing e phishing.' },
|
||||||
|
{ q: 'Por que o SPF e importante para empresas?', a: 'Sem SPF, qualquer pessoa pode enviar e-mails falsos usando o nome do seu dominio. Isso facilita ataques de phishing que usam sua marca para enganar clientes e funcionarios.' },
|
||||||
|
{ q: 'Como configurar SPF no Microsoft 365?', a: 'Adicione um registro TXT no DNS com: v=spf1 include:_spf.microsoft.com ~all. Depois de testar, mude ~all para -all para protecao total.' },
|
||||||
|
{ q: 'Qual a diferenca entre ~all e -all?', a: '~all (softfail) marca e-mails nao autorizados como suspeitos. -all (hardfail) instrui provedores a rejeitar e-mails de servidores nao listados.' },
|
||||||
|
{ q: 'Quantos includes posso ter no SPF?', a: 'O SPF permite no maximo 10 lookups DNS. Mais que isso gera erro e o SPF nao funciona. Use mecanismos ip4/ip6 quando possivel para reduzir lookups.' },
|
||||||
|
{ q: 'O SPF sozinho e suficiente?', a: 'Nao. SPF deve ser usado junto com DKIM e DMARC para protecao completa contra spoofing e phishing. Recomendamos usar nossa ferramenta Email Security Score para verificar tudo.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'SPF Checker', url: 'https://avanzato.com.br/ferramentas/spf-checker' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = createSoftwareSchema('SPF Checker', 'Ferramenta gratuita para verificar configuracao SPF de dominios.', 'https://avanzato.com.br/ferramentas/spf-checker');
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const SpfChecker = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="SPF Checker Gratuito | Avanzato Tools"
|
||||||
|
description="Verifique se o SPF do seu dominio esta configurado corretamente. Proteja contra spoofing e phishing. Ferramenta gratuita da Avanzato."
|
||||||
|
keywords="spf checker, verificar spf, configurar spf, sender policy framework, seguranca email"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="SPF Checker Gratuito"
|
||||||
|
descricao="Verifique se o dominio da sua empresa esta protegido contra falsificacao de e-mails."
|
||||||
|
icone={<Shield />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="O SPF (Sender Policy Framework) e um registro DNS que lista os servidores autorizados a enviar e-mails em nome do seu dominio. Quando um e-mail chega ao destinatario, o servidor dele consulta o SPF do seu dominio para verificar se o remetente e legitimo. Sem SPF, qualquer servidor pode enviar e-mails como se fosse voce, facilitando phishing e spoofing. Empresas que usam Microsoft 365, Google Workspace ou qualquer servico de e-mail devem ter SPF configurado corretamente."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio que deseja verificar no campo acima.',
|
||||||
|
'Nossa ferramenta consulta os servidores DNS publicos em tempo real.',
|
||||||
|
'Analisamos o registro SPF, mecanismos e politica de falha.',
|
||||||
|
'Voce recebe um score de 0 a 100 com recomendacoes praticas.',
|
||||||
|
'Cadastre-se gratuitamente para receber um relatorio completo por e-mail.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkSPF}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default SpfChecker;
|
||||||
|
|
||||||
|
// Schema helper
|
||||||
|
function createSoftwareSchema(name: string, description: string, url: string) {
|
||||||
|
return {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
url,
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import FerramentaLayout from '../../components/ferramentas/FerramentaLayout';
|
||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Lock } from 'lucide-react';
|
||||||
|
import { checkSSL } from '../../components/ferramentas/dnsApi';
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'O que e SSL/TLS?', a: 'SSL e um protocolo de criptografia que protege a comunicacao entre navegador e servidor. TLS e a versao mais moderna e segura.' },
|
||||||
|
{ q: 'Meu site precisa de SSL?', a: 'Sim. Todo site precisa de SSL. O Google penaliza sites sem HTTPS e navegadores exibem aviso de Nao Seguro.' },
|
||||||
|
{ q: 'SSL e gratuito?', a: 'Sim. Let\'s Encrypt oferece certificados SSL gratuitos com renovacao automatica.' },
|
||||||
|
{ q: 'O que acontece se o SSL expirar?', a: 'Seu site ficara inacessivel ou mostrara aviso de seguranca. E crucial renovar antes da expiracao.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
{ name: 'SSL Checker', url: 'https://avanzato.com.br/ferramentas/ssl-checker' },
|
||||||
|
]);
|
||||||
|
const softwareSchema = {
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@type': 'SoftwareApplication',
|
||||||
|
name: 'SSL Checker',
|
||||||
|
description: 'Ferramenta gratuita para verificar certificados SSL de sites.',
|
||||||
|
url: 'https://avanzato.com.br/ferramentas/ssl-checker',
|
||||||
|
applicationCategory: 'SecurityApplication',
|
||||||
|
operatingSystem: 'Web',
|
||||||
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'BRL' },
|
||||||
|
author: { '@type': 'Organization', name: 'Avanzato Tecnologia', url: 'https://avanzato.com.br' },
|
||||||
|
};
|
||||||
|
const combinedSchema = [faqSchema, breadcrumbSchema, softwareSchema];
|
||||||
|
|
||||||
|
const SslChecker = () => (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e] pt-16 pb-8">
|
||||||
|
<SEO
|
||||||
|
title="SSL Checker Gratuito | Avanzato Tools"
|
||||||
|
description="Verifique a validade do certificado SSL do seu site. Garanta seguranca e confianca. Ferramenta gratuita da Avanzato."
|
||||||
|
keywords="ssl checker, verificar ssl, certificado ssl, seguranca site, https"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
<FerramentaLayout
|
||||||
|
nome="SSL Checker Gratuito"
|
||||||
|
descricao="Verifique a validade e configuracao do certificado SSL do seu site. Garanta seguranca para seus visitantes."
|
||||||
|
icone={<Lock />}
|
||||||
|
placeholder="Digite seu dominio (ex: avanzato.com.br)"
|
||||||
|
explicacao="Um certificado SSL criptografa a comunicacao entre o navegador do visitante e seu servidor web. Sem SSL, dados sensiveis como senhas, cartoes de credito e informacoes pessoais transitam em texto puro pela internet. Alem disso, o Google penaliza sites sem SSL nos resultados de busca e navegadores exibem aviso de Nao Seguro."
|
||||||
|
comoFunciona={[
|
||||||
|
'Digite o dominio do site que deseja verificar.',
|
||||||
|
'Nossa ferramenta consulta o banco de dados de certificados publicos.',
|
||||||
|
'Verificamos o emissor, validade e configuracao do certificado.',
|
||||||
|
'Calculamos quantos dias faltam para a expiracao.',
|
||||||
|
'Receba alertas e recomendacoes de seguranca.',
|
||||||
|
]}
|
||||||
|
perguntasUteis={faqData.slice(0, 4)}
|
||||||
|
onConsultar={checkSSL}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default SslChecker;
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
import SEO from '../../components/SEO';
|
||||||
|
import { createFAQSchema, createBreadcrumbSchema } from '../../config/schema';
|
||||||
|
import { Shield, Mail, Server, Lock, BarChart3, Building2, ArrowRight, CheckCircle } from 'lucide-react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
|
const breadcrumbSchema = createBreadcrumbSchema([
|
||||||
|
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||||
|
{ name: 'Ferramentas', url: 'https://avanzato.com.br/ferramentas' },
|
||||||
|
]);
|
||||||
|
|
||||||
|
const faqData = [
|
||||||
|
{ q: 'As ferramentas da Avanzato sao gratuitas?', a: 'Sim, todas as ferramentas sao gratuitas. Voce pode realizar ate 2 consultas por ferramenta sem cadastro. Para consultas ilimitadas e relatorios completos, basta fazer um cadastro rapido gratuito.' },
|
||||||
|
{ q: 'Para que serve o SPF Checker?', a: 'O SPF (Sender Policy Framework) e um registro DNS que define quais servidores de e-mail podem enviar mensagens em nome do seu dominio. Nossa ferramenta verifica se seu SPF esta configurado corretamente para evitar spoofing.' },
|
||||||
|
{ q: 'O que e DKIM e por que verificar?', a: 'DKIM (DomainKeys Identified Mail) e uma assinatura digital que garante a autenticidade dos e-mails enviados pelo seu dominio. Sem DKIM, seus e-mails podem ser marcados como spam ou rejeitados.' },
|
||||||
|
{ q: 'Como o Email Security Score funciona?', a: 'Nossa ferramenta analisa SPF, DKIM, DMARC, registros MX e configuracoes de seguranca do seu dominio e gera um score de 0 a 100, com recomendacoes praticas para melhorar a seguranca do e-mail.' },
|
||||||
|
{ q: 'Os resultados sao confiaveis?', a: 'Sim. Nossas ferramentas consultam diretamente os servidores DNS publicos e APIs de verificacao SSL. Os resultados sao atualizados em tempo real e usados por nossos proprios consultores tecnicos.' },
|
||||||
|
{ q: 'Preciso cadastrar para usar?', a: 'Nao nas primeiras 2 consultas. Apos isso, solicitamos um cadastro rapido (nome, e-mail, empresa) para continuar usando. Nao enviamos spam e voce pode cancelar a qualquer momento.' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const faqSchema = createFAQSchema(faqData);
|
||||||
|
const combinedSchema = [breadcrumbSchema, faqSchema];
|
||||||
|
|
||||||
|
const ferramentas = [
|
||||||
|
{
|
||||||
|
slug: 'spf-checker',
|
||||||
|
nome: 'SPF Checker',
|
||||||
|
descricao: 'Verifique se o registro SPF do seu dominio esta configurado corretamente para proteger contra falsificacao de e-mails.',
|
||||||
|
icone: <Shield className="w-8 h-8" />,
|
||||||
|
tags: ['email', 'seguranca', 'microsoft365'],
|
||||||
|
tempo: '2 segundos',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'dkim-checker',
|
||||||
|
nome: 'DKIM Checker',
|
||||||
|
descricao: 'Valide a assinatura digital DKIM do seu dominio para garantir a autenticidade dos e-mails enviados.',
|
||||||
|
icone: <Mail className="w-8 h-8" />,
|
||||||
|
tags: ['email', 'seguranca', 'microsoft365'],
|
||||||
|
tempo: '2 segundos',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'dmarc-checker',
|
||||||
|
nome: 'DMARC Checker',
|
||||||
|
descricao: 'Analise a politica DMARC do seu dominio e descubra se voce esta protegido contra phishing e spoofing.',
|
||||||
|
icone: <Lock className="w-8 h-8" />,
|
||||||
|
tags: ['email', 'seguranca'],
|
||||||
|
tempo: '2 segundos',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'mx-lookup',
|
||||||
|
nome: 'MX Lookup',
|
||||||
|
descricao: 'Consulte os registros MX do seu dominio e verifique a infraestrutura de recebimento de e-mails.',
|
||||||
|
icone: <Server className="w-8 h-8" />,
|
||||||
|
tags: ['email', 'infra'],
|
||||||
|
tempo: '1 segundo',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'ssl-checker',
|
||||||
|
nome: 'SSL Checker',
|
||||||
|
descricao: 'Verifique a validade e configuracao do certificado SSL do seu site. Garanta seguranca para seus visitantes.',
|
||||||
|
icone: <Lock className="w-8 h-8" />,
|
||||||
|
tags: ['seguranca', 'website'],
|
||||||
|
tempo: '3 segundos',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'email-security-score',
|
||||||
|
nome: 'Email Security Score',
|
||||||
|
descricao: 'Avalie a seguranca completa do e-mail do seu dominio com um score de 0 a 100 e recomendacoes detalhadas.',
|
||||||
|
icone: <BarChart3 className="w-8 h-8" />,
|
||||||
|
tags: ['email', 'seguranca', 'microsoft365'],
|
||||||
|
tempo: '5 segundos',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'microsoft-365-analyzer',
|
||||||
|
nome: 'Microsoft 365 Analyzer',
|
||||||
|
descricao: 'Analise a configuracao do Microsoft 365 do seu dominio e descubra oportunidades de melhoria e seguranca.',
|
||||||
|
icone: <Building2 className="w-8 h-8" />,
|
||||||
|
tags: ['microsoft365', 'cloud', 'seguranca'],
|
||||||
|
tempo: '5 segundos',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const beneficios = [
|
||||||
|
'Ferramentas 100% gratuitas',
|
||||||
|
'Resultados em tempo real',
|
||||||
|
'Recomendacoes praticas',
|
||||||
|
'Relatorios completos',
|
||||||
|
'Integracao com Microsoft 365',
|
||||||
|
'Desenvolvido por especialistas em TI',
|
||||||
|
];
|
||||||
|
|
||||||
|
const Ferramentas = () => {
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen bg-[#0e0e0e]">
|
||||||
|
<SEO
|
||||||
|
title="Ferramentas Gratuitas de TI - Avanzato Tools"
|
||||||
|
description="Ferramentas gratuitas para diagnosticar seguranca de e-mail, SSL, Microsoft 365 e infraestrutura de TI. SPF Checker, DKIM Checker, DMARC Checker, SSL Checker e mais."
|
||||||
|
keywords="spf checker, dkim checker, dmarc checker, verificar ssl, mx lookup, email security, microsoft 365 analyzer"
|
||||||
|
schema={combinedSchema}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* Hero */}
|
||||||
|
<section className="pt-20 pb-16">
|
||||||
|
<div className="max-w-7xl mx-auto px-6">
|
||||||
|
<nav className="text-sm text-gray-400 mb-6">
|
||||||
|
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||||
|
<span className="mx-2">/</span>
|
||||||
|
<span className="text-white">Ferramentas</span>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||||
|
<span className="text-[#cbf400]">Avanzato</span> Tools
|
||||||
|
</h1>
|
||||||
|
<p className="text-xl text-gray-300 max-w-3xl mb-4">
|
||||||
|
Ferramentas gratuitas de diagnostico tecnico para empresas.
|
||||||
|
Verifique a seguranca do seu e-mail, SSL, Microsoft 365 e infraestrutura de TI.
|
||||||
|
</p>
|
||||||
|
<p className="text-gray-400 max-w-3xl">
|
||||||
|
Desenvolvidas por especialistas com +23 anos de experiencia em TI empresarial.
|
||||||
|
Sem custo, sem spam. 2 consultas gratuitas, cadastro rapido para ilimitado.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Grid de Ferramentas */}
|
||||||
|
<section className="py-12">
|
||||||
|
<div className="max-w-7xl mx-auto px-6">
|
||||||
|
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||||
|
{ferramentas.map((f) => (
|
||||||
|
<Link
|
||||||
|
key={f.slug}
|
||||||
|
to={`/ferramentas/${f.slug}`}
|
||||||
|
className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#2a2a2a] hover:border-[#cbf400]/50 transition-all group"
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-4 mb-4">
|
||||||
|
<div className="p-3 bg-[#cbf400]/10 rounded-xl text-[#cbf400]">
|
||||||
|
{f.icone}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 className="text-xl font-semibold text-white group-hover:text-[#cbf400] transition-colors">
|
||||||
|
{f.nome}
|
||||||
|
</h2>
|
||||||
|
<p className="text-xs text-gray-500">{f.tempo}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p className="text-gray-300 text-sm mb-4">{f.descricao}</p>
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<div className="flex gap-2">
|
||||||
|
{f.tags.map(tag => (
|
||||||
|
<span key={tag} className="px-2 py-1 bg-[#cbf400]/10 text-[#cbf400] rounded text-xs">
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<ArrowRight className="w-5 h-5 text-gray-500 group-hover:text-[#cbf400] transition-colors" />
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Beneficios */}
|
||||||
|
<section className="py-12">
|
||||||
|
<div className="max-w-7xl mx-auto px-6">
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||||
|
<h2 className="text-2xl font-semibold text-white mb-6">Por que usar as Ferramentas Avanzato?</h2>
|
||||||
|
<div className="grid md:grid-cols-3 gap-4">
|
||||||
|
{beneficios.map((b) => (
|
||||||
|
<div key={b} className="flex items-center gap-3 text-gray-300">
|
||||||
|
<CheckCircle className="w-5 h-5 text-[#cbf400] shrink-0" />
|
||||||
|
{b}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* FAQ */}
|
||||||
|
<section className="py-12">
|
||||||
|
<div className="max-w-7xl mx-auto px-6">
|
||||||
|
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||||
|
<h2 className="text-2xl font-semibold text-white mb-6">Perguntas Frequentes</h2>
|
||||||
|
<div className="space-y-4">
|
||||||
|
{faqData.map((faq, i) => (
|
||||||
|
<div key={i} className="border-b border-[#2a2a2a] pb-4 last:border-0">
|
||||||
|
<h3 className="text-lg font-semibold text-[#cbf400] mb-2">{faq.q}</h3>
|
||||||
|
<p className="text-gray-300">{faq.a}</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* CTA */}
|
||||||
|
<section className="py-16">
|
||||||
|
<div className="max-w-7xl mx-auto px-6">
|
||||||
|
<div className="bg-gradient-to-r from-[#cbf400]/10 to-transparent rounded-2xl p-8 border border-[#cbf400]/30 text-center">
|
||||||
|
<h2 className="text-3xl font-bold text-white mb-4">
|
||||||
|
Precisa de ajuda com a infraestrutura de TI?
|
||||||
|
</h2>
|
||||||
|
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||||
|
Nossos especialistas podem avaliar seu ambiente e propor melhorias personalizadas.
|
||||||
|
</p>
|
||||||
|
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<Link to="/avaliacao" className="inline-flex items-center gap-2 bg-[#cbf400] text-[#0e0e0e] px-8 py-4 rounded-xl font-semibold hover:bg-[#b8e000] transition-colors">
|
||||||
|
Avaliacao Gratuita de TI
|
||||||
|
<ArrowRight className="w-5 h-5" />
|
||||||
|
</Link>
|
||||||
|
<Link to="/contato" className="inline-flex items-center gap-2 border border-[#cbf400] text-[#cbf400] px-8 py-4 rounded-xl font-semibold hover:bg-[#cbf400]/10 transition-colors">
|
||||||
|
Falar com Especialista
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Ferramentas;
|
||||||
+15
-9
@@ -143,11 +143,17 @@ const About = () => {
|
|||||||
{/* Image */}
|
{/* Image */}
|
||||||
<div ref={imageRef} className="relative">
|
<div ref={imageRef} className="relative">
|
||||||
<div className="relative rounded-2xl overflow-hidden shadow-2xl border border-white/5">
|
<div className="relative rounded-2xl overflow-hidden shadow-2xl border border-white/5">
|
||||||
<img
|
<picture>
|
||||||
src="/about-image.jpg"
|
<source srcSet="/about-image.webp" type="image/webp" />
|
||||||
alt="Equipe Avanzato"
|
<img
|
||||||
className="w-full h-auto object-cover"
|
src="/about-image.jpg"
|
||||||
/>
|
alt="Equipe Avanzato"
|
||||||
|
loading="lazy"
|
||||||
|
width="500"
|
||||||
|
height="685"
|
||||||
|
className="w-full h-auto object-cover"
|
||||||
|
/>
|
||||||
|
</picture>
|
||||||
|
|
||||||
{/* Glassmorphism overlay card */}
|
{/* Glassmorphism overlay card */}
|
||||||
<div className="absolute bottom-6 left-6 right-6 glass rounded-xl p-6 border border-[#cbf400]/20">
|
<div className="absolute bottom-6 left-6 right-6 glass rounded-xl p-6 border border-[#cbf400]/20">
|
||||||
@@ -222,28 +228,28 @@ const About = () => {
|
|||||||
>
|
>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Counter end={500} suffix="+" />
|
<Counter end={500} suffix="+" />
|
||||||
<div className="flex items-center justify-center gap-2 mt-2 text-gray-500">
|
<div className="flex items-center justify-center gap-2 mt-2 text-gray-400">
|
||||||
<Users className="w-4 h-4" />
|
<Users className="w-4 h-4" />
|
||||||
<span className="text-sm">Clientes atendidos</span>
|
<span className="text-sm">Clientes atendidos</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Counter end={99} suffix=".9%" />
|
<Counter end={99} suffix=".9%" />
|
||||||
<div className="flex items-center justify-center gap-2 mt-2 text-gray-500">
|
<div className="flex items-center justify-center gap-2 mt-2 text-gray-400">
|
||||||
<Clock className="w-4 h-4" />
|
<Clock className="w-4 h-4" />
|
||||||
<span className="text-sm">Uptime garantido</span>
|
<span className="text-sm">Uptime garantido</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Counter end={23} suffix="+" />
|
<Counter end={23} suffix="+" />
|
||||||
<div className="flex items-center justify-center gap-2 mt-2 text-gray-500">
|
<div className="flex items-center justify-center gap-2 mt-2 text-gray-400">
|
||||||
<Award className="w-4 h-4" />
|
<Award className="w-4 h-4" />
|
||||||
<span className="text-sm">Anos de experiência</span>
|
<span className="text-sm">Anos de experiência</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Counter end={24} suffix="/7" />
|
<Counter end={24} suffix="/7" />
|
||||||
<div className="flex items-center justify-center gap-2 mt-2 text-gray-500">
|
<div className="flex items-center justify-center gap-2 mt-2 text-gray-400">
|
||||||
<Users className="w-4 h-4" />
|
<Users className="w-4 h-4" />
|
||||||
<span className="text-sm">Suporte técnico</span>
|
<span className="text-sm">Suporte técnico</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ const CondominiosCTA = () => {
|
|||||||
<Phone className="w-6 h-6 text-[#cbf400]" />
|
<Phone className="w-6 h-6 text-[#cbf400]" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4 className="text-white font-bold">VOIP para Condomínios</h4>
|
<h3 className="text-white font-bold">VOIP para Condomínios</h3>
|
||||||
<p className="text-gray-500 text-sm">Comunicação moderna e econômica</p>
|
<p className="text-gray-500 text-sm">Comunicação moderna e econômica</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -127,7 +127,7 @@ const CondominiosCTA = () => {
|
|||||||
<Server className="w-6 h-6 text-blue-400" />
|
<Server className="w-6 h-6 text-blue-400" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4 className="text-white font-bold">Gestão de CPD</h4>
|
<h3 className="text-white font-bold">Gestão de CPD</h3>
|
||||||
<p className="text-gray-500 text-sm">Infraestrutura profissional</p>
|
<p className="text-gray-500 text-sm">Infraestrutura profissional</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -137,7 +137,7 @@ const CondominiosCTA = () => {
|
|||||||
<Wifi className="w-6 h-6 text-purple-400" />
|
<Wifi className="w-6 h-6 text-purple-400" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4 className="text-white font-bold">Rede e Conectividade</h4>
|
<h3 className="text-white font-bold">Rede e Conectividade</h3>
|
||||||
<p className="text-gray-500 text-sm">Alta disponibilidade</p>
|
<p className="text-gray-500 text-sm">Alta disponibilidade</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -147,7 +147,7 @@ const CondominiosCTA = () => {
|
|||||||
<Shield className="w-6 h-6 text-red-400" />
|
<Shield className="w-6 h-6 text-red-400" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h4 className="text-white font-bold">Segurança</h4>
|
<h3 className="text-white font-bold">Segurança</h3>
|
||||||
<p className="text-gray-500 text-sm">Monitoramento 24/7</p>
|
<p className="text-gray-500 text-sm">Monitoramento 24/7</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+12
-6
@@ -247,13 +247,19 @@ const Hero = () => {
|
|||||||
{/* Glow effect */}
|
{/* Glow effect */}
|
||||||
<div className="absolute -inset-4 bg-gradient-to-r from-[#cbf400]/20 to-[#cbf400]/10 rounded-2xl blur-2xl opacity-50" />
|
<div className="absolute -inset-4 bg-gradient-to-r from-[#cbf400]/20 to-[#cbf400]/10 rounded-2xl blur-2xl opacity-50" />
|
||||||
|
|
||||||
{/* Dashboard image */}
|
{/* Dashboard image com WebP + fetchpriority alta */}
|
||||||
<div className="relative rounded-2xl overflow-hidden shadow-2xl border border-[#cbf400]/20">
|
<div className="relative rounded-2xl overflow-hidden shadow-2xl border border-[#cbf400]/20">
|
||||||
<img
|
<picture>
|
||||||
src="/hero-dashboard.jpg"
|
<source srcSet="/hero-dashboard.webp" type="image/webp" />
|
||||||
alt="Dashboard Avanzato"
|
<img
|
||||||
className="w-full h-auto"
|
src="/hero-dashboard.jpg"
|
||||||
/>
|
alt="Dashboard Avanzato"
|
||||||
|
fetchPriority="high"
|
||||||
|
width="800"
|
||||||
|
height="500"
|
||||||
|
className="w-full h-auto"
|
||||||
|
/>
|
||||||
|
</picture>
|
||||||
|
|
||||||
{/* Glossy overlay */}
|
{/* Glossy overlay */}
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ const Navigation = () => {
|
|||||||
<div className="container-custom">
|
<div className="container-custom">
|
||||||
<div className="flex items-center justify-between h-20">
|
<div className="flex items-center justify-between h-20">
|
||||||
{/* Logo - importado de config/site.ts */}
|
{/* Logo - importado de config/site.ts */}
|
||||||
<Link to={LOGO.href} className="flex items-center">
|
<Link to={LOGO.href} className="flex items-center" aria-label="Avanzato Tecnologia - Pagina inicial">
|
||||||
{renderLogo()}
|
{renderLogo()}
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ const ServiceCard = ({ service }: { service: Service }) => {
|
|||||||
setMousePos({ x, y });
|
setMousePos({ x, y });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Gerar caminho WebP com fallback PNG/JPG
|
||||||
|
const webpImage = service.image.replace(/\.(png|jpg|jpeg)$/, '.webp');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
ref={cardRef}
|
ref={cardRef}
|
||||||
@@ -138,13 +141,19 @@ const ServiceCard = ({ service }: { service: Service }) => {
|
|||||||
setMousePos({ x: 0, y: 0 });
|
setMousePos({ x: 0, y: 0 });
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Image container */}
|
{/* Image container com WebP + lazy loading */}
|
||||||
<div className="relative h-48 bg-gradient-to-br from-[#2a2a2a] to-[#1a1a1a] overflow-hidden">
|
<div className="relative h-48 bg-gradient-to-br from-[#2a2a2a] to-[#1a1a1a] overflow-hidden">
|
||||||
<img
|
<picture>
|
||||||
src={service.image}
|
<source srcSet={webpImage} type="image/webp" />
|
||||||
alt={service.title}
|
<img
|
||||||
className="w-full h-full object-contain p-6 transition-transform duration-500 group-hover:scale-110"
|
src={service.image}
|
||||||
/>
|
alt={service.title}
|
||||||
|
loading="lazy"
|
||||||
|
width="300"
|
||||||
|
height="300"
|
||||||
|
className="w-full h-full object-contain p-6 transition-transform duration-500 group-hover:scale-110"
|
||||||
|
/>
|
||||||
|
</picture>
|
||||||
|
|
||||||
{/* Icon badge */}
|
{/* Icon badge */}
|
||||||
<div className="absolute top-4 left-4 w-12 h-12 rounded-xl bg-[#0e0e0e] shadow-lg flex items-center justify-center text-[#cbf400] border border-[#cbf400]/20">
|
<div className="absolute top-4 left-4 w-12 h-12 rounded-xl bg-[#0e0e0e] shadow-lg flex items-center justify-center text-[#cbf400] border border-[#cbf400]/20">
|
||||||
|
|||||||
Reference in New Issue
Block a user