Compare commits
51 Commits
2dc62486d7
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| dc697c8962 | |||
| 667447c389 | |||
| e3f35d808d | |||
| fdfb4606f0 | |||
| e5c18bb6fc | |||
| 6dfdf01830 | |||
| cd6bcf5b3d | |||
| 35e5727e60 | |||
| 96563b30e9 | |||
| 80dbb986f4 | |||
| 6db7b5200b | |||
| 52cda4304b | |||
| a85a6c9b3f | |||
| 2900b9afd9 | |||
| 433773c4b8 | |||
| 6140142bab | |||
| 529036bfe9 | |||
| 52f86cbba5 | |||
| 3eb41133f4 | |||
| e8f15d63ed | |||
| 24786e3512 | |||
| 7bcc582664 | |||
| 4f15851f09 | |||
| 15ce64e786 | |||
| 913e717a21 | |||
| aa275ef538 | |||
| 19f2848fec | |||
| 10e910eb6b | |||
| 9885f59b06 | |||
| d79c9c48a9 | |||
| 7f6c800ab0 | |||
| ec3e439973 | |||
| bfb022866b | |||
| be22792b6d | |||
| cb08c53b40 | |||
| 8c056b0c50 | |||
| b284c4d258 | |||
| 3d36e98185 | |||
| 4e26c13240 | |||
| 3e91269f12 | |||
| b3b8917a96 | |||
| d15474365c | |||
| e9f47c5b1e | |||
| af8ef2693d | |||
| 5b729b23be | |||
| 41312945d9 | |||
| bb73783e9f | |||
| 57c4abf055 | |||
| f493c55040 | |||
| 0a0d2382d1 | |||
| 47fdcab3b4 |
@@ -0,0 +1,37 @@
|
||||
name: Deploy PROD Avanzato
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
deploy-prod:
|
||||
runs-on: linux_amd64
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Instalar dependências
|
||||
run: npm install
|
||||
|
||||
- name: Build projeto
|
||||
run: npm run build
|
||||
|
||||
- name: Compactar dist
|
||||
run: tar -czf dist.tar.gz dist
|
||||
|
||||
- name: Enviar para servidor PROD
|
||||
run: scp -o StrictHostKeyChecking=no -i /data/avz_hml_deploy dist.tar.gz root@191.252.100.174:/tmp/avz-site-prod-dist.tar.gz
|
||||
|
||||
- name: Publicar PROD
|
||||
run: |
|
||||
ssh -o StrictHostKeyChecking=no -i /data/avz_hml_deploy root@191.252.100.174 '
|
||||
rm -rf /opt/avanzato/site/app/dist_old
|
||||
mv /opt/avanzato/site/app/dist /opt/avanzato/site/app/dist_old
|
||||
mkdir -p /opt/avanzato/site/app/dist
|
||||
tar -xzf /tmp/avz-site-prod-dist.tar.gz -C /opt/avanzato/site/app
|
||||
rm -f /tmp/avz-site-prod-dist.tar.gz
|
||||
docker restart avanzato-site
|
||||
'
|
||||
@@ -0,0 +1,135 @@
|
||||
# CI/CD - Avanzato Tecnologia
|
||||
|
||||
## Estrutura do Pipeline
|
||||
|
||||
```
|
||||
Push para main/master
|
||||
|
|
||||
v
|
||||
+------------------+ +------------------+ +------------------+
|
||||
| BUILD | --> | PRESERVAR ASSETS | --> | DEPLOY |
|
||||
| | | | | |
|
||||
| - Checkout | | - Logo | | - SCP para VPS |
|
||||
| - npm install | | - Imagens | | - Limpar cache |
|
||||
| - npm run build | | - Favicon | | - Notificar |
|
||||
+------------------+ +------------------+ +------------------+
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configurar Secrets no GitHub
|
||||
|
||||
Va em: **Settings > Secrets and variables > Actions > New repository secret**
|
||||
|
||||
| Secret | Descricao | Exemplo |
|
||||
|--------|-----------|---------|
|
||||
| `SSH_HOST` | IP ou dominio do servidor | `201.45.120.30` ou `avanzato.com.br` |
|
||||
| `SSH_USER` | Usuario SSH | `root` ou `deploy` |
|
||||
| `SSH_PRIVATE_KEY` | Chave SSH privada | `-----BEGIN OPENSSH PRIVATE KEY-----...` |
|
||||
| `SSH_PORT` | Porta SSH (opcional) | `22` |
|
||||
| `DEPLOY_PATH` | Caminho no servidor | `/var/www/avanzato` |
|
||||
| `STAGING_PATH` | Caminho staging (opcional) | `/var/www/avanzato-staging` |
|
||||
|
||||
### Como gerar a chave SSH:
|
||||
|
||||
```bash
|
||||
# No seu computador (NAO no servidor):
|
||||
ssh-keygen -t ed25519 -C "github-actions" -f ~/.ssh/github_actions
|
||||
|
||||
# Copiar publica para o servidor:
|
||||
ssh-copy-id -i ~/.ssh/github_actions.pub root@SEU_SERVIDOR
|
||||
|
||||
# Copiar privada para o GitHub Secret:
|
||||
cat ~/.ssh/github_actions
|
||||
# Cole o conteudo inteiro no secret SSH_PRIVATE_KEY
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Estrutura de Branches
|
||||
|
||||
```
|
||||
main/master --> Deploy automatico para producao
|
||||
staging --> Deploy automatico para staging (se existir)
|
||||
feature/* --> Apenas build (sem deploy)
|
||||
hotfix/* --> Apenas build (sem deploy)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Como Funciona
|
||||
|
||||
### Cenario 1: Deploy Automatico
|
||||
```
|
||||
1. Voce faz push para main
|
||||
2. GitHub Actions executa automaticamente
|
||||
3. Build + Deploy em ~2 minutos
|
||||
4. Site atualizado!
|
||||
```
|
||||
|
||||
### Cenario 2: Deploy Manual
|
||||
```
|
||||
1. Va em Actions > Build e Deploy
|
||||
2. Clique "Run workflow"
|
||||
3. Escolha: production ou staging
|
||||
4. Clique "Run"
|
||||
```
|
||||
|
||||
### Cenario 3: Pull Request
|
||||
```
|
||||
1. Cria PR para main
|
||||
2. CI executa build (testa se compila)
|
||||
3. NAO faz deploy
|
||||
4. Merge aprovado? Deploy automatico!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Assets Customizados (Logo, Imagens)
|
||||
|
||||
Para preservar assets apos o deploy automatico:
|
||||
|
||||
### 1. Commitar assets no repositorio
|
||||
|
||||
```bash
|
||||
git add custom-assets/logo/logo.png
|
||||
git add custom-assets/images/
|
||||
git commit -m "Adiciona logo e imagens customizadas"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### 2. O pipeline faz sozinho
|
||||
|
||||
O workflow executa automaticamente:
|
||||
```bash
|
||||
bash scripts/preserve-assets.sh dist/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Monitore os Deploys
|
||||
|
||||
- **GitHub Actions**: https://github.com/SEU_USUARIO/avanzato-site/actions
|
||||
- **Status**: Check verde = sucesso, X vermelho = falha
|
||||
- **Logs**: Clique no workflow para ver detalhes
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Deploy falhou?
|
||||
|
||||
1. **Verifique os secrets**: Settings > Secrets > Actions
|
||||
2. **Verifique a chave SSH**: `ssh -i ~/.ssh/github_actions root@SEU_SERVIDOR`
|
||||
3. **Verifique permissoes**: O usuario precisa de acesso de escrita no DEPLOY_PATH
|
||||
4. **Verifique logs**: Actions > Clique no workflow > Veja o passo que falhou
|
||||
|
||||
### Assets nao preservados?
|
||||
|
||||
1. Verifique se `custom-assets/` esta no repositorio
|
||||
2. Verifique se os arquivos estao comitados: `git ls-files custom-assets/`
|
||||
3. Verifique os logs do passo "Preservar assets customizados"
|
||||
|
||||
---
|
||||
|
||||
*Configurado em: Maio 2026*
|
||||
@@ -0,0 +1,162 @@
|
||||
# ============================================================================
|
||||
# CI/CD Pipeline - Avanzato Tecnologia
|
||||
# ============================================================================
|
||||
# Este workflow automatiza o build e deploy do site.
|
||||
#
|
||||
# TRIGGER: Push na branch main ou manual (workflow_dispatch)
|
||||
# ============================================================================
|
||||
|
||||
name: Build e Deploy
|
||||
|
||||
on:
|
||||
# Deploy automatico ao fazer push na main
|
||||
push:
|
||||
branches: [ main, master ]
|
||||
|
||||
# Deploy manual pelo botao "Run workflow" no GitHub
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
environment:
|
||||
description: 'Ambiente'
|
||||
required: true
|
||||
default: 'production'
|
||||
type: choice
|
||||
options:
|
||||
- production
|
||||
- staging
|
||||
|
||||
# Pull Request (apenas build, sem deploy)
|
||||
pull_request:
|
||||
branches: [ main, master ]
|
||||
|
||||
# Permissoes necessarias
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
# ==========================================================================
|
||||
# JOB 1: Build
|
||||
# ==========================================================================
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Passo 1: Checkout do codigo
|
||||
- name: Checkout codigo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Passo 2: Setup Node.js
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
# Passo 3: Instalar dependencias
|
||||
- name: Instalar dependencias
|
||||
run: npm ci
|
||||
|
||||
# Passo 4: Build
|
||||
- name: Build
|
||||
run: npm run build
|
||||
|
||||
# Passo 5: Upload do artefato (para usar no job de deploy)
|
||||
- name: Upload artefato
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
retention-days: 1
|
||||
|
||||
# ==========================================================================
|
||||
# JOB 2: Deploy para Servidor (Producao)
|
||||
# ==========================================================================
|
||||
deploy-production:
|
||||
name: Deploy - Producao
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
# So executa na branch main/master ou manual com environment=production
|
||||
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' || github.event.inputs.environment == 'production'
|
||||
|
||||
steps:
|
||||
# Passo 1: Download do artefato buildado
|
||||
- name: Download artefato
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
|
||||
# Passo 2: Preservar assets customizados (logo, imagens)
|
||||
- name: Preservar assets customizados
|
||||
run: |
|
||||
if [ -d "custom-assets" ]; then
|
||||
echo "Preservando assets customizados..."
|
||||
bash scripts/preserve-assets.sh dist/
|
||||
else
|
||||
echo "Nenhum asset customizado encontrado."
|
||||
fi
|
||||
|
||||
# Passo 3: Deploy via SCP (SSH)
|
||||
- name: Deploy para servidor
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.SSH_HOST }}
|
||||
username: ${{ secrets.SSH_USER }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
port: ${{ secrets.SSH_PORT || '22' }}
|
||||
source: "dist/*"
|
||||
target: ${{ secrets.DEPLOY_PATH || '/var/www/avanzato' }}
|
||||
strip_components: 1
|
||||
rm: true # Remove arquivos antigos antes de copiar
|
||||
|
||||
# Passo 4: Notificar (opcional - webhook Discord/Slack)
|
||||
- name: Notificar sucesso
|
||||
if: success()
|
||||
run: |
|
||||
echo "Deploy para producao concluido com sucesso!"
|
||||
echo "Site: https://avanzato.com.br"
|
||||
|
||||
# ==========================================================================
|
||||
# JOB 3: Deploy para Staging (Opcional)
|
||||
# ==========================================================================
|
||||
deploy-staging:
|
||||
name: Deploy - Staging
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
# So executa em push para branch staging ou manual
|
||||
if: github.ref == 'refs/heads/staging' || github.event.inputs.environment == 'staging'
|
||||
|
||||
steps:
|
||||
- name: Download artefato
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
|
||||
- name: Deploy para staging
|
||||
uses: appleboy/scp-action@v0.1.7
|
||||
with:
|
||||
host: ${{ secrets.SSH_HOST }}
|
||||
username: ${{ secrets.SSH_USER }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
port: ${{ secrets.SSH_PORT || '22' }}
|
||||
source: "dist/*"
|
||||
target: ${{ secrets.STAGING_PATH || '/var/www/avanzato-staging' }}
|
||||
strip_components: 1
|
||||
rm: true
|
||||
|
||||
# ==========================================================================
|
||||
# JOB 4: Notificacao de Falha
|
||||
# ==========================================================================
|
||||
notify-failure:
|
||||
name: Notificar Falha
|
||||
needs: [build, deploy-production]
|
||||
runs-on: ubuntu-latest
|
||||
if: failure()
|
||||
|
||||
steps:
|
||||
- name: Notificar falha
|
||||
run: |
|
||||
echo "ALERTA: O deploy falhou!"
|
||||
echo "Verifique os logs em: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Build
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Cache
|
||||
.cache
|
||||
.vite
|
||||
|
||||
# Dependencias
|
||||
node_modules
|
||||
|
||||
# Ambiente (NUNCA commite!)
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Editor
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Scripts de deploy local
|
||||
scripts/.env.local
|
||||
|
||||
# ZIPs internos (nunca commite!)
|
||||
*.zip
|
||||
avanzato-*.zip
|
||||
@@ -0,0 +1,95 @@
|
||||
# MAPA DE ATUACAO AVANZATO - Dados Reais
|
||||
|
||||
## Cidades Atendidas (com clientes)
|
||||
|
||||
### 1. Guarulhos (Matriz) - 11 clientes
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Dellacont | Contabilidade | Suporte + Servidor + Backup |
|
||||
| Madri | Contabilidade | Suporte + Servidor Nuvem + Backup |
|
||||
| Mouradi Naddi | Advocacia | Suporte + Servidor + Backup |
|
||||
| EFLAW | Advocacia | Suporte + Servidor + Backup |
|
||||
| Moraes Advogados | Advocacia | Suporte + Servidor + Backup |
|
||||
| Thalls | Industria | Suporte + Servidor + Backup + VoIP |
|
||||
| Ganiko | BPO | Suporte + Servidor Nuvem + Backup |
|
||||
| DCarvalho | Embalagens | Suporte + Servidor Nuvem + Backup |
|
||||
| Garuppy | Logistica | Suporte + Servidor Nuvem + Backup |
|
||||
| Premier | Monitoramento | Suporte + Servidor + Backup |
|
||||
| Condominio | VoIP | Interligacao aptos a portaria |
|
||||
|
||||
### 2. Mogi das Cruzes - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Alamo | Monitoramento | Suporte + Servidor + Backup |
|
||||
|
||||
### 3. Ipiranga (Sao Paulo) - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| ONG/Terceiro Setor | Institucional | Suporte + Servidor + Backup + Cloud + Seguranca |
|
||||
|
||||
### 4. Cerqueira Cesar (Sao Paulo) - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Museu de Faculdade Publica | Acervo Digital | Implantacao Tainacan + ICA-AtoM |
|
||||
|
||||
### 5. Vila Formosa (Sao Paulo) - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Apoio 24 Horas | Monitoramento | Servidores + pfSense + VPN + Suporte |
|
||||
|
||||
### 6. Ribeirao Preto - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| RMA | Portaria Remota | VoIP em Condominios |
|
||||
|
||||
### 7. Bras (Sao Paulo) - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Lucena Textil | Textil | Colocation + Rede + VPN + Backup |
|
||||
|
||||
### 8. Santana (Sao Paulo) - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Quantica Eletrica | Eventos | Suporte + Servidor Nuvem + Backup |
|
||||
|
||||
### 9. Mongagua - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| GateOne e Fox | Monitoramento | Servidores + pfSense + VPN + Suporte |
|
||||
|
||||
### 10. Sao Paulo / Cangaiba - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| RollPrime | VoIP | 2 Ramais VoIP |
|
||||
|
||||
### 11. Sao Paulo / Jurubatuba - 1 cliente
|
||||
| Cliente | Segmento | Servicos |
|
||||
|---------|----------|----------|
|
||||
| Piso.com | Piso de Borracha | Suporte + Servidor Nuvem + Backup (em negociacao) |
|
||||
|
||||
## Total: 20 clientes ativos em 11 localidades
|
||||
|
||||
## Segmentos Atendidos
|
||||
- Contabilidade (2)
|
||||
- Advocacia (3)
|
||||
- Industria (1)
|
||||
- BPO (1)
|
||||
- Embalagens (1)
|
||||
- Logistica (1)
|
||||
- Monitoramento (4)
|
||||
- Institucional (1)
|
||||
- Acervo Digital (1)
|
||||
- Portaria Remota (1)
|
||||
- Textil (1)
|
||||
- Eventos (1)
|
||||
- VoIP (2)
|
||||
- Piso de Borracha (1)
|
||||
|
||||
## Servicos Mais Vendidos (ranking)
|
||||
1. Suporte a Computadores (100% dos clientes)
|
||||
2. Administracao de Servidor (~80%)
|
||||
3. Backup (~80%)
|
||||
4. VPN (~40%)
|
||||
5. VoIP (~25%)
|
||||
6. Cloud (~15%)
|
||||
7. Seguranca/Colocation (~10%)
|
||||
Vendored
BIN
Binary file not shown.
Vendored
-246
File diff suppressed because one or more lines are too long
Vendored
-1
File diff suppressed because one or more lines are too long
Vendored
+42
-11
@@ -5,6 +5,36 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
|
||||
<!-- DETECAO DE AMBIENTE - Inline (executa antes de tudo) -->
|
||||
<script>
|
||||
(function() {
|
||||
var h = location.hostname;
|
||||
var IS_PROD = h === 'avanzato.com.br' || h === 'www.avanzato.com.br';
|
||||
|
||||
// Torna disponivel para outros scripts
|
||||
window.__IS_PROD__ = IS_PROD;
|
||||
|
||||
// Se NAO for producao, desativa tracking globalmente
|
||||
if (!IS_PROD) {
|
||||
window.__AVANZATO_ENV__ = h === 'hml.avanzato.com.br' ? 'homologation' : 'development';
|
||||
|
||||
// Bloqueia gtag
|
||||
window.dataLayer = { push: function(){} };
|
||||
window.gtag = function(){};
|
||||
|
||||
// Bloqueia fbq (Facebook Pixel)
|
||||
window.fbq = function(){};
|
||||
|
||||
// Bloqueia Mautic
|
||||
window.MauticSDKLoaded = true;
|
||||
|
||||
console.log('[Avanzato] Ambiente: ' + window.__AVANZATO_ENV__ + ' | Tracking bloqueado');
|
||||
} else {
|
||||
window.__AVANZATO_ENV__ = 'production';
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- Google tag (gtag.js) - Ads + Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-16714813566"></script>
|
||||
<script>
|
||||
@@ -70,6 +100,7 @@
|
||||
<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="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.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="author" content="Avanzato Tecnologia" />
|
||||
<meta name="robots" content="index, follow" id="meta-robots" />
|
||||
@@ -78,9 +109,9 @@
|
||||
<!-- BLOQUEAR INDEXACAO EM HOMOLOGACAO -->
|
||||
<script>
|
||||
(function() {
|
||||
var hostname = window.location.hostname;
|
||||
if (hostname !== 'avanzato.com.br') {
|
||||
// Homologacao: bloquear indexacao
|
||||
// Usa IS_PROD ja definido no inicio do documento
|
||||
if (!window.__IS_PROD__) {
|
||||
// Homologacao/Desenvolvimento: bloquear indexacao
|
||||
document.getElementById('meta-robots').setAttribute('content', 'noindex, nofollow');
|
||||
document.getElementById('meta-googlebot').setAttribute('content', 'noindex, nofollow');
|
||||
// Adicionar tambem X-Robots-Tag via meta http-equiv
|
||||
@@ -88,7 +119,9 @@
|
||||
meta.httpEquiv = 'X-Robots-Tag';
|
||||
meta.content = 'noindex, nofollow';
|
||||
document.head.appendChild(meta);
|
||||
console.log('%c[SEO] Homologacao detectada - indexacao BLOQUEADA (noindex, nofollow)', 'background:#dc2626;color:#fff;font-weight:bold;padding:2px 6px;border-radius:3px');
|
||||
console.log('%c[SEO] ' + (window.__AVANZATO_ENV__ || 'nao-producao') + ' - indexacao BLOQUEADA', 'background:#dc2626;color:#fff;font-weight:bold;padding:2px 6px;border-radius:3px');
|
||||
} else {
|
||||
console.log('%c[SEO] Producao - indexacao PERMITIDA (index, follow)', 'background:#16a34a;color:#fff;font-weight:bold;padding:2px 6px;border-radius:3px');
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
@@ -113,11 +146,9 @@
|
||||
<meta property="twitter:image" content="https://avanzato.com.br/og-image.jpg" />
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
||||
<link rel="manifest" href="./site.webmanifest" />
|
||||
<link rel="icon" type="image/png" href="https://avanzato.com.br/favicon.png" />
|
||||
<link rel="shortcut icon" type="image/png" href="https://avanzato.com.br/favicon.png" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
|
||||
<!-- Theme Color -->
|
||||
<meta name="theme-color" content="#cbf400" />
|
||||
@@ -208,8 +239,8 @@
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script type="module" crossorigin src="./assets/index-C1GgsDvQ.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-Cg4oF5jQ.css">
|
||||
<script type="module" crossorigin src="/assets/index-DLMsdH5y.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-8ILJAHKZ.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
Vendored
+10
-23
@@ -1,26 +1,13 @@
|
||||
# =============================================================================
|
||||
# ROBOTS.TXT - VERSAO HOMOLOGACAO/DESENVOLVIMENTO
|
||||
# =============================================================================
|
||||
# Este arquivo BLOQUEIA TODOS os crawlers.
|
||||
#
|
||||
# Para PRODUCAO (avanzato.com.br), substitua por:
|
||||
# User-agent: *
|
||||
# Allow: /
|
||||
# Sitemap: https://avanzato.com.br/sitemap.xml
|
||||
# =============================================================================
|
||||
# ============================================================================
|
||||
# AVANZATO TECNOLOGIA - ROBOTS.TXT (GENERICO)
|
||||
# ============================================================================
|
||||
# O controle real de indexacao e feito pelo <meta name="robots"> no HTML:
|
||||
# - Producao (avanzato.com.br): index, follow
|
||||
# - Homologacao (hml.avanzato.com.br): noindex, nofollow
|
||||
# - Desenvolvimento (localhost): noindex, nofollow
|
||||
# ============================================================================
|
||||
|
||||
User-agent: *
|
||||
Disallow: /
|
||||
Allow: /
|
||||
|
||||
# Bloqueio explicito de todos os bots
|
||||
User-agent: Googlebot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Bingbot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Slurp
|
||||
Disallow: /
|
||||
|
||||
# Sitemap comentado (descomente em producao)
|
||||
# Sitemap: https://avanzato.com.br/sitemap.xml
|
||||
Sitemap: https://avanzato.com.br/sitemap.xml
|
||||
|
||||
Vendored
+116
@@ -165,4 +165,120 @@
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
|
||||
<!-- SEO Local - Onde Atuamos -->
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/onde-atuamos</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-guarulhos</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-mogi-das-cruzes</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-ipiranga</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-vila-formosa</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-cerqueira-cesar</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-santana</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-bras</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-ribeirao-preto</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
|
||||
<!-- Nichos adicionais -->
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-industria</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-portaria-remota</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-clinicas</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-imobiliarias</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-recrutamento-selecao</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</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>
|
||||
|
||||
+37
-4
@@ -5,6 +5,36 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
|
||||
<!-- DETECAO DE AMBIENTE - Inline (executa antes de tudo) -->
|
||||
<script>
|
||||
(function() {
|
||||
var h = location.hostname;
|
||||
var IS_PROD = h === 'avanzato.com.br' || h === 'www.avanzato.com.br';
|
||||
|
||||
// Torna disponivel para outros scripts
|
||||
window.__IS_PROD__ = IS_PROD;
|
||||
|
||||
// Se NAO for producao, desativa tracking globalmente
|
||||
if (!IS_PROD) {
|
||||
window.__AVANZATO_ENV__ = h === 'hml.avanzato.com.br' ? 'homologation' : 'development';
|
||||
|
||||
// Bloqueia gtag
|
||||
window.dataLayer = { push: function(){} };
|
||||
window.gtag = function(){};
|
||||
|
||||
// Bloqueia fbq (Facebook Pixel)
|
||||
window.fbq = function(){};
|
||||
|
||||
// Bloqueia Mautic
|
||||
window.MauticSDKLoaded = true;
|
||||
|
||||
console.log('[Avanzato] Ambiente: ' + window.__AVANZATO_ENV__ + ' | Tracking bloqueado');
|
||||
} else {
|
||||
window.__AVANZATO_ENV__ = 'production';
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- Google tag (gtag.js) - Ads + Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-16714813566"></script>
|
||||
<script>
|
||||
@@ -70,6 +100,7 @@
|
||||
<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="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.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="author" content="Avanzato Tecnologia" />
|
||||
<meta name="robots" content="index, follow" id="meta-robots" />
|
||||
@@ -78,9 +109,9 @@
|
||||
<!-- BLOQUEAR INDEXACAO EM HOMOLOGACAO -->
|
||||
<script>
|
||||
(function() {
|
||||
var hostname = window.location.hostname;
|
||||
if (hostname !== 'avanzato.com.br') {
|
||||
// Homologacao: bloquear indexacao
|
||||
// Usa IS_PROD ja definido no inicio do documento
|
||||
if (!window.__IS_PROD__) {
|
||||
// Homologacao/Desenvolvimento: bloquear indexacao
|
||||
document.getElementById('meta-robots').setAttribute('content', 'noindex, nofollow');
|
||||
document.getElementById('meta-googlebot').setAttribute('content', 'noindex, nofollow');
|
||||
// Adicionar tambem X-Robots-Tag via meta http-equiv
|
||||
@@ -88,7 +119,9 @@
|
||||
meta.httpEquiv = 'X-Robots-Tag';
|
||||
meta.content = 'noindex, nofollow';
|
||||
document.head.appendChild(meta);
|
||||
console.log('%c[SEO] Homologacao detectada - indexacao BLOQUEADA (noindex, nofollow)', 'background:#dc2626;color:#fff;font-weight:bold;padding:2px 6px;border-radius:3px');
|
||||
console.log('%c[SEO] ' + (window.__AVANZATO_ENV__ || 'nao-producao') + ' - indexacao BLOQUEADA', 'background:#dc2626;color:#fff;font-weight:bold;padding:2px 6px;border-radius:3px');
|
||||
} else {
|
||||
console.log('%c[SEO] Producao - indexacao PERMITIDA (index, follow)', 'background:#16a34a;color:#fff;font-weight:bold;padding:2px 6px;border-radius:3px');
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: sáb 30 mai 2026 19:30:29 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Atualização e correção de diretorios
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
bb73783
|
||||
|
||||
Último commit develop:
|
||||
146652a
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: sáb 30 mai 2026 20:36:09 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Favivon - Correção
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
5b729b23
|
||||
|
||||
Último commit develop:
|
||||
643f628a
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -1,33 +0,0 @@
|
||||
# Release HML
|
||||
|
||||
Data: sáb 30 mai 2026 23:14:48 -03
|
||||
|
||||
Ambiente:
|
||||
HML
|
||||
|
||||
Descrição:
|
||||
Favivon - Correção
|
||||
|
||||
Branch:
|
||||
develop
|
||||
|
||||
Arquivos alterados antes do commit:
|
||||
M package-lock.json
|
||||
M src/sections/Footer.tsx
|
||||
?? infra/releases/2026-05-30_23-14-47_HML.md
|
||||
?? public/favicon.png
|
||||
|
||||
Status:
|
||||
Preparado para publicação
|
||||
|
||||
Commit:
|
||||
643f4a3f
|
||||
|
||||
Arquivos no commit:
|
||||
infra/releases/2026-05-30_23-14-47_HML.md
|
||||
package-lock.json
|
||||
public/favicon.png
|
||||
src/sections/Footer.tsx
|
||||
|
||||
Status final:
|
||||
Publicado no Gitea / aguardando pipeline HML
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: sáb 30 mai 2026 23:15:11 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Favivon - Correção
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
e9f47c5b
|
||||
|
||||
Último commit develop:
|
||||
2dc62486
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: dom 31 mai 2026 00:03:02 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Revisão Logo, Favicon, Robots
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
b284c4d2
|
||||
|
||||
Último commit develop:
|
||||
3d36e981
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: dom 31 mai 2026 00:29:03 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Revisão Logo, Favicon, Robots
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
bfb02286
|
||||
|
||||
Último commit develop:
|
||||
be22792b
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: dom 31 mai 2026 00:58:08 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Revisão Logo, Favicon, Robots
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
9885f59b
|
||||
|
||||
Último commit develop:
|
||||
d79c9c48
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: seg 1 jun 2026 19:44:45 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Paginas e SEO master
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
4f15851f
|
||||
|
||||
Último commit develop:
|
||||
15ce64e7
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: seg 1 jun 2026 19:56:50 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Paginas e SEO master
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
3eb41133
|
||||
|
||||
Último commit develop:
|
||||
e8f15d63
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: seg 1 jun 2026 20:28:34 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Paginas e SEO master
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
52f86cbb
|
||||
|
||||
Último commit develop:
|
||||
e8f15d63
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
infra/releases/2026-06-01_19-56-50_PROD.md
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -0,0 +1,24 @@
|
||||
# Release PROD
|
||||
|
||||
Data: ter 2 jun 2026 14:21:07 -03
|
||||
|
||||
Ambiente:
|
||||
PROD
|
||||
|
||||
Descrição:
|
||||
Paginas e SEO master, correção javascript google
|
||||
|
||||
Branch:
|
||||
main
|
||||
|
||||
Commit:
|
||||
35e5727e
|
||||
|
||||
Último commit develop:
|
||||
96563b30
|
||||
|
||||
Arquivos alterados no último commit:
|
||||
|
||||
|
||||
Status:
|
||||
Preparado para publicação em produção
|
||||
@@ -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
+4
-4
@@ -1,7 +1,7 @@
|
||||
"use client";
|
||||
import {
|
||||
Presence
|
||||
} from "./chunk-KKEH7IGY.js";
|
||||
} from "./chunk-INCCO7S4.js";
|
||||
import {
|
||||
Combination_default,
|
||||
DismissableLayer,
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
Portal,
|
||||
hideOthers,
|
||||
useFocusGuards
|
||||
} from "./chunk-QF76HVLY.js";
|
||||
} from "./chunk-LIWCVBQK.js";
|
||||
import {
|
||||
Primitive,
|
||||
composeEventHandlers,
|
||||
@@ -17,12 +17,12 @@ import {
|
||||
createContextScope,
|
||||
useControllableState,
|
||||
useId
|
||||
} from "./chunk-X34PLQQA.js";
|
||||
import "./chunk-YF4B4G2L.js";
|
||||
} from "./chunk-MOFDO34C.js";
|
||||
import {
|
||||
composeRefs,
|
||||
useComposedRefs
|
||||
} from "./chunk-2VUH7NEY.js";
|
||||
import "./chunk-YF4B4G2L.js";
|
||||
import {
|
||||
require_jsx_runtime
|
||||
} from "./chunk-2YVA4HRZ.js";
|
||||
|
||||
+1
-1
@@ -2,10 +2,10 @@
|
||||
import {
|
||||
createSlot
|
||||
} from "./chunk-YWBEB5PG.js";
|
||||
import "./chunk-2VUH7NEY.js";
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
import "./chunk-2VUH7NEY.js";
|
||||
import {
|
||||
require_jsx_runtime
|
||||
} from "./chunk-2YVA4HRZ.js";
|
||||
|
||||
+6
-6
@@ -1,13 +1,13 @@
|
||||
"use client";
|
||||
import {
|
||||
Presence
|
||||
} from "./chunk-INCCO7S4.js";
|
||||
import {
|
||||
createCollection,
|
||||
useDirection,
|
||||
usePrevious,
|
||||
useSize
|
||||
} from "./chunk-D4MYACAJ.js";
|
||||
import {
|
||||
Presence
|
||||
} from "./chunk-KKEH7IGY.js";
|
||||
} from "./chunk-L2OGOWTU.js";
|
||||
import {
|
||||
Primitive,
|
||||
composeEventHandlers,
|
||||
@@ -15,11 +15,11 @@ import {
|
||||
useCallbackRef,
|
||||
useControllableState,
|
||||
useId
|
||||
} from "./chunk-X34PLQQA.js";
|
||||
import "./chunk-YF4B4G2L.js";
|
||||
} from "./chunk-MOFDO34C.js";
|
||||
import {
|
||||
useComposedRefs
|
||||
} from "./chunk-2VUH7NEY.js";
|
||||
import "./chunk-YF4B4G2L.js";
|
||||
import {
|
||||
require_jsx_runtime
|
||||
} from "./chunk-2YVA4HRZ.js";
|
||||
|
||||
+11
-11
@@ -1,10 +1,4 @@
|
||||
"use client";
|
||||
import {
|
||||
createCollection,
|
||||
useDirection,
|
||||
usePrevious,
|
||||
useSize
|
||||
} from "./chunk-D4MYACAJ.js";
|
||||
import {
|
||||
Combination_default,
|
||||
DismissableLayer,
|
||||
@@ -12,7 +6,13 @@ import {
|
||||
Portal,
|
||||
hideOthers,
|
||||
useFocusGuards
|
||||
} from "./chunk-QF76HVLY.js";
|
||||
} from "./chunk-LIWCVBQK.js";
|
||||
import {
|
||||
createCollection,
|
||||
useDirection,
|
||||
usePrevious,
|
||||
useSize
|
||||
} from "./chunk-L2OGOWTU.js";
|
||||
import {
|
||||
Primitive,
|
||||
composeEventHandlers,
|
||||
@@ -21,14 +21,14 @@ import {
|
||||
useControllableState,
|
||||
useId,
|
||||
useLayoutEffect2
|
||||
} from "./chunk-X34PLQQA.js";
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
} from "./chunk-MOFDO34C.js";
|
||||
import {
|
||||
composeRefs,
|
||||
useComposedRefs
|
||||
} from "./chunk-2VUH7NEY.js";
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
import {
|
||||
require_jsx_runtime
|
||||
} from "./chunk-2YVA4HRZ.js";
|
||||
|
||||
+29
-29
@@ -7,109 +7,109 @@
|
||||
"react": {
|
||||
"src": "../../react/index.js",
|
||||
"file": "react.js",
|
||||
"fileHash": "5b37d437",
|
||||
"fileHash": "dd97ceba",
|
||||
"needsInterop": true
|
||||
},
|
||||
"react-dom": {
|
||||
"src": "../../react-dom/index.js",
|
||||
"file": "react-dom.js",
|
||||
"fileHash": "a8665bbc",
|
||||
"fileHash": "8becf687",
|
||||
"needsInterop": true
|
||||
},
|
||||
"react/jsx-dev-runtime": {
|
||||
"src": "../../react/jsx-dev-runtime.js",
|
||||
"file": "react_jsx-dev-runtime.js",
|
||||
"fileHash": "5962ef4b",
|
||||
"fileHash": "2c7217d2",
|
||||
"needsInterop": true
|
||||
},
|
||||
"react/jsx-runtime": {
|
||||
"src": "../../react/jsx-runtime.js",
|
||||
"file": "react_jsx-runtime.js",
|
||||
"fileHash": "cc4583ea",
|
||||
"fileHash": "e28ec614",
|
||||
"needsInterop": true
|
||||
},
|
||||
"@radix-ui/react-dialog": {
|
||||
"src": "../../@radix-ui/react-dialog/dist/index.mjs",
|
||||
"file": "@radix-ui_react-dialog.js",
|
||||
"fileHash": "e65a7fe9",
|
||||
"fileHash": "22041c72",
|
||||
"needsInterop": false
|
||||
},
|
||||
"@radix-ui/react-label": {
|
||||
"src": "../../@radix-ui/react-label/dist/index.mjs",
|
||||
"file": "@radix-ui_react-label.js",
|
||||
"fileHash": "d5676393",
|
||||
"fileHash": "d33ac0ed",
|
||||
"needsInterop": false
|
||||
},
|
||||
"@radix-ui/react-radio-group": {
|
||||
"src": "../../@radix-ui/react-radio-group/dist/index.mjs",
|
||||
"file": "@radix-ui_react-radio-group.js",
|
||||
"fileHash": "8a90e2b5",
|
||||
"fileHash": "2be9d4b7",
|
||||
"needsInterop": false
|
||||
},
|
||||
"@radix-ui/react-select": {
|
||||
"src": "../../@radix-ui/react-select/dist/index.mjs",
|
||||
"file": "@radix-ui_react-select.js",
|
||||
"fileHash": "0b10fc7e",
|
||||
"fileHash": "51dd47da",
|
||||
"needsInterop": false
|
||||
},
|
||||
"@radix-ui/react-slot": {
|
||||
"src": "../../@radix-ui/react-slot/dist/index.mjs",
|
||||
"file": "@radix-ui_react-slot.js",
|
||||
"fileHash": "c8dbd881",
|
||||
"fileHash": "32dfa860",
|
||||
"needsInterop": false
|
||||
},
|
||||
"class-variance-authority": {
|
||||
"src": "../../class-variance-authority/dist/index.mjs",
|
||||
"file": "class-variance-authority.js",
|
||||
"fileHash": "5acda8ac",
|
||||
"fileHash": "f4a8c6f4",
|
||||
"needsInterop": false
|
||||
},
|
||||
"clsx": {
|
||||
"src": "../../clsx/dist/clsx.mjs",
|
||||
"file": "clsx.js",
|
||||
"fileHash": "694a54a4",
|
||||
"fileHash": "e5a299ae",
|
||||
"needsInterop": false
|
||||
},
|
||||
"gsap": {
|
||||
"src": "../../gsap/index.js",
|
||||
"file": "gsap.js",
|
||||
"fileHash": "7ddb7298",
|
||||
"fileHash": "76791308",
|
||||
"needsInterop": false
|
||||
},
|
||||
"gsap/ScrollTrigger": {
|
||||
"src": "../../gsap/ScrollTrigger.js",
|
||||
"file": "gsap_ScrollTrigger.js",
|
||||
"fileHash": "a71932dd",
|
||||
"fileHash": "187ec0aa",
|
||||
"needsInterop": false
|
||||
},
|
||||
"lucide-react": {
|
||||
"src": "../../lucide-react/dist/esm/lucide-react.js",
|
||||
"file": "lucide-react.js",
|
||||
"fileHash": "6ea882ab",
|
||||
"fileHash": "58304198",
|
||||
"needsInterop": false
|
||||
},
|
||||
"react-dom/client": {
|
||||
"src": "../../react-dom/client.js",
|
||||
"file": "react-dom_client.js",
|
||||
"fileHash": "f07d8307",
|
||||
"fileHash": "b30625c8",
|
||||
"needsInterop": true
|
||||
},
|
||||
"react-helmet-async": {
|
||||
"src": "../../react-helmet-async/lib/index.esm.js",
|
||||
"file": "react-helmet-async.js",
|
||||
"fileHash": "b7d7d0af",
|
||||
"fileHash": "79a82144",
|
||||
"needsInterop": false
|
||||
},
|
||||
"react-router-dom": {
|
||||
"src": "../../react-router-dom/dist/index.mjs",
|
||||
"file": "react-router-dom.js",
|
||||
"fileHash": "9ac7c1ba",
|
||||
"fileHash": "4427109e",
|
||||
"needsInterop": false
|
||||
},
|
||||
"tailwind-merge": {
|
||||
"src": "../../tailwind-merge/dist/bundle-mjs.mjs",
|
||||
"file": "tailwind-merge.js",
|
||||
"fileHash": "0cfdfcd3",
|
||||
"fileHash": "9511be49",
|
||||
"needsInterop": false
|
||||
}
|
||||
},
|
||||
@@ -117,27 +117,27 @@
|
||||
"chunk-U7P2NEEE": {
|
||||
"file": "chunk-U7P2NEEE.js"
|
||||
},
|
||||
"chunk-D4MYACAJ": {
|
||||
"file": "chunk-D4MYACAJ.js"
|
||||
},
|
||||
"chunk-YWBEB5PG": {
|
||||
"file": "chunk-YWBEB5PG.js"
|
||||
},
|
||||
"chunk-KKEH7IGY": {
|
||||
"file": "chunk-KKEH7IGY.js"
|
||||
"chunk-INCCO7S4": {
|
||||
"file": "chunk-INCCO7S4.js"
|
||||
},
|
||||
"chunk-QF76HVLY": {
|
||||
"file": "chunk-QF76HVLY.js"
|
||||
"chunk-LIWCVBQK": {
|
||||
"file": "chunk-LIWCVBQK.js"
|
||||
},
|
||||
"chunk-X34PLQQA": {
|
||||
"file": "chunk-X34PLQQA.js"
|
||||
"chunk-L2OGOWTU": {
|
||||
"file": "chunk-L2OGOWTU.js"
|
||||
},
|
||||
"chunk-YF4B4G2L": {
|
||||
"file": "chunk-YF4B4G2L.js"
|
||||
"chunk-MOFDO34C": {
|
||||
"file": "chunk-MOFDO34C.js"
|
||||
},
|
||||
"chunk-2VUH7NEY": {
|
||||
"file": "chunk-2VUH7NEY.js"
|
||||
},
|
||||
"chunk-YF4B4G2L": {
|
||||
"file": "chunk-YF4B4G2L.js"
|
||||
},
|
||||
"chunk-2YVA4HRZ": {
|
||||
"file": "chunk-2YVA4HRZ.js"
|
||||
},
|
||||
|
||||
Generated
Vendored
+2
-2
@@ -1,6 +1,6 @@
|
||||
import {
|
||||
useLayoutEffect2
|
||||
} from "./chunk-X34PLQQA.js";
|
||||
} from "./chunk-MOFDO34C.js";
|
||||
import {
|
||||
useComposedRefs
|
||||
} from "./chunk-2VUH7NEY.js";
|
||||
@@ -140,4 +140,4 @@ function getElementRef(element) {
|
||||
export {
|
||||
Presence
|
||||
};
|
||||
//# sourceMappingURL=chunk-KKEH7IGY.js.map
|
||||
//# sourceMappingURL=chunk-INCCO7S4.js.map
|
||||
Generated
Vendored
Generated
Vendored
+2
-2
@@ -1,7 +1,7 @@
|
||||
import {
|
||||
createContextScope,
|
||||
useLayoutEffect2
|
||||
} from "./chunk-X34PLQQA.js";
|
||||
} from "./chunk-MOFDO34C.js";
|
||||
import {
|
||||
composeRefs,
|
||||
useComposedRefs
|
||||
@@ -245,4 +245,4 @@ export {
|
||||
useSize,
|
||||
usePrevious
|
||||
};
|
||||
//# sourceMappingURL=chunk-D4MYACAJ.js.map
|
||||
//# sourceMappingURL=chunk-L2OGOWTU.js.map
|
||||
Generated
Vendored
Generated
Vendored
+165
-165
@@ -4,13 +4,13 @@ import {
|
||||
dispatchDiscreteCustomEvent,
|
||||
useCallbackRef,
|
||||
useLayoutEffect2
|
||||
} from "./chunk-X34PLQQA.js";
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
} from "./chunk-MOFDO34C.js";
|
||||
import {
|
||||
useComposedRefs
|
||||
} from "./chunk-2VUH7NEY.js";
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
import {
|
||||
require_jsx_runtime
|
||||
} from "./chunk-2YVA4HRZ.js";
|
||||
@@ -244,42 +244,14 @@ function handleAndDispatchCustomEvent(name, handler, detail, { discrete }) {
|
||||
}
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-focus-guards/dist/index.mjs
|
||||
var React3 = __toESM(require_react(), 1);
|
||||
var count = 0;
|
||||
function useFocusGuards() {
|
||||
React3.useEffect(() => {
|
||||
const edgeGuards = document.querySelectorAll("[data-radix-focus-guard]");
|
||||
document.body.insertAdjacentElement("afterbegin", edgeGuards[0] ?? createFocusGuard());
|
||||
document.body.insertAdjacentElement("beforeend", edgeGuards[1] ?? createFocusGuard());
|
||||
count++;
|
||||
return () => {
|
||||
if (count === 1) {
|
||||
document.querySelectorAll("[data-radix-focus-guard]").forEach((node) => node.remove());
|
||||
}
|
||||
count--;
|
||||
};
|
||||
}, []);
|
||||
}
|
||||
function createFocusGuard() {
|
||||
const element = document.createElement("span");
|
||||
element.setAttribute("data-radix-focus-guard", "");
|
||||
element.tabIndex = 0;
|
||||
element.style.outline = "none";
|
||||
element.style.opacity = "0";
|
||||
element.style.position = "fixed";
|
||||
element.style.pointerEvents = "none";
|
||||
return element;
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-focus-scope/dist/index.mjs
|
||||
var React4 = __toESM(require_react(), 1);
|
||||
var React3 = __toESM(require_react(), 1);
|
||||
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
|
||||
var AUTOFOCUS_ON_MOUNT = "focusScope.autoFocusOnMount";
|
||||
var AUTOFOCUS_ON_UNMOUNT = "focusScope.autoFocusOnUnmount";
|
||||
var EVENT_OPTIONS = { bubbles: false, cancelable: true };
|
||||
var FOCUS_SCOPE_NAME = "FocusScope";
|
||||
var FocusScope = React4.forwardRef((props, forwardedRef) => {
|
||||
var FocusScope = React3.forwardRef((props, forwardedRef) => {
|
||||
const {
|
||||
loop = false,
|
||||
trapped = false,
|
||||
@@ -287,12 +259,12 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
|
||||
onUnmountAutoFocus: onUnmountAutoFocusProp,
|
||||
...scopeProps
|
||||
} = props;
|
||||
const [container, setContainer] = React4.useState(null);
|
||||
const [container, setContainer] = React3.useState(null);
|
||||
const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp);
|
||||
const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp);
|
||||
const lastFocusedElementRef = React4.useRef(null);
|
||||
const lastFocusedElementRef = React3.useRef(null);
|
||||
const composedRefs = useComposedRefs(forwardedRef, (node) => setContainer(node));
|
||||
const focusScope = React4.useRef({
|
||||
const focusScope = React3.useRef({
|
||||
paused: false,
|
||||
pause() {
|
||||
this.paused = true;
|
||||
@@ -301,7 +273,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
|
||||
this.paused = false;
|
||||
}
|
||||
}).current;
|
||||
React4.useEffect(() => {
|
||||
React3.useEffect(() => {
|
||||
if (trapped) {
|
||||
let handleFocusIn2 = function(event) {
|
||||
if (focusScope.paused || !container) return;
|
||||
@@ -337,7 +309,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
|
||||
};
|
||||
}
|
||||
}, [trapped, container, focusScope.paused]);
|
||||
React4.useEffect(() => {
|
||||
React3.useEffect(() => {
|
||||
if (container) {
|
||||
focusScopesStack.add(focusScope);
|
||||
const previouslyFocusedElement = document.activeElement;
|
||||
@@ -368,7 +340,7 @@ var FocusScope = React4.forwardRef((props, forwardedRef) => {
|
||||
};
|
||||
}
|
||||
}, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]);
|
||||
const handleKeyDown = React4.useCallback(
|
||||
const handleKeyDown = React3.useCallback(
|
||||
(event) => {
|
||||
if (!loop && !trapped) return;
|
||||
if (focusScope.paused) return;
|
||||
@@ -477,139 +449,46 @@ function removeLinks(items) {
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-portal/dist/index.mjs
|
||||
var React5 = __toESM(require_react(), 1);
|
||||
var React4 = __toESM(require_react(), 1);
|
||||
var import_react_dom = __toESM(require_react_dom(), 1);
|
||||
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
|
||||
var PORTAL_NAME = "Portal";
|
||||
var Portal = React5.forwardRef((props, forwardedRef) => {
|
||||
var Portal = React4.forwardRef((props, forwardedRef) => {
|
||||
const { container: containerProp, ...portalProps } = props;
|
||||
const [mounted, setMounted] = React5.useState(false);
|
||||
const [mounted, setMounted] = React4.useState(false);
|
||||
useLayoutEffect2(() => setMounted(true), []);
|
||||
const container = containerProp || mounted && globalThis?.document?.body;
|
||||
return container ? import_react_dom.default.createPortal((0, import_jsx_runtime3.jsx)(Primitive.div, { ...portalProps, ref: forwardedRef }), container) : null;
|
||||
});
|
||||
Portal.displayName = PORTAL_NAME;
|
||||
|
||||
// node_modules/aria-hidden/dist/es2015/index.js
|
||||
var getDefaultParent = function(originalTarget) {
|
||||
if (typeof document === "undefined") {
|
||||
return null;
|
||||
}
|
||||
var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
|
||||
return sampleTarget.ownerDocument.body;
|
||||
};
|
||||
var counterMap = /* @__PURE__ */ new WeakMap();
|
||||
var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
||||
var markerMap = {};
|
||||
var lockCount = 0;
|
||||
var unwrapHost = function(node) {
|
||||
return node && (node.host || unwrapHost(node.parentNode));
|
||||
};
|
||||
var correctTargets = function(parent, targets) {
|
||||
return targets.map(function(target) {
|
||||
if (parent.contains(target)) {
|
||||
return target;
|
||||
}
|
||||
var correctedTarget = unwrapHost(target);
|
||||
if (correctedTarget && parent.contains(correctedTarget)) {
|
||||
return correctedTarget;
|
||||
}
|
||||
console.error("aria-hidden", target, "in not contained inside", parent, ". Doing nothing");
|
||||
return null;
|
||||
}).filter(function(x) {
|
||||
return Boolean(x);
|
||||
});
|
||||
};
|
||||
var applyAttributeToOthers = function(originalTarget, parentNode, markerName, controlAttribute) {
|
||||
var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
|
||||
if (!markerMap[markerName]) {
|
||||
markerMap[markerName] = /* @__PURE__ */ new WeakMap();
|
||||
}
|
||||
var markerCounter = markerMap[markerName];
|
||||
var hiddenNodes = [];
|
||||
var elementsToKeep = /* @__PURE__ */ new Set();
|
||||
var elementsToStop = new Set(targets);
|
||||
var keep = function(el) {
|
||||
if (!el || elementsToKeep.has(el)) {
|
||||
return;
|
||||
}
|
||||
elementsToKeep.add(el);
|
||||
keep(el.parentNode);
|
||||
};
|
||||
targets.forEach(keep);
|
||||
var deep = function(parent) {
|
||||
if (!parent || elementsToStop.has(parent)) {
|
||||
return;
|
||||
}
|
||||
Array.prototype.forEach.call(parent.children, function(node) {
|
||||
if (elementsToKeep.has(node)) {
|
||||
deep(node);
|
||||
} else {
|
||||
try {
|
||||
var attr = node.getAttribute(controlAttribute);
|
||||
var alreadyHidden = attr !== null && attr !== "false";
|
||||
var counterValue = (counterMap.get(node) || 0) + 1;
|
||||
var markerValue = (markerCounter.get(node) || 0) + 1;
|
||||
counterMap.set(node, counterValue);
|
||||
markerCounter.set(node, markerValue);
|
||||
hiddenNodes.push(node);
|
||||
if (counterValue === 1 && alreadyHidden) {
|
||||
uncontrolledNodes.set(node, true);
|
||||
}
|
||||
if (markerValue === 1) {
|
||||
node.setAttribute(markerName, "true");
|
||||
}
|
||||
if (!alreadyHidden) {
|
||||
node.setAttribute(controlAttribute, "true");
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("aria-hidden: cannot operate on ", node, e);
|
||||
}
|
||||
// node_modules/@radix-ui/react-focus-guards/dist/index.mjs
|
||||
var React5 = __toESM(require_react(), 1);
|
||||
var count = 0;
|
||||
function useFocusGuards() {
|
||||
React5.useEffect(() => {
|
||||
const edgeGuards = document.querySelectorAll("[data-radix-focus-guard]");
|
||||
document.body.insertAdjacentElement("afterbegin", edgeGuards[0] ?? createFocusGuard());
|
||||
document.body.insertAdjacentElement("beforeend", edgeGuards[1] ?? createFocusGuard());
|
||||
count++;
|
||||
return () => {
|
||||
if (count === 1) {
|
||||
document.querySelectorAll("[data-radix-focus-guard]").forEach((node) => node.remove());
|
||||
}
|
||||
});
|
||||
};
|
||||
deep(parentNode);
|
||||
elementsToKeep.clear();
|
||||
lockCount++;
|
||||
return function() {
|
||||
hiddenNodes.forEach(function(node) {
|
||||
var counterValue = counterMap.get(node) - 1;
|
||||
var markerValue = markerCounter.get(node) - 1;
|
||||
counterMap.set(node, counterValue);
|
||||
markerCounter.set(node, markerValue);
|
||||
if (!counterValue) {
|
||||
if (!uncontrolledNodes.has(node)) {
|
||||
node.removeAttribute(controlAttribute);
|
||||
}
|
||||
uncontrolledNodes.delete(node);
|
||||
}
|
||||
if (!markerValue) {
|
||||
node.removeAttribute(markerName);
|
||||
}
|
||||
});
|
||||
lockCount--;
|
||||
if (!lockCount) {
|
||||
counterMap = /* @__PURE__ */ new WeakMap();
|
||||
counterMap = /* @__PURE__ */ new WeakMap();
|
||||
uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
||||
markerMap = {};
|
||||
}
|
||||
};
|
||||
};
|
||||
var hideOthers = function(originalTarget, parentNode, markerName) {
|
||||
if (markerName === void 0) {
|
||||
markerName = "data-aria-hidden";
|
||||
}
|
||||
var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
|
||||
var activeParentNode = parentNode || getDefaultParent(originalTarget);
|
||||
if (!activeParentNode) {
|
||||
return function() {
|
||||
return null;
|
||||
count--;
|
||||
};
|
||||
}
|
||||
targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll("[aria-live], script")));
|
||||
return applyAttributeToOthers(targets, activeParentNode, markerName, "aria-hidden");
|
||||
};
|
||||
}, []);
|
||||
}
|
||||
function createFocusGuard() {
|
||||
const element = document.createElement("span");
|
||||
element.setAttribute("data-radix-focus-guard", "");
|
||||
element.tabIndex = 0;
|
||||
element.style.outline = "none";
|
||||
element.style.opacity = "0";
|
||||
element.style.position = "fixed";
|
||||
element.style.pointerEvents = "none";
|
||||
return element;
|
||||
}
|
||||
|
||||
// node_modules/tslib/tslib.es6.mjs
|
||||
var __assign = function() {
|
||||
@@ -1341,12 +1220,133 @@ var ReactRemoveScroll = React14.forwardRef(function(props, ref) {
|
||||
ReactRemoveScroll.classNames = RemoveScroll.classNames;
|
||||
var Combination_default = ReactRemoveScroll;
|
||||
|
||||
// node_modules/aria-hidden/dist/es2015/index.js
|
||||
var getDefaultParent = function(originalTarget) {
|
||||
if (typeof document === "undefined") {
|
||||
return null;
|
||||
}
|
||||
var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;
|
||||
return sampleTarget.ownerDocument.body;
|
||||
};
|
||||
var counterMap = /* @__PURE__ */ new WeakMap();
|
||||
var uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
||||
var markerMap = {};
|
||||
var lockCount = 0;
|
||||
var unwrapHost = function(node) {
|
||||
return node && (node.host || unwrapHost(node.parentNode));
|
||||
};
|
||||
var correctTargets = function(parent, targets) {
|
||||
return targets.map(function(target) {
|
||||
if (parent.contains(target)) {
|
||||
return target;
|
||||
}
|
||||
var correctedTarget = unwrapHost(target);
|
||||
if (correctedTarget && parent.contains(correctedTarget)) {
|
||||
return correctedTarget;
|
||||
}
|
||||
console.error("aria-hidden", target, "in not contained inside", parent, ". Doing nothing");
|
||||
return null;
|
||||
}).filter(function(x) {
|
||||
return Boolean(x);
|
||||
});
|
||||
};
|
||||
var applyAttributeToOthers = function(originalTarget, parentNode, markerName, controlAttribute) {
|
||||
var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
|
||||
if (!markerMap[markerName]) {
|
||||
markerMap[markerName] = /* @__PURE__ */ new WeakMap();
|
||||
}
|
||||
var markerCounter = markerMap[markerName];
|
||||
var hiddenNodes = [];
|
||||
var elementsToKeep = /* @__PURE__ */ new Set();
|
||||
var elementsToStop = new Set(targets);
|
||||
var keep = function(el) {
|
||||
if (!el || elementsToKeep.has(el)) {
|
||||
return;
|
||||
}
|
||||
elementsToKeep.add(el);
|
||||
keep(el.parentNode);
|
||||
};
|
||||
targets.forEach(keep);
|
||||
var deep = function(parent) {
|
||||
if (!parent || elementsToStop.has(parent)) {
|
||||
return;
|
||||
}
|
||||
Array.prototype.forEach.call(parent.children, function(node) {
|
||||
if (elementsToKeep.has(node)) {
|
||||
deep(node);
|
||||
} else {
|
||||
try {
|
||||
var attr = node.getAttribute(controlAttribute);
|
||||
var alreadyHidden = attr !== null && attr !== "false";
|
||||
var counterValue = (counterMap.get(node) || 0) + 1;
|
||||
var markerValue = (markerCounter.get(node) || 0) + 1;
|
||||
counterMap.set(node, counterValue);
|
||||
markerCounter.set(node, markerValue);
|
||||
hiddenNodes.push(node);
|
||||
if (counterValue === 1 && alreadyHidden) {
|
||||
uncontrolledNodes.set(node, true);
|
||||
}
|
||||
if (markerValue === 1) {
|
||||
node.setAttribute(markerName, "true");
|
||||
}
|
||||
if (!alreadyHidden) {
|
||||
node.setAttribute(controlAttribute, "true");
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("aria-hidden: cannot operate on ", node, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
deep(parentNode);
|
||||
elementsToKeep.clear();
|
||||
lockCount++;
|
||||
return function() {
|
||||
hiddenNodes.forEach(function(node) {
|
||||
var counterValue = counterMap.get(node) - 1;
|
||||
var markerValue = markerCounter.get(node) - 1;
|
||||
counterMap.set(node, counterValue);
|
||||
markerCounter.set(node, markerValue);
|
||||
if (!counterValue) {
|
||||
if (!uncontrolledNodes.has(node)) {
|
||||
node.removeAttribute(controlAttribute);
|
||||
}
|
||||
uncontrolledNodes.delete(node);
|
||||
}
|
||||
if (!markerValue) {
|
||||
node.removeAttribute(markerName);
|
||||
}
|
||||
});
|
||||
lockCount--;
|
||||
if (!lockCount) {
|
||||
counterMap = /* @__PURE__ */ new WeakMap();
|
||||
counterMap = /* @__PURE__ */ new WeakMap();
|
||||
uncontrolledNodes = /* @__PURE__ */ new WeakMap();
|
||||
markerMap = {};
|
||||
}
|
||||
};
|
||||
};
|
||||
var hideOthers = function(originalTarget, parentNode, markerName) {
|
||||
if (markerName === void 0) {
|
||||
markerName = "data-aria-hidden";
|
||||
}
|
||||
var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);
|
||||
var activeParentNode = parentNode || getDefaultParent(originalTarget);
|
||||
if (!activeParentNode) {
|
||||
return function() {
|
||||
return null;
|
||||
};
|
||||
}
|
||||
targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll("[aria-live], script")));
|
||||
return applyAttributeToOthers(targets, activeParentNode, markerName, "aria-hidden");
|
||||
};
|
||||
|
||||
export {
|
||||
DismissableLayer,
|
||||
useFocusGuards,
|
||||
FocusScope,
|
||||
Portal,
|
||||
hideOthers,
|
||||
Combination_default
|
||||
useFocusGuards,
|
||||
Combination_default,
|
||||
hideOthers
|
||||
};
|
||||
//# sourceMappingURL=chunk-QF76HVLY.js.map
|
||||
//# sourceMappingURL=chunk-LIWCVBQK.js.map
|
||||
+7
File diff suppressed because one or more lines are too long
Generated
Vendored
+118
-118
@@ -1,9 +1,9 @@
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
import {
|
||||
composeRefs
|
||||
} from "./chunk-2VUH7NEY.js";
|
||||
import {
|
||||
require_react_dom
|
||||
} from "./chunk-YF4B4G2L.js";
|
||||
import {
|
||||
require_jsx_runtime
|
||||
} from "./chunk-2YVA4HRZ.js";
|
||||
@@ -102,30 +102,122 @@ function composeContextScopes(...scopes) {
|
||||
return createScope;
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-primitive/dist/index.mjs
|
||||
// node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs
|
||||
var React2 = __toESM(require_react(), 1);
|
||||
var useLayoutEffect2 = globalThis?.document ? React2.useLayoutEffect : () => {
|
||||
};
|
||||
|
||||
// node_modules/@radix-ui/react-id/dist/index.mjs
|
||||
var React3 = __toESM(require_react(), 1);
|
||||
var useReactId = React3[" useId ".trim().toString()] || (() => void 0);
|
||||
var count = 0;
|
||||
function useId(deterministicId) {
|
||||
const [id, setId] = React3.useState(useReactId());
|
||||
useLayoutEffect2(() => {
|
||||
if (!deterministicId) setId((reactId) => reactId ?? String(count++));
|
||||
}, [deterministicId]);
|
||||
return deterministicId || (id ? `radix-${id}` : "");
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
|
||||
var React5 = __toESM(require_react(), 1);
|
||||
var React22 = __toESM(require_react(), 1);
|
||||
|
||||
// node_modules/@radix-ui/react-use-effect-event/dist/index.mjs
|
||||
var React4 = __toESM(require_react(), 1);
|
||||
var useReactEffectEvent = React4[" useEffectEvent ".trim().toString()];
|
||||
var useReactInsertionEffect = React4[" useInsertionEffect ".trim().toString()];
|
||||
|
||||
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
|
||||
var useInsertionEffect = React5[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
|
||||
function useControllableState({
|
||||
prop,
|
||||
defaultProp,
|
||||
onChange = () => {
|
||||
},
|
||||
caller
|
||||
}) {
|
||||
const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
|
||||
defaultProp,
|
||||
onChange
|
||||
});
|
||||
const isControlled = prop !== void 0;
|
||||
const value = isControlled ? prop : uncontrolledProp;
|
||||
if (true) {
|
||||
const isControlledRef = React5.useRef(prop !== void 0);
|
||||
React5.useEffect(() => {
|
||||
const wasControlled = isControlledRef.current;
|
||||
if (wasControlled !== isControlled) {
|
||||
const from = wasControlled ? "controlled" : "uncontrolled";
|
||||
const to = isControlled ? "controlled" : "uncontrolled";
|
||||
console.warn(
|
||||
`${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
|
||||
);
|
||||
}
|
||||
isControlledRef.current = isControlled;
|
||||
}, [isControlled, caller]);
|
||||
}
|
||||
const setValue = React5.useCallback(
|
||||
(nextValue) => {
|
||||
if (isControlled) {
|
||||
const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
|
||||
if (value2 !== prop) {
|
||||
onChangeRef.current?.(value2);
|
||||
}
|
||||
} else {
|
||||
setUncontrolledProp(nextValue);
|
||||
}
|
||||
},
|
||||
[isControlled, prop, setUncontrolledProp, onChangeRef]
|
||||
);
|
||||
return [value, setValue];
|
||||
}
|
||||
function useUncontrolledState({
|
||||
defaultProp,
|
||||
onChange
|
||||
}) {
|
||||
const [value, setValue] = React5.useState(defaultProp);
|
||||
const prevValueRef = React5.useRef(value);
|
||||
const onChangeRef = React5.useRef(onChange);
|
||||
useInsertionEffect(() => {
|
||||
onChangeRef.current = onChange;
|
||||
}, [onChange]);
|
||||
React5.useEffect(() => {
|
||||
if (prevValueRef.current !== value) {
|
||||
onChangeRef.current?.(value);
|
||||
prevValueRef.current = value;
|
||||
}
|
||||
}, [value, prevValueRef]);
|
||||
return [value, setValue, onChangeRef];
|
||||
}
|
||||
function isFunction(value) {
|
||||
return typeof value === "function";
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-primitive/dist/index.mjs
|
||||
var React7 = __toESM(require_react(), 1);
|
||||
var ReactDOM = __toESM(require_react_dom(), 1);
|
||||
|
||||
// node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.mjs
|
||||
var React2 = __toESM(require_react(), 1);
|
||||
var React6 = __toESM(require_react(), 1);
|
||||
var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
|
||||
function createSlot(ownerName) {
|
||||
const SlotClone = createSlotClone(ownerName);
|
||||
const Slot2 = React2.forwardRef((props, forwardedRef) => {
|
||||
const Slot2 = React6.forwardRef((props, forwardedRef) => {
|
||||
const { children, ...slotProps } = props;
|
||||
const childrenArray = React2.Children.toArray(children);
|
||||
const childrenArray = React6.Children.toArray(children);
|
||||
const slottable = childrenArray.find(isSlottable);
|
||||
if (slottable) {
|
||||
const newElement = slottable.props.children;
|
||||
const newChildren = childrenArray.map((child) => {
|
||||
if (child === slottable) {
|
||||
if (React2.Children.count(newElement) > 1) return React2.Children.only(null);
|
||||
return React2.isValidElement(newElement) ? newElement.props.children : null;
|
||||
if (React6.Children.count(newElement) > 1) return React6.Children.only(null);
|
||||
return React6.isValidElement(newElement) ? newElement.props.children : null;
|
||||
} else {
|
||||
return child;
|
||||
}
|
||||
});
|
||||
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: React2.isValidElement(newElement) ? React2.cloneElement(newElement, void 0, newChildren) : null });
|
||||
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children: React6.isValidElement(newElement) ? React6.cloneElement(newElement, void 0, newChildren) : null });
|
||||
}
|
||||
return (0, import_jsx_runtime2.jsx)(SlotClone, { ...slotProps, ref: forwardedRef, children });
|
||||
});
|
||||
@@ -134,17 +226,17 @@ function createSlot(ownerName) {
|
||||
}
|
||||
var Slot = createSlot("Slot");
|
||||
function createSlotClone(ownerName) {
|
||||
const SlotClone = React2.forwardRef((props, forwardedRef) => {
|
||||
const SlotClone = React6.forwardRef((props, forwardedRef) => {
|
||||
const { children, ...slotProps } = props;
|
||||
if (React2.isValidElement(children)) {
|
||||
if (React6.isValidElement(children)) {
|
||||
const childrenRef = getElementRef(children);
|
||||
const props2 = mergeProps(slotProps, children.props);
|
||||
if (children.type !== React2.Fragment) {
|
||||
if (children.type !== React6.Fragment) {
|
||||
props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
|
||||
}
|
||||
return React2.cloneElement(children, props2);
|
||||
return React6.cloneElement(children, props2);
|
||||
}
|
||||
return React2.Children.count(children) > 1 ? React2.Children.only(null) : null;
|
||||
return React6.Children.count(children) > 1 ? React6.Children.only(null) : null;
|
||||
});
|
||||
SlotClone.displayName = `${ownerName}.SlotClone`;
|
||||
return SlotClone;
|
||||
@@ -160,7 +252,7 @@ function createSlottable(ownerName) {
|
||||
}
|
||||
var Slottable = createSlottable("Slottable");
|
||||
function isSlottable(child) {
|
||||
return React2.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
|
||||
return React6.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
|
||||
}
|
||||
function mergeProps(slotProps, childProps) {
|
||||
const overrideProps = { ...childProps };
|
||||
@@ -223,7 +315,7 @@ var NODES = [
|
||||
];
|
||||
var Primitive = NODES.reduce((primitive, node) => {
|
||||
const Slot2 = createSlot(`Primitive.${node}`);
|
||||
const Node = React3.forwardRef((props, forwardedRef) => {
|
||||
const Node = React7.forwardRef((props, forwardedRef) => {
|
||||
const { asChild, ...primitiveProps } = props;
|
||||
const Comp = asChild ? Slot2 : node;
|
||||
if (typeof window !== "undefined") {
|
||||
@@ -239,116 +331,24 @@ function dispatchDiscreteCustomEvent(target, event) {
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs
|
||||
var React4 = __toESM(require_react(), 1);
|
||||
var React8 = __toESM(require_react(), 1);
|
||||
function useCallbackRef(callback) {
|
||||
const callbackRef = React4.useRef(callback);
|
||||
React4.useEffect(() => {
|
||||
const callbackRef = React8.useRef(callback);
|
||||
React8.useEffect(() => {
|
||||
callbackRef.current = callback;
|
||||
});
|
||||
return React4.useMemo(() => (...args) => callbackRef.current?.(...args), []);
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs
|
||||
var React5 = __toESM(require_react(), 1);
|
||||
var useLayoutEffect2 = globalThis?.document ? React5.useLayoutEffect : () => {
|
||||
};
|
||||
|
||||
// node_modules/@radix-ui/react-id/dist/index.mjs
|
||||
var React6 = __toESM(require_react(), 1);
|
||||
var useReactId = React6[" useId ".trim().toString()] || (() => void 0);
|
||||
var count = 0;
|
||||
function useId(deterministicId) {
|
||||
const [id, setId] = React6.useState(useReactId());
|
||||
useLayoutEffect2(() => {
|
||||
if (!deterministicId) setId((reactId) => reactId ?? String(count++));
|
||||
}, [deterministicId]);
|
||||
return deterministicId || (id ? `radix-${id}` : "");
|
||||
}
|
||||
|
||||
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
|
||||
var React8 = __toESM(require_react(), 1);
|
||||
var React22 = __toESM(require_react(), 1);
|
||||
|
||||
// node_modules/@radix-ui/react-use-effect-event/dist/index.mjs
|
||||
var React7 = __toESM(require_react(), 1);
|
||||
var useReactEffectEvent = React7[" useEffectEvent ".trim().toString()];
|
||||
var useReactInsertionEffect = React7[" useInsertionEffect ".trim().toString()];
|
||||
|
||||
// node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
|
||||
var useInsertionEffect = React8[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
|
||||
function useControllableState({
|
||||
prop,
|
||||
defaultProp,
|
||||
onChange = () => {
|
||||
},
|
||||
caller
|
||||
}) {
|
||||
const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
|
||||
defaultProp,
|
||||
onChange
|
||||
});
|
||||
const isControlled = prop !== void 0;
|
||||
const value = isControlled ? prop : uncontrolledProp;
|
||||
if (true) {
|
||||
const isControlledRef = React8.useRef(prop !== void 0);
|
||||
React8.useEffect(() => {
|
||||
const wasControlled = isControlledRef.current;
|
||||
if (wasControlled !== isControlled) {
|
||||
const from = wasControlled ? "controlled" : "uncontrolled";
|
||||
const to = isControlled ? "controlled" : "uncontrolled";
|
||||
console.warn(
|
||||
`${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
|
||||
);
|
||||
}
|
||||
isControlledRef.current = isControlled;
|
||||
}, [isControlled, caller]);
|
||||
}
|
||||
const setValue = React8.useCallback(
|
||||
(nextValue) => {
|
||||
if (isControlled) {
|
||||
const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
|
||||
if (value2 !== prop) {
|
||||
onChangeRef.current?.(value2);
|
||||
}
|
||||
} else {
|
||||
setUncontrolledProp(nextValue);
|
||||
}
|
||||
},
|
||||
[isControlled, prop, setUncontrolledProp, onChangeRef]
|
||||
);
|
||||
return [value, setValue];
|
||||
}
|
||||
function useUncontrolledState({
|
||||
defaultProp,
|
||||
onChange
|
||||
}) {
|
||||
const [value, setValue] = React8.useState(defaultProp);
|
||||
const prevValueRef = React8.useRef(value);
|
||||
const onChangeRef = React8.useRef(onChange);
|
||||
useInsertionEffect(() => {
|
||||
onChangeRef.current = onChange;
|
||||
}, [onChange]);
|
||||
React8.useEffect(() => {
|
||||
if (prevValueRef.current !== value) {
|
||||
onChangeRef.current?.(value);
|
||||
prevValueRef.current = value;
|
||||
}
|
||||
}, [value, prevValueRef]);
|
||||
return [value, setValue, onChangeRef];
|
||||
}
|
||||
function isFunction(value) {
|
||||
return typeof value === "function";
|
||||
return React8.useMemo(() => (...args) => callbackRef.current?.(...args), []);
|
||||
}
|
||||
|
||||
export {
|
||||
composeEventHandlers,
|
||||
createContext2,
|
||||
createContextScope,
|
||||
Primitive,
|
||||
dispatchDiscreteCustomEvent,
|
||||
useCallbackRef,
|
||||
useLayoutEffect2,
|
||||
useId,
|
||||
useControllableState
|
||||
useControllableState,
|
||||
Primitive,
|
||||
dispatchDiscreteCustomEvent,
|
||||
useCallbackRef
|
||||
};
|
||||
//# sourceMappingURL=chunk-X34PLQQA.js.map
|
||||
//# sourceMappingURL=chunk-MOFDO34C.js.map
|
||||
+7
File diff suppressed because one or more lines are too long
-7
File diff suppressed because one or more lines are too long
-7
File diff suppressed because one or more lines are too long
Generated
-39
@@ -4473,9 +4473,6 @@
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4490,9 +4487,6 @@
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4507,9 +4501,6 @@
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4524,9 +4515,6 @@
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4541,9 +4529,6 @@
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4558,9 +4543,6 @@
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4575,9 +4557,6 @@
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4592,9 +4571,6 @@
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4609,9 +4585,6 @@
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4626,9 +4599,6 @@
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4643,9 +4613,6 @@
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4660,9 +4627,6 @@
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
@@ -4677,9 +4641,6 @@
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
+10
-23
@@ -1,26 +1,13 @@
|
||||
# =============================================================================
|
||||
# ROBOTS.TXT - VERSAO HOMOLOGACAO/DESENVOLVIMENTO
|
||||
# =============================================================================
|
||||
# Este arquivo BLOQUEIA TODOS os crawlers.
|
||||
#
|
||||
# Para PRODUCAO (avanzato.com.br), substitua por:
|
||||
# User-agent: *
|
||||
# Allow: /
|
||||
# Sitemap: https://avanzato.com.br/sitemap.xml
|
||||
# =============================================================================
|
||||
# ============================================================================
|
||||
# AVANZATO TECNOLOGIA - ROBOTS.TXT (GENERICO)
|
||||
# ============================================================================
|
||||
# O controle real de indexacao e feito pelo <meta name="robots"> no HTML:
|
||||
# - Producao (avanzato.com.br): index, follow
|
||||
# - Homologacao (hml.avanzato.com.br): noindex, nofollow
|
||||
# - Desenvolvimento (localhost): noindex, nofollow
|
||||
# ============================================================================
|
||||
|
||||
User-agent: *
|
||||
Disallow: /
|
||||
Allow: /
|
||||
|
||||
# Bloqueio explicito de todos os bots
|
||||
User-agent: Googlebot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Bingbot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Slurp
|
||||
Disallow: /
|
||||
|
||||
# Sitemap comentado (descomente em producao)
|
||||
# Sitemap: https://avanzato.com.br/sitemap.xml
|
||||
Sitemap: https://avanzato.com.br/sitemap.xml
|
||||
|
||||
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 |
@@ -165,4 +165,120 @@
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
|
||||
<!-- SEO Local - Onde Atuamos -->
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/onde-atuamos</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-guarulhos</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-mogi-das-cruzes</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-ipiranga</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-vila-formosa</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-cerqueira-cesar</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-santana</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-bras</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-ribeirao-preto</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
|
||||
<!-- Nichos adicionais -->
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-industria</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-portaria-remota</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-clinicas</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-imobiliarias</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://avanzato.com.br/suporte-ti-recrutamento-selecao</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</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>
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "1.1.3",
|
||||
"date": "2026-05-31",
|
||||
"environment": "development"
|
||||
}
|
||||
"version": "1.4.0",
|
||||
"date": "2026-06-02",
|
||||
"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..."
|
||||
|
||||
DIST_DIR="${1:-dist}"
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
|
||||
if [ ! -d "$DIST_DIR" ]; then
|
||||
@@ -57,8 +58,30 @@ ROUTES=(
|
||||
"suporte-vmware"
|
||||
"suporte-sharepoint"
|
||||
"suporte-redes-cisco"
|
||||
"onde-atuamos"
|
||||
"suporte-ti-guarulhos"
|
||||
"suporte-ti-mogi-das-cruzes"
|
||||
"suporte-ti-ipiranga"
|
||||
"suporte-ti-vila-formosa"
|
||||
"suporte-ti-cerqueira-cesar"
|
||||
"suporte-ti-santana"
|
||||
"suporte-ti-bras"
|
||||
"suporte-ti-ribeirao-preto"
|
||||
"suporte-ti-industria"
|
||||
"suporte-ti-portaria-remota"
|
||||
"suporte-ti-clinicas"
|
||||
"suporte-ti-imobiliarias"
|
||||
"suporte-ti-recrutamento-selecao"
|
||||
"privacidade"
|
||||
"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
|
||||
@@ -79,6 +102,12 @@ echo -e "${GREEN}OK${NC} 404.html criado"
|
||||
# Limpar backup
|
||||
rm -f "$DIST_DIR/index.html.bak"
|
||||
|
||||
echo ""
|
||||
# Gerar HTML prerenderizado com conteudo real (SEO)
|
||||
echo ""
|
||||
echo -e "${BLUE}[Prerender]${NC} Gerando HTML com conteudo real para SEO..."
|
||||
node "${SCRIPT_DIR}/prerender.cjs"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}Post-build concluido!${NC}"
|
||||
echo ""
|
||||
@@ -86,4 +115,5 @@ echo "Estrutura gerada:"
|
||||
echo " dist/index.html (home)"
|
||||
echo " dist/404.html (pagina nao encontrada)"
|
||||
echo " dist/{rota}/index.html (${#ROUTES[@]} paginas estaticas)"
|
||||
echo " dist/{rota}/index.html (HTML com conteudo real para SEO)"
|
||||
echo ""
|
||||
|
||||
@@ -0,0 +1,260 @@
|
||||
// ============================================================================
|
||||
// PRERENDER - Gera HTML estatico com conteudo real para cada rota
|
||||
// ============================================================================
|
||||
// Executa apos npm run build
|
||||
// Gera index.html com conteudo HTML real (nao vazio) para cada rota
|
||||
// Isso resolve o problema de SEO: Google recebe conteudo no 1o request
|
||||
// ============================================================================
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const DIST_DIR = path.resolve(__dirname, '../dist');
|
||||
const INDEX_HTML = path.join(DIST_DIR, 'index.html');
|
||||
|
||||
// Verificar se dist existe
|
||||
if (!fs.existsSync(DIST_DIR)) {
|
||||
console.error('ERRO: pasta dist/ nao encontrada. Execute npm run build primeiro.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Ler o index.html base
|
||||
let baseHtml = fs.readFileSync(INDEX_HTML, 'utf-8');
|
||||
|
||||
// Rotas para prerenderizar
|
||||
const ROUTES = [
|
||||
{ path: '/', title: 'Avanzato Tecnologia | TI Gerenciada, Cloud e Seguranca em Guarulhos/SP', desc: 'Solucoes em TI Gerenciada, Cloud Computing e Seguranca da Informacao. +23 anos de experiencia, +500 clientes atendidos. Suporte 24/7.' },
|
||||
{ path: '/sobre', title: 'Sobre a Avanzato Tecnologia | +23 Anos de Experiencia em TI', desc: 'Conheca a Avanzato Tecnologia. +23 anos de experiencia em TI Gerenciada, Cloud e Seguranca. +500 clientes satisfeitos em Sao Paulo.' },
|
||||
{ path: '/cases', title: 'Cases de Sucesso - Avanzato Tecnologia | Projetos de TI', desc: 'Conheca nossos cases de sucesso em TI. Empresas de contabilidade, advocacia, industria, monitoramento e mais. +23 anos de experiencia.' },
|
||||
{ path: '/onde-atuamos', title: 'Onde Atuamos - Suporte de TI em Sao Paulo e Regiao', desc: 'Avanzato Tecnologia atende em Guarulhos, Mogi das Cruzes, Ipiranga, Zona Leste, Zona Norte, Centro e Ribeirao Preto. Suporte presencial e remoto.' },
|
||||
{ path: '/avaliacao', title: 'Avaliacao Gratuita de TI - Avanzato Tecnologia', desc: 'Avalie gratuitamente a maturidade da TI da sua empresa. Descubra o nivel e receba recomendacoes personalizadas.' },
|
||||
{ path: '/contato', title: 'Contato - Avanzato Tecnologia | TI em Guarulhos/SP', desc: 'Entre em contato com a Avanzato Tecnologia. Telefone (11) 4810-1704, WhatsApp, email ou formulario. Atendimento 24/7.' },
|
||||
{ path: '/servicos/ti-gerenciada', title: 'TI Gerenciada para Empresas - Avanzato Tecnologia', desc: 'TI Gerenciada completa para empresas em Guarulhos e Sao Paulo. Suporte 24/7, monitoramento em tempo real e equipe especializada.' },
|
||||
{ path: '/servicos/cloud-computing', title: 'Cloud Computing e Virtualizacao - Avanzato', desc: 'Solucoes em Cloud Computing: AWS, Azure, Google Cloud. Migracao, gestao e otimizacao de infraestrutura em nuvem.' },
|
||||
{ path: '/servicos/seguranca', title: 'Seguranca da Informacao - Avanzato Tecnologia', desc: 'Protecao completa para sua empresa: firewall, antivirus, backup, LGPD. Seguranca de rede e dados com suporte 24/7.' },
|
||||
{ path: '/servicos/suporte', title: 'Suporte Tecnico 24/7 - Avanzato Tecnologia', desc: 'Suporte tecnico empresarial 24 horas. Help desk, atendimento remoto e presencial em Guarulhos e regiao.' },
|
||||
{ path: '/ti-para-contabilidades', title: 'TI para Escritorios de Contabilidade - Avanzato', desc: 'Solucoes de TI especializadas para contabilidades: seguranca de dados fiscais, backup de obrigacoes, NF-e. SPED e ECD.' },
|
||||
{ path: '/ti-para-advocacias', title: 'TI para Escritorios de Advocacia - Avanzato', desc: 'TI para advocacias: seguranca de processos, LGPD para clientes, backup de documentos juridicos. PJe e e-SAJ.' },
|
||||
{ path: '/monitoramento-empresarial', title: 'Monitoramento Empresarial com CFTV - Avanzato', desc: 'Sistemas de CFTV e monitoramento por camera para empresas. IP cameras, NVR, DVR, acesso remoto via celular.' },
|
||||
{ path: '/firewall-pfsense-empresarial', title: 'Firewall pfSense Empresarial - Avanzato', desc: 'Implementacao e configuracao de firewall pfSense e OPNsense. Seguranca de rede, VPN, filtro de conteudo.' },
|
||||
{ path: '/backup-corporativo', title: 'Backup Corporativo e Disaster Recovery - Avanzato', desc: 'Backup automatizado em nuvem e local. Disaster Recovery, recuperacao de dados. Protecao contra ransomware.' },
|
||||
{ path: '/voip-empresarial', title: 'VoIP Empresarial e PABX IP - Avanzato Tecnologia', desc: 'Telefonia VoIP para empresas: PABX IP, chamadas ilimitadas, integracao com CRM. Reducao de 70% na conta telefonica.' },
|
||||
{ path: '/suporte-ti-guarulhos', title: 'Suporte de TI em Guarulhos - Matriz Avanzato', desc: 'Suporte de TI empresarial em Guarulhos. Atendemos contabilidades, advocacias, industrias e mais. Matriz da Avanzato. +23 anos.' },
|
||||
{ path: '/suporte-ti-mogi-das-cruzes', title: 'Suporte de TI em Mogi das Cruzes - Avanzato', desc: 'Suporte de TI empresarial em Mogi das Cruzes. Atendimento presencial e remoto para empresas de todos os portes.' },
|
||||
{ path: '/suporte-ti-ipiranga', title: 'Suporte de TI em Ipiranga - Avanzato Tecnologia', desc: 'Suporte de TI empresarial em Ipiranga, Sao Paulo. Atendimento a clinicas, escolas e comercios do bairro.' },
|
||||
{ path: '/suporte-ti-industria', title: 'TI para Industria - Avanzato Tecnologia', desc: 'Solucoes de TI especializadas para industrias. Suporte tecnico, seguranca, cloud e comunicacao. +23 anos de experiencia.' },
|
||||
{ path: '/suporte-ti-portaria-remota', title: 'TI para Portaria Remota - Avanzato Tecnologia', desc: 'Solucoes de TI para portaria remota: interfornia IP, controle de acesso, cameras. Condominios, empresas, industrias.' },
|
||||
{ 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: '/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
|
||||
function generateContent(route) {
|
||||
const isHome = route.path === '/';
|
||||
const isLocal = route.path.includes('suporte-ti-');
|
||||
const isService = route.path.includes('servicos/');
|
||||
const isNicho = route.path.includes('ti-para-') || route.path.includes('suporte-ti-') && !isLocal;
|
||||
|
||||
let content = '';
|
||||
|
||||
if (isHome) {
|
||||
content = `
|
||||
<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>`;
|
||||
} else if (isLocal) {
|
||||
const city = route.title.split(' em ')[1]?.split(' - ')[0] || '';
|
||||
content = `
|
||||
<article>
|
||||
<h1>Suporte de TI em ${city}</h1>
|
||||
<p>Empresa de suporte de TI em ${city} com atendimento presencial e remoto. +23 anos de experiencia.</p>
|
||||
<h2>Servicos em ${city}</h2>
|
||||
<ul>
|
||||
<li>Suporte tecnico 24/7</li>
|
||||
<li>Administracao de servidores</li>
|
||||
<li>Backup corporativo</li>
|
||||
<li>Firewall e seguranca</li>
|
||||
<li>Microsoft 365</li>
|
||||
<li>Cloud Computing</li>
|
||||
<li>VoIP e PABX IP</li>
|
||||
<li>Monitoramento CFTV</li>
|
||||
</ul>
|
||||
<h2>Segmentos Atendidos em ${city}</h2>
|
||||
<p>Contabilidades, Advocacias, Industrias, Clinicas, Imobiliarias, Condominios, Logistica, Monitoramento.</p>
|
||||
<div><a href="/avaliacao">Solicitar Avaliacao Gratuita</a></div>
|
||||
</article>`;
|
||||
} else if (route.path === '/onde-atuamos') {
|
||||
content = `
|
||||
<article>
|
||||
<h1>Onde a Avanzato Atua</h1>
|
||||
<p>Presente em toda a regiao metropolitana de Sao Paulo e interior. Atendimento presencial e remoto.</p>
|
||||
<h2>Cidades Atendidas</h2>
|
||||
<ul>
|
||||
<li><a href="/suporte-ti-guarulhos">Guarulhos</a> - Matriz Avanzato</li>
|
||||
<li><a href="/suporte-ti-mogi-das-cruzes">Mogi das Cruzes</a></li>
|
||||
<li><a href="/suporte-ti-ipiranga">Ipiranga</a></li>
|
||||
<li><a href="/suporte-ti-vila-formosa">Vila Formosa</a></li>
|
||||
<li><a href="/suporte-ti-cerqueira-cesar">Cerqueira Cesar</a></li>
|
||||
<li><a href="/suporte-ti-santana">Santana</a></li>
|
||||
<li><a href="/suporte-ti-bras">Bras</a></li>
|
||||
<li><a href="/suporte-ti-ribeirao-preto">Ribeirao Preto</a></li>
|
||||
</ul>
|
||||
<div><a href="/contato">Falar com Especialista</a></div>
|
||||
</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') {
|
||||
content = `
|
||||
<article>
|
||||
<h1>Cases de Sucesso - Avanzato Tecnologia</h1>
|
||||
<p>Conheca nossos cases de sucesso em TI. Empresas de diversos segmentos que confiam na Avanzato.</p>
|
||||
<h2>Cases Recentes</h2>
|
||||
<ul>
|
||||
<li><strong>Apoio 24 Horas</strong> - Monitoramento - Servidores, pfSense, VPN</li>
|
||||
<li><strong>ONG/Terceiro Setor</strong> - Institucional - Suporte, Cloud, Seguranca</li>
|
||||
<li><strong>Museu de Faculdade Publica</strong> - Acervo Digital - Tainacan, ICA-AtoM</li>
|
||||
<li><strong>Thalls</strong> - Industria - Suporte, VoIP</li>
|
||||
<li><strong>Dellacont</strong> - Contabilidade - Suporte, Servidor, Backup</li>
|
||||
<li><strong>Mourad Naddi Advogados</strong> - Advocacia - Suporte, Servidor, Backup</li>
|
||||
<li><strong>GateOne e Fox</strong> - Monitoramento - Servidores, VPN</li>
|
||||
<li><strong>Lucena Textil</strong> - Textil - Colocation, VPN, Backup</li>
|
||||
</ul>
|
||||
<div><a href="/avaliacao">Quero um case de sucesso tambem</a></div>
|
||||
</article>`;
|
||||
} else if (isService || isNicho) {
|
||||
const serviceName = route.title.split(' - ')[0];
|
||||
content = `
|
||||
<article>
|
||||
<h1>${serviceName}</h1>
|
||||
<p>${route.desc}</p>
|
||||
<h2>O que oferecemos</h2>
|
||||
<ul>
|
||||
<li>Diagnostico inicial gratuito</li>
|
||||
<li>Projeto personalizado</li>
|
||||
<li>Implantacao completa</li>
|
||||
<li>Suporte continuo</li>
|
||||
<li>Relatorios periodicos</li>
|
||||
</ul>
|
||||
<h2>Perguntas Frequentes</h2>
|
||||
<p><strong>Qual o tempo de resposta?</strong> Nosso SLA garante atendimento em ate 4 horas para chamados criticos.</p>
|
||||
<p><strong>Atendem empresas de qual porte?</strong> Atendemos de pequenas a grandes empresas, com planos flexiveis.</p>
|
||||
<div><a href="/avaliacao">Solicitar Avaliacao Gratuita</a> <a href="/contato">Falar com Especialista</a></div>
|
||||
</article>`;
|
||||
} else {
|
||||
content = `
|
||||
<article>
|
||||
<h1>${route.title.split(' - ')[0]}</h1>
|
||||
<p>${route.desc}</p>
|
||||
<div><a href="/contato">Entrar em Contato</a> <a href="/avaliacao">Avaliacao Gratuita</a></div>
|
||||
</article>`;
|
||||
}
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
// Gerar HTML prerenderizado para cada rota
|
||||
console.log('[Prerender] Gerando HTML estatico com conteudo real...\n');
|
||||
|
||||
let count = 0;
|
||||
|
||||
for (const route of ROUTES) {
|
||||
// Atualizar title e meta description
|
||||
let html = baseHtml
|
||||
.replace(/<title>.*?<\/title>/, `<title>${route.title}</title>`)
|
||||
.replace(/<meta name="title" content=".*?" \/>/, `<meta name="title" content="${route.title}" />`)
|
||||
.replace(/<meta name="description" content=".*?" \/>/, `<meta name="description" content="${route.desc}" />`)
|
||||
.replace(/<meta name="app-version" content=".*?" \/>/, `<meta name="app-version" content="${require('../public/version.json').version}" />`);
|
||||
|
||||
// Gerar conteudo HTML
|
||||
const content = generateContent(route);
|
||||
|
||||
// Inserir conteudo no div#root (substituir <div id="root"></div>)
|
||||
html = html.replace(
|
||||
'<div id="root"></div>',
|
||||
`<div id="root">${content}</div>`
|
||||
);
|
||||
|
||||
// Determinar caminho de saida
|
||||
let outputPath;
|
||||
if (route.path === '/') {
|
||||
outputPath = path.join(DIST_DIR, 'index.html');
|
||||
} else {
|
||||
// Criar pasta e salvar index.html
|
||||
const dir = path.join(DIST_DIR, route.path.replace(/^\//, ''));
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
outputPath = path.join(dir, 'index.html');
|
||||
}
|
||||
|
||||
fs.writeFileSync(outputPath, html);
|
||||
count++;
|
||||
console.log(` OK: ${route.path} → ${outputPath.replace(DIST_DIR + '/', '')}`);
|
||||
}
|
||||
|
||||
console.log(`\n[Prerender] ${count} paginas geradas com conteudo HTML real!`);
|
||||
console.log('[Prerender] Agora o Google recebe conteudo no 1o request, sem precisar de JavaScript.\n');
|
||||
+168
-101
@@ -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 { gsap } from 'gsap';
|
||||
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
||||
@@ -8,50 +8,80 @@ import WhatsAppWidget from './components/WhatsAppWidget';
|
||||
import CookieConsent from './components/CookieConsent';
|
||||
import HomologationBanner from './components/HomologationBanner';
|
||||
|
||||
// Páginas
|
||||
// Página inicial carrega direto (mais acessada)
|
||||
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';
|
||||
|
||||
// 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
|
||||
import TiGerenciada from './pages/services/TiGerenciada';
|
||||
import CloudComputing from './pages/services/CloudComputing';
|
||||
import Seguranca from './pages/services/Seguranca';
|
||||
import Suporte from './pages/services/Suporte';
|
||||
import Redes from './pages/services/Redes';
|
||||
import Pabx from './pages/services/Pabx';
|
||||
import Backup from './pages/services/Backup';
|
||||
import Servidores from './pages/services/Servidores';
|
||||
import Consultoria from './pages/services/Consultoria';
|
||||
import Noc from './pages/services/Noc';
|
||||
const TiGerenciada = lazy(() => import('./pages/services/TiGerenciada'));
|
||||
const CloudComputing = lazy(() => import('./pages/services/CloudComputing'));
|
||||
const Seguranca = lazy(() => import('./pages/services/Seguranca'));
|
||||
const Suporte = lazy(() => import('./pages/services/Suporte'));
|
||||
const Redes = lazy(() => import('./pages/services/Redes'));
|
||||
const Pabx = lazy(() => import('./pages/services/Pabx'));
|
||||
const Backup = lazy(() => import('./pages/services/Backup'));
|
||||
const Servidores = lazy(() => import('./pages/services/Servidores'));
|
||||
const Consultoria = lazy(() => import('./pages/services/Consultoria'));
|
||||
const Noc = lazy(() => import('./pages/services/Noc'));
|
||||
|
||||
// Páginas de Tecnologias (SEO)
|
||||
import Tecnologias from './pages/Tecnologias';
|
||||
import WindowsServer from './pages/tech/WindowsServer';
|
||||
import Linux from './pages/tech/Linux';
|
||||
import PfSense from './pages/tech/PfSense';
|
||||
import Proxmox from './pages/tech/Proxmox';
|
||||
import Vmware from './pages/tech/Vmware';
|
||||
import Sharepoint from './pages/tech/Sharepoint';
|
||||
import Cisco from './pages/tech/Cisco';
|
||||
const Tecnologias = lazy(() => import('./pages/Tecnologias'));
|
||||
const WindowsServer = lazy(() => import('./pages/tech/WindowsServer'));
|
||||
const Linux = lazy(() => import('./pages/tech/Linux'));
|
||||
const PfSense = lazy(() => import('./pages/tech/PfSense'));
|
||||
const Proxmox = lazy(() => import('./pages/tech/Proxmox'));
|
||||
const Vmware = lazy(() => import('./pages/tech/Vmware'));
|
||||
const Sharepoint = lazy(() => import('./pages/tech/Sharepoint'));
|
||||
const Cisco = lazy(() => import('./pages/tech/Cisco'));
|
||||
|
||||
// Avaliador de Maturidade Tecnológica
|
||||
import Avaliador from './pages/Avaliador';
|
||||
import Condominios from './pages/Condominios';
|
||||
const Avaliador = lazy(() => import('./pages/Avaliador'));
|
||||
const Condominios = lazy(() => import('./pages/Condominios'));
|
||||
|
||||
// Landing Pages por Nicho
|
||||
import Contabilidade from './pages/nichos/Contabilidade';
|
||||
import Advocacia from './pages/nichos/Advocacia';
|
||||
import Monitoramento from './pages/nichos/Monitoramento';
|
||||
import FirewallPfSense from './pages/nichos/FirewallPfSense';
|
||||
import BackupCorporativo from './pages/nichos/BackupCorporativo';
|
||||
import VoipEmpresarial from './pages/nichos/VoipEmpresarial';
|
||||
const Contabilidade = lazy(() => import('./pages/nichos/Contabilidade'));
|
||||
const Advocacia = lazy(() => import('./pages/nichos/Advocacia'));
|
||||
const Monitoramento = lazy(() => import('./pages/nichos/Monitoramento'));
|
||||
const FirewallPfSense = lazy(() => import('./pages/nichos/FirewallPfSense'));
|
||||
const BackupCorporativo = lazy(() => import('./pages/nichos/BackupCorporativo'));
|
||||
const VoipEmpresarial = lazy(() => import('./pages/nichos/VoipEmpresarial'));
|
||||
|
||||
// SEO Local - Onde Atuamos
|
||||
const OndeAtuamos = lazy(() => import('./pages/OndeAtuamos'));
|
||||
const LocalGuarulhos = lazy(() => import('./pages/local-guarulhos'));
|
||||
const LocalMogi = lazy(() => import('./pages/local-mogi-das-cruzes'));
|
||||
const LocalIpiranga = lazy(() => import('./pages/local-ipiranga'));
|
||||
const LocalVilaFormosa = lazy(() => import('./pages/local-vila-formosa'));
|
||||
const LocalCerqueiraCesar = lazy(() => import('./pages/local-cerqueira-cesar'));
|
||||
const LocalSantana = lazy(() => import('./pages/local-santana'));
|
||||
const LocalBras = lazy(() => import('./pages/local-bras'));
|
||||
const LocalRibeiraoPreto = lazy(() => import('./pages/local-ribeirao-preto'));
|
||||
|
||||
// Nichos adicionais
|
||||
const NichoIndustria = lazy(() => import('./pages/nicho-industria'));
|
||||
const NichoPortaria = lazy(() => import('./pages/nicho-portaria-remota'));
|
||||
const NichoClinicas = lazy(() => import('./pages/nicho-clinicas'));
|
||||
const NichoImobiliarias = lazy(() => import('./pages/nicho-imobiliarias'));
|
||||
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';
|
||||
|
||||
@@ -60,20 +90,20 @@ gsap.registerPlugin(ScrollTrigger);
|
||||
// Componente para scroll ao topo ao mudar de página
|
||||
function ScrollToTop() {
|
||||
const { pathname } = useLocation();
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
window.scrollTo(0, 0);
|
||||
// Refresh ScrollTrigger ao mudar de página
|
||||
ScrollTrigger.refresh();
|
||||
}, [pathname]);
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Componente de Progress Bar
|
||||
function ProgressBar() {
|
||||
const [scrollProgress, setScrollProgress] = useState(0);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
const handleScroll = () => {
|
||||
const scrollTop = window.scrollY;
|
||||
@@ -85,7 +115,7 @@ function ProgressBar() {
|
||||
window.addEventListener('scroll', handleScroll, { passive: true });
|
||||
return () => window.removeEventListener('scroll', handleScroll);
|
||||
}, []);
|
||||
|
||||
|
||||
return (
|
||||
<div
|
||||
className="progress-bar"
|
||||
@@ -94,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() {
|
||||
return (
|
||||
<Router>
|
||||
@@ -101,70 +138,100 @@ function App() {
|
||||
<div className="relative bg-[#0e0e0e] min-h-screen">
|
||||
<ProgressBar />
|
||||
<Navigation />
|
||||
|
||||
|
||||
<main>
|
||||
<Routes>
|
||||
{/* Página Inicial */}
|
||||
<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 />} />
|
||||
|
||||
{/* Contato */}
|
||||
<Route path="/contato" element={<Contato />} />
|
||||
|
||||
{/* Páginas Legais */}
|
||||
<Route path="/privacidade" element={<Privacidade />} />
|
||||
<Route path="/termos" element={<Termos />} />
|
||||
|
||||
{/* 404 */}
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
<Suspense fallback={<PageLoader />}>
|
||||
<Routes>
|
||||
{/* 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 */}
|
||||
<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>
|
||||
|
||||
|
||||
<Footer />
|
||||
<WhatsAppWidget />
|
||||
<CookieConsent />
|
||||
|
||||
@@ -1,31 +1,34 @@
|
||||
import { useState } from 'react';
|
||||
import { AlertTriangle, X } from 'lucide-react';
|
||||
import { IS_HOMOLOGATION } from '@/config/mautic';
|
||||
import { ENV_CONFIG, IS_PRODUCTION } from '../config/environment';
|
||||
|
||||
/**
|
||||
* Banner visual que aparece em ambiente de homologacao
|
||||
* Avisa que Mautic, Google Ads e Facebook Pixel estao em modo simulacao
|
||||
* Banner visual que aparece em ambiente NAO-producao
|
||||
* Avisa qual ambiente esta rodando
|
||||
*/
|
||||
export default function HomologationBanner() {
|
||||
export default function AmbientBanner() {
|
||||
const [dismissed, setDismissed] = useState(false);
|
||||
|
||||
if (!IS_HOMOLOGATION || dismissed) return null;
|
||||
// So mostra em producao
|
||||
if (IS_PRODUCTION || dismissed) return null;
|
||||
|
||||
const { bannerText, bannerColor } = ENV_CONFIG;
|
||||
|
||||
return (
|
||||
<div className="fixed bottom-4 right-4 z-[100] max-w-md">
|
||||
<div className="bg-amber-500 text-[#0e0e0e] rounded-xl shadow-2xl p-4 border-2 border-amber-400">
|
||||
<div className={`${bannerColor} text-[#0e0e0e] rounded-xl shadow-2xl p-4 border-2 border-white/20`}>
|
||||
<div className="flex items-start gap-3">
|
||||
<AlertTriangle className="w-5 h-5 shrink-0 mt-0.5" />
|
||||
<div className="flex-1">
|
||||
<p className="font-bold text-sm">Ambiente de Homologacao</p>
|
||||
<p className="font-bold text-sm">Ambiente: {bannerText}</p>
|
||||
<p className="text-xs mt-1 opacity-90">
|
||||
Mautic, Google Ads e Facebook Pixel estao em modo <strong>simulacao</strong>.
|
||||
Nenhum dado real e enviado. Verifique o console (F12) para ver o que seria enviado.
|
||||
Tracking desativado | SEO: noindex |
|
||||
Nenhum dado enviado a Mautic, GA4, Ads ou Pixel.
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => setDismissed(true)}
|
||||
className="shrink-0 p-1 hover:bg-amber-600 rounded-lg transition-colors"
|
||||
className="shrink-0 p-1 hover:bg-black/20 rounded-lg transition-colors"
|
||||
aria-label="Fechar"
|
||||
>
|
||||
<X className="w-4 h-4" />
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
import { Helmet } from 'react-helmet-async';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import { ENV_CONFIG } from '../config/environment';
|
||||
|
||||
interface SEOProps {
|
||||
title?: string;
|
||||
@@ -16,7 +17,7 @@ interface SEOProps {
|
||||
keywords?: string;
|
||||
ogImage?: string;
|
||||
ogType?: string;
|
||||
noindex?: boolean;
|
||||
noindex?: boolean; // Se true, forca noindex mesmo em producao
|
||||
schema?: Record<string, any>;
|
||||
}
|
||||
|
||||
@@ -55,8 +56,8 @@ export default function SEO({
|
||||
{/* Canonical - DINAMICO por pagina */}
|
||||
<link rel="canonical" href={canonicalUrl} />
|
||||
|
||||
{/* Robots */}
|
||||
{noindex ? (
|
||||
{/* Robots - automatico por ambiente, override com prop noindex */}
|
||||
{noindex || !ENV_CONFIG.allowIndexing ? (
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
) : (
|
||||
<meta name="robots" content="index, follow" />
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
// ============================================================================
|
||||
// DETECAO DE AMBIENTE - Automatico por hostname
|
||||
// ============================================================================
|
||||
// Um unico build serve todos os ambientes:
|
||||
// - PRODUCAO (avanzato.com.br): index, tracking ativo
|
||||
// - HOMOLOGACAO (hml.avanzato.com.br): noindex, tracking desativado
|
||||
// - DESENVOLVIMENTO (localhost): noindex, tracking desativado
|
||||
// ============================================================================
|
||||
|
||||
const hostname = typeof window !== 'undefined' ? window.location.hostname : '';
|
||||
|
||||
export type Environment = 'production' | 'homologation' | 'development';
|
||||
|
||||
function detectEnvironment(): Environment {
|
||||
// Producao: domínio principal
|
||||
if (hostname === 'avanzato.com.br' || hostname === 'www.avanzato.com.br') {
|
||||
return 'production';
|
||||
}
|
||||
|
||||
// Homologacao: subdominio hml
|
||||
if (hostname === 'hml.avanzato.com.br') {
|
||||
return 'homologation';
|
||||
}
|
||||
|
||||
// Desenvolvimento: localhost, 127.0.0.1, IPs locais, previews
|
||||
if (
|
||||
hostname === 'localhost' ||
|
||||
hostname === '127.0.0.1' ||
|
||||
hostname.startsWith('192.168.') ||
|
||||
hostname.startsWith('10.') ||
|
||||
hostname.startsWith('172.') ||
|
||||
hostname.includes('kimi.page') || // previews
|
||||
hostname === '' // SSR
|
||||
) {
|
||||
return 'development';
|
||||
}
|
||||
|
||||
// Fallback: se nao reconhece, trata como homologacao (seguro)
|
||||
return 'homologation';
|
||||
}
|
||||
|
||||
export const ENV = detectEnvironment();
|
||||
|
||||
// Helpers
|
||||
export const IS_PRODUCTION = ENV === 'production';
|
||||
export const IS_HOMOLOGATION = ENV === 'homologation';
|
||||
export const IS_DEVELOPMENT = ENV === 'development';
|
||||
|
||||
// Configuracoes por ambiente
|
||||
export const ENV_CONFIG = {
|
||||
// SEO / Indexacao
|
||||
allowIndexing: IS_PRODUCTION, // So producao permite Google indexar
|
||||
robotsMeta: IS_PRODUCTION ? 'index, follow' : 'noindex, nofollow',
|
||||
|
||||
// Tracking / Integracoes
|
||||
mauticActive: IS_PRODUCTION, // So envia leads reais em producao
|
||||
googleAnalytics: IS_PRODUCTION, // So trackeia em producao
|
||||
googleAds: IS_PRODUCTION, // So dispara conversões em producao
|
||||
facebookPixel: IS_PRODUCTION, // So dispara pixel em producao
|
||||
|
||||
// Visual
|
||||
showBanner: !IS_PRODUCTION, // Banner de ambiente em hom/dev
|
||||
bannerText: IS_HOMOLOGATION ? 'HOMOLOGACAO' : 'DESENVOLVIMENTO',
|
||||
bannerColor: IS_HOMOLOGATION ? 'bg-yellow-500' : 'bg-blue-500',
|
||||
} as const;
|
||||
|
||||
// Log para debug
|
||||
if (typeof window !== 'undefined') {
|
||||
console.log(`[Ambiente] ${ENV.toUpperCase()} | Host: ${hostname}`);
|
||||
if (!IS_PRODUCTION) {
|
||||
console.log('[Ambiente] Tracking desativado | SEO: noindex');
|
||||
}
|
||||
}
|
||||
+11
-16
@@ -1,12 +1,7 @@
|
||||
// Configuracao do Mautic - Avanzato
|
||||
// URL: https://mkt.avanzato.com.br
|
||||
|
||||
// --- DETECAO DE AMBIENTE ---
|
||||
// Em homologacao (localhost, IP, ou nao-producao), o Mautic fica em modo simulacao
|
||||
// Apenas loga no console, nao envia dados reais
|
||||
const hostname = typeof window !== 'undefined' ? window.location.hostname : '';
|
||||
const PROD_HOSTS = ['avanzato.com.br'];
|
||||
export const IS_HOMOLOGATION = !PROD_HOSTS.includes(hostname);
|
||||
import { IS_PRODUCTION } from './environment';
|
||||
|
||||
export const MAUTIC_CONFIG = {
|
||||
baseUrl: 'https://mkt.avanzato.com.br',
|
||||
@@ -17,8 +12,8 @@ export const MAUTIC_CONFIG = {
|
||||
contato: { id: '4', enabled: true },
|
||||
},
|
||||
|
||||
// Desativa envio real em homologacao
|
||||
enabled: !IS_HOMOLOGATION,
|
||||
// So envia dados reais em producao
|
||||
enabled: IS_PRODUCTION,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -37,9 +32,9 @@ export const sendLeadToMautic = (
|
||||
return false;
|
||||
}
|
||||
|
||||
// MODO HOMOLOGACAO: simula envio, nao manda dados reais
|
||||
if (IS_HOMOLOGATION) {
|
||||
console.log('%c[HOMOLOGACAO] Mautic em modo simulacao - dados NAO enviados ao servidor real', 'background:#f59e0b;color:#000;font-weight:bold;padding:4px 8px;border-radius:4px');
|
||||
// MODO NAO-PRODUCAO: simula envio, nao manda dados reais
|
||||
if (!IS_PRODUCTION) {
|
||||
console.log('%c[' + (window as any).__AVANZATO_ENV__?.toUpperCase() + '] Mautic em modo simulacao - dados NAO enviados', 'background:#f59e0b;color:#000;font-weight:bold;padding:4px 8px;border-radius:4px');
|
||||
console.log(`[Mautic] Form: ${formType} | Form ID: ${formConfig.id}`);
|
||||
console.log(`[Mautic] Dados que seriam enviados:`, JSON.stringify(formData, null, 2));
|
||||
console.log(`[Mautic] Em producao, enviaria para: ${MAUTIC_CONFIG.baseUrl}/form/submit?formId=${formConfig.id}`);
|
||||
@@ -123,8 +118,8 @@ export const sendLeadViaMailto = (formData: Record<string, string>): void => {
|
||||
* Desativado em homologacao para nao poluir dados
|
||||
*/
|
||||
export const trackConversion = (): void => {
|
||||
if (IS_HOMOLOGATION) {
|
||||
console.log('%c[HOMOLOGACAO] Google Ads conversion NAO disparado (ambiente de teste)', 'color:#f59e0b');
|
||||
if (!IS_PRODUCTION) {
|
||||
console.log('%c[' + (window as any).__AVANZATO_ENV__ + '] Google Ads conversion NAO disparado', 'color:#f59e0b');
|
||||
return;
|
||||
}
|
||||
if (typeof window !== 'undefined' && (window as any).gtag) {
|
||||
@@ -142,12 +137,12 @@ export const trackConversion = (): void => {
|
||||
* Desativado em homologacao
|
||||
*/
|
||||
export const trackFacebookPixel = (eventName: string = 'Lead', params?: Record<string, any>): void => {
|
||||
if (IS_HOMOLOGATION) {
|
||||
console.log(`%c[HOMOLOGACAO] Facebook Pixel "${eventName}" NAO disparado (ambiente de teste)`, 'color:#f59e0b', params);
|
||||
if (!IS_PRODUCTION) {
|
||||
console.log(`%c[${(window as any).__AVANZATO_ENV__}] Facebook Pixel "${eventName}" NAO disparado`, 'color:#f59e0b', params);
|
||||
return;
|
||||
}
|
||||
if (typeof window !== 'undefined' && (window as any).fbq) {
|
||||
(window as any).fbq('track', eventName, params || {});
|
||||
console.log(`[Facebook Pixel] Evento: ${eventName}`, params);
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,176 @@
|
||||
// ============================================================================
|
||||
// SCHEMA.ORG - Dados estruturados para SEO
|
||||
// ============================================================================
|
||||
// Uso: import { organizationSchema, localBusinessSchema, etc } from '../config/schema';
|
||||
// <SEO schema={organizationSchema} />
|
||||
// ============================================================================
|
||||
|
||||
export const SITE_URL = 'https://avanzato.com.br';
|
||||
|
||||
// --- Organization (empresa) ---
|
||||
export const organizationSchema = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
name: 'Avanzato Tecnologia',
|
||||
alternateName: 'Avanzato',
|
||||
url: SITE_URL,
|
||||
logo: `${SITE_URL}/logo.png`,
|
||||
description: 'Solucoes em TI Gerenciada, Cloud Computing e Seguranca da Informacao. +23 anos de experiencia, +500 clientes atendidos.',
|
||||
foundingDate: '2000',
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
streetAddress: 'Rua Maria Curupaiti, 471 - Sala 01',
|
||||
addressLocality: 'Guarulhos',
|
||||
addressRegion: 'SP',
|
||||
postalCode: '07110-060',
|
||||
addressCountry: 'BR',
|
||||
},
|
||||
contactPoint: [
|
||||
{
|
||||
'@type': 'ContactPoint',
|
||||
telephone: '+55-11-4810-1704',
|
||||
contactType: 'sales',
|
||||
availableLanguage: ['Portuguese'],
|
||||
areaServed: 'BR',
|
||||
},
|
||||
{
|
||||
'@type': 'ContactPoint',
|
||||
telephone: '+55-11-93393-0619',
|
||||
contactType: 'customer service',
|
||||
contactOption: 'TollFree',
|
||||
availableLanguage: ['Portuguese'],
|
||||
areaServed: 'BR',
|
||||
},
|
||||
],
|
||||
sameAs: [
|
||||
'https://www.facebook.com/avanzato',
|
||||
'https://www.instagram.com/avanzato',
|
||||
'https://www.linkedin.com/company/avanzato',
|
||||
'https://www.youtube.com/@avanzato',
|
||||
],
|
||||
email: 'contato@avanzato.com.br',
|
||||
};
|
||||
|
||||
// --- LocalBusiness (matriz Guarulhos) ---
|
||||
export const localBusinessGuarulhos = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'LocalBusiness',
|
||||
name: 'Avanzato Tecnologia - Guarulhos',
|
||||
description: 'Suporte de TI empresarial em Guarulhos e regiao. Atendimento presencial e remoto.',
|
||||
url: `${SITE_URL}/suporte-ti-guarulhos`,
|
||||
telephone: '+55-11-4810-1704',
|
||||
email: 'contato@avanzato.com.br',
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
streetAddress: 'Rua Maria Curupaiti, 471 - Sala 01',
|
||||
addressLocality: 'Guarulhos',
|
||||
addressRegion: 'SP',
|
||||
postalCode: '07110-060',
|
||||
addressCountry: 'BR',
|
||||
},
|
||||
geo: {
|
||||
'@type': 'GeoCoordinates',
|
||||
latitude: '-23.4568',
|
||||
longitude: '-46.5333',
|
||||
},
|
||||
openingHours: [
|
||||
'Mo-Fr 08:00-18:00',
|
||||
'Sa 09:00-13:00',
|
||||
],
|
||||
priceRange: '$$',
|
||||
areaServed: {
|
||||
'@type': 'City',
|
||||
name: 'Guarulhos',
|
||||
},
|
||||
};
|
||||
|
||||
// --- Service schemas ---
|
||||
export const createServiceSchema = (name: string, description: string, urlPath: string) => ({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Service',
|
||||
name,
|
||||
description,
|
||||
provider: {
|
||||
'@type': 'Organization',
|
||||
name: 'Avanzato Tecnologia',
|
||||
url: SITE_URL,
|
||||
},
|
||||
url: `${SITE_URL}${urlPath}`,
|
||||
areaServed: {
|
||||
'@type': 'Country',
|
||||
name: 'Brasil',
|
||||
},
|
||||
});
|
||||
|
||||
// --- FAQ schemas ---
|
||||
export const createFAQSchema = (questions: Array<{q: string; a: string}>) => ({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
mainEntity: questions.map(({q, a}) => ({
|
||||
'@type': 'Question',
|
||||
name: q,
|
||||
acceptedAnswer: {
|
||||
'@type': 'Answer',
|
||||
text: a,
|
||||
},
|
||||
})),
|
||||
});
|
||||
|
||||
// --- Review schema ---
|
||||
export const createReviewSchema = (reviews: Array<{author: string; rating: number; text: string}>) => ({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
name: 'Avanzato Tecnologia',
|
||||
aggregateRating: {
|
||||
'@type': 'AggregateRating',
|
||||
ratingValue: '4.9',
|
||||
reviewCount: String(reviews.length),
|
||||
bestRating: '5',
|
||||
worstRating: '1',
|
||||
},
|
||||
review: reviews.map(r => ({
|
||||
'@type': 'Review',
|
||||
author: { '@type': 'Person', name: r.author },
|
||||
reviewRating: {
|
||||
'@type': 'Rating',
|
||||
ratingValue: String(r.rating),
|
||||
bestRating: '5',
|
||||
},
|
||||
reviewBody: r.text,
|
||||
})),
|
||||
});
|
||||
|
||||
// --- Breadcrumb ---
|
||||
export const createBreadcrumbSchema = (items: Array<{name: string; url: string}>) => ({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'BreadcrumbList',
|
||||
itemListElement: items.map((item, idx) => ({
|
||||
'@type': 'ListItem',
|
||||
position: idx + 1,
|
||||
name: item.name,
|
||||
item: item.url,
|
||||
})),
|
||||
});
|
||||
|
||||
// --- LocalBusiness para cada cidade ---
|
||||
export const createLocalBusinessSchema = (city: string, slug: string, phone?: string) => ({
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'LocalBusiness',
|
||||
name: `Avanzato Tecnologia - ${city}`,
|
||||
description: `Suporte de TI empresarial em ${city} e regiao. Atendimento presencial e remoto para empresas de todos os portes.`,
|
||||
url: `${SITE_URL}/suporte-ti-${slug}`,
|
||||
telephone: phone || '+55-11-4810-1704',
|
||||
email: 'contato@avanzato.com.br',
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
addressLocality: city,
|
||||
addressRegion: 'SP',
|
||||
addressCountry: 'BR',
|
||||
},
|
||||
openingHours: ['Mo-Fr 08:00-18:00'],
|
||||
priceRange: '$$',
|
||||
areaServed: {
|
||||
'@type': 'City',
|
||||
name: city,
|
||||
},
|
||||
});
|
||||
@@ -130,6 +130,8 @@ export const NAV_LINKS = [
|
||||
},
|
||||
{ name: 'Tecnologias', href: '/tecnologias' },
|
||||
{ name: 'Avaliacao TI', href: '/avaliacao' },
|
||||
{ name: 'Ferramentas', href: '/ferramentas' },
|
||||
{ name: 'Onde Atuamos', href: '/onde-atuamos' },
|
||||
{ name: 'Cases', href: '/cases' },
|
||||
{ name: 'Blog', href: '/blog' },
|
||||
{ name: 'Contato', href: '/contato' },
|
||||
@@ -146,6 +148,7 @@ export const FOOTER_LINKS = {
|
||||
],
|
||||
empresa: [
|
||||
{ name: 'Sobre nos', href: '/sobre' },
|
||||
{ name: 'Onde Atuamos', href: '/onde-atuamos' },
|
||||
{ name: 'Cases de sucesso', href: '/cases' },
|
||||
{ name: 'Blog', href: '/blog' },
|
||||
{ name: 'Trabalhe conosco', href: '/contato' },
|
||||
|
||||
+183
-306
@@ -1,355 +1,232 @@
|
||||
import { useState } from 'react';
|
||||
import SEO from '../components/SEO';
|
||||
import { useEffect, useRef } from 'react';
|
||||
import { gsap } from 'gsap';
|
||||
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
||||
import { ArrowRight, TrendingUp, Users, Clock, Check, Star, MapPin, Building2 } from 'lucide-react';
|
||||
import { createBreadcrumbSchema } from '../config/schema';
|
||||
import { ArrowRight, MapPin, Building2, CheckCircle, Filter } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
gsap.registerPlugin(ScrollTrigger);
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Cases de Sucesso', url: 'https://avanzato.com.br/cases' },
|
||||
]);
|
||||
|
||||
// Cases reais baseados nos testemunhos
|
||||
const casesReais = [
|
||||
const cases = [
|
||||
{
|
||||
id: 1,
|
||||
cliente: 'Moraes & Moraes Advogados',
|
||||
responsavel: 'Edilson Fernando de Moraes',
|
||||
segmento: 'Advocacia',
|
||||
cidade: 'São Paulo',
|
||||
icone: '⚖️',
|
||||
servico: 'TI Gerenciada + Consultoria',
|
||||
desafio: 'Computadores lentos e problemas constantes faziam cogitar a troca de toda a frota, com custo estimado de R$ 15.000.',
|
||||
solucao: 'Diagnóstico completo, otimização dos equipamentos existentes e implementação de políticas de manutenção preventiva.',
|
||||
resultados: [
|
||||
'Economia de mais de R$ 15.000',
|
||||
'Máquinas recuperadas e otimizadas',
|
||||
'Profissionalismo ímpar no atendimento',
|
||||
],
|
||||
quote: 'Evitamos um investimento de mais de R$ 15.000 com a solução aplicada.',
|
||||
destaque: 'Economia de R$ 15.000',
|
||||
titulo: 'Apoio 24 Horas',
|
||||
segmento: 'Monitoramento',
|
||||
cidade: 'Sao Paulo - Vila Formosa',
|
||||
descricao: 'Empresa de monitoramento de alarmes e CFTV que necessitava de infraestrutura robusta para operacao 24/7.',
|
||||
desafio: 'Necessidade de servidor dedicado para rodar sistema Moni (recepcao de alarmes), Power Manage (gerenciamento DSC), Service (ERP) e interligacao de multiplos condominios via VPN.',
|
||||
solucao: 'Implantamos servidores locais com virtualizacao, configuramos pfSense para gerenciamento de rede, VPN entre condominios e escritorio central, e suporte completo a infraestrutura.',
|
||||
tecnologias: ['Windows Server', 'Linux', 'pfSense', 'VPN', 'Virtualizacao'],
|
||||
resultado: '100% de uptime nos sistemas de monitoramento. Comunicacao segura entre todas as unidades.',
|
||||
servicos: ['Servidores', 'VPN', 'Suporte', 'Rede', 'Monitoramento'],
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
cliente: 'Divas Car',
|
||||
responsavel: 'Joelma Rodrigues',
|
||||
segmento: 'Centro Automotivo',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🚘',
|
||||
servico: 'Infraestrutura + Backup em Nuvem',
|
||||
desafio: 'Sistema da oficina não estava no servidor, ficando nas CPUs dos computadores, sem backup adequado.',
|
||||
solucao: 'Migração do sistema para o servidor corporativo e implementação de backup automatizado em nuvem.',
|
||||
resultados: [
|
||||
'Sistema centralizado no servidor',
|
||||
'Backup em nuvem implementado',
|
||||
'Funcionando perfeitamente',
|
||||
],
|
||||
quote: 'Hoje todo o sistema está estruturado com backup em nuvem e funcionando perfeitamente.',
|
||||
destaque: 'Backup em nuvem',
|
||||
titulo: 'ONG - Institucional',
|
||||
segmento: 'Institucional',
|
||||
cidade: 'Sao Paulo - Ipiranga',
|
||||
descricao: 'Organizacao do terceiro setor com alta demanda de seguranca e disponibilidade de dados.',
|
||||
desafio: 'Ambiente com multiplos usuarios, necessidade de alta seguranca, backup confiavel e infraestrutura em cloud para acessos remotos.',
|
||||
solucao: 'Administracao completa de servidores, backup automatizado, implantacao de solucao cloud e hardening de seguranca.',
|
||||
tecnologias: ['Windows Server', 'Cloud', 'Backup', 'Seguranca'],
|
||||
resultado: 'Ambiente seguro, backup funcionando sem falhas, acesso remoto estavel para toda a equipe.',
|
||||
servicos: ['Suporte', 'Servidores', 'Backup', 'Cloud', 'Seguranca'],
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
cliente: 'Toyota Arquitetura',
|
||||
responsavel: 'Elio Toyota',
|
||||
segmento: 'Arquitetura',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🪵',
|
||||
servico: 'Suporte Técnico Emergencial',
|
||||
desafio: 'Notebook parou de funcionar em final de semana, com contrato importante para fechar.',
|
||||
solucao: 'Atendimento emergencial em final de semana, recuperação de dados e projetos do cliente.',
|
||||
resultados: [
|
||||
'Atendimento fora do horário comercial',
|
||||
'Dados recuperados com sucesso',
|
||||
'Contrato salvo e fechado no prazo',
|
||||
],
|
||||
quote: 'Fui atendido prontamente, mesmo fora do horário, salvando um contrato importante.',
|
||||
destaque: 'Atendimento emergencial',
|
||||
titulo: 'Museu de Faculdade Publica',
|
||||
segmento: 'Acervo Digital',
|
||||
cidade: 'Sao Paulo - Cerqueira Cesar',
|
||||
descricao: 'Instituicao de ensino superior com necessidade de digitalizacao e gestao de acervo historico.',
|
||||
desafio: 'Necessidade de implantar sistema de gestao de acervo digital com milhares de itens catalogados, acessivel ao publico.',
|
||||
solucao: 'Implantacao das plataformas Tainacan e ICA-AtoM para gestao e exposicao digital do acervo. Customizacao e treinamento da equipe.',
|
||||
tecnologias: ['Tainacan', 'ICA-AtoM', 'WordPress', 'Hospedagem'],
|
||||
resultado: 'Acervo digital disponivel online com busca avancada. Milhares de itens catalogados e acessiveis ao publico.',
|
||||
servicos: ['Implantacao', 'Hospedagem', 'Suporte', 'Treinamento'],
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
cliente: 'SEG1 Corretora de Seguros',
|
||||
responsavel: 'Jorge Luiz Braga',
|
||||
segmento: 'Seguros',
|
||||
titulo: 'Thalls',
|
||||
segmento: 'Industria',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🛡️',
|
||||
servico: 'Otimização de Equipamentos',
|
||||
desafio: 'Computadores lentos afetando a produtividade da equipe de vendas.',
|
||||
solucao: 'Upgrade estratégico de hardware e otimização do sistema operacional.',
|
||||
resultados: [
|
||||
'Melhoria em todos os computadores',
|
||||
'Apenas 10% do investimento previsto',
|
||||
'90% de economia no projeto',
|
||||
],
|
||||
quote: 'Melhoramos todos os computadores com apenas 10% do investimento necessário.',
|
||||
destaque: '90% de economia',
|
||||
},
|
||||
];
|
||||
|
||||
// Todos os depoimentos
|
||||
const todosDepoimentos = [
|
||||
{
|
||||
cliente: 'R2 Car',
|
||||
responsavel: 'R2 Car Centro Automotivo',
|
||||
segmento: 'Pintura Automotiva',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🚗',
|
||||
quote: 'Em menos de uma hora todos os problemas foram resolvidos e tudo voltou a funcionar perfeitamente.',
|
||||
destaque: 'Resolvido em < 1 hora',
|
||||
descricao: 'Industria com necessidade de infraestrutura completa incluindo telefonia.',
|
||||
desafio: 'Ambiente industrial que precisava de suporte tecnico, administracao de servidores, backup e sistema de telefonia VoIP integrado.',
|
||||
solucao: 'Suporte completo a computadores e servidores, backup corporativo e implantacao de sistema VoIP com ramais para producao e administrativo.',
|
||||
tecnologias: ['Windows Server', 'Backup', 'FusionPBX', 'VoIP'],
|
||||
resultado: 'Producao e administrativo integrados via telefonia IP. Backup funcionando sem intercorrencias.',
|
||||
servicos: ['Suporte', 'Servidores', 'Backup', 'VoIP'],
|
||||
},
|
||||
{
|
||||
cliente: 'Simpercom',
|
||||
responsavel: 'João de Paula',
|
||||
segmento: 'Impermeabilização',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🧱',
|
||||
quote: 'O problema foi resolvido com excelência, fortalecendo ainda mais nossa parceria.',
|
||||
destaque: 'Excelência no serviço',
|
||||
},
|
||||
{
|
||||
cliente: 'Summa',
|
||||
responsavel: 'Silvia Pedrosa Luiz',
|
||||
segmento: 'Coaching',
|
||||
cidade: 'São Paulo',
|
||||
icone: '🧠',
|
||||
quote: 'Os problemas foram resolvidos com rapidez e eficiência, mesmo para quem não entende de tecnologia.',
|
||||
destaque: 'Rapidez e eficiência',
|
||||
},
|
||||
{
|
||||
cliente: 'Visão Contabilidade',
|
||||
responsavel: 'Antonio Gonçalves',
|
||||
id: 5,
|
||||
titulo: 'Dellacont',
|
||||
segmento: 'Contabilidade',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '📊',
|
||||
quote: 'Passei a indicar os serviços com total confiança pela qualidade e agilidade.',
|
||||
destaque: 'Total confiança',
|
||||
descricao: 'Escritorio de contabilidade com alta dependencia de sistemas e seguranca de dados.',
|
||||
desafio: 'Necessidade de suporte tecnico confiavel, servidor proprio para sistemas contabeis e backup diario de informacoes fiscais.',
|
||||
solucao: 'Suporte mensal a todos os computadores, administracao de servidor Windows com sistemas contabeis, backup automatizado e relatorios periodicos.',
|
||||
tecnologias: ['Windows Server', 'Backup', 'GLPI'],
|
||||
resultado: 'Zero perda de dados em 5+ anos. Sistemas contabeis sempre disponiveis.',
|
||||
servicos: ['Suporte', 'Servidores', 'Backup'],
|
||||
},
|
||||
{
|
||||
cliente: 'Lucio Seguros',
|
||||
responsavel: 'Lucio Benevenuto',
|
||||
segmento: 'Seguros',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🛡️',
|
||||
quote: 'O equipamento ganhou performance e o atendimento foi rápido e eficiente.',
|
||||
destaque: 'Performance melhorada',
|
||||
},
|
||||
{
|
||||
cliente: 'Caroni Reis Advogados',
|
||||
responsavel: 'Jorge Paulo Caroni Reis',
|
||||
id: 6,
|
||||
titulo: 'Mourad Naddi Advogados',
|
||||
segmento: 'Advocacia',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '⚖️',
|
||||
quote: 'Fui atendido com dedicação e profissionalismo, sempre dentro do prazo e orçamento.',
|
||||
destaque: 'Dentro do prazo',
|
||||
descricao: 'Escritorio de advocacia com necessidade de seguranca e disponibilidade de processos.',
|
||||
desafio: 'Ambiente com dados sensiveis de clientes, necessidade de LGPD, backup seguro e acesso remoto.',
|
||||
solucao: 'Administracao de servidor, backup criptografado, suporte mensal a estacoes de trabalho e consultoria em seguranca da informacao.',
|
||||
tecnologias: ['Windows Server', 'Backup', 'VPN', 'Seguranca'],
|
||||
resultado: 'Ambiente seguro em conformidade com LGPD. Acesso remoto estavel para advogados.',
|
||||
servicos: ['Suporte', 'Servidores', 'Backup', 'VPN'],
|
||||
},
|
||||
{
|
||||
cliente: 'Trilha Empregos',
|
||||
responsavel: 'Suelia Luz',
|
||||
segmento: 'Recrutamento',
|
||||
cidade: 'Guarulhos',
|
||||
icone: '🧩',
|
||||
quote: 'Superou minhas expectativas com um atendimento atencioso, competente e eficiente.',
|
||||
destaque: 'Superou expectativas',
|
||||
id: 7,
|
||||
titulo: 'GateOne e Fox',
|
||||
segmento: 'Monitoramento',
|
||||
cidade: 'Mongagua',
|
||||
descricao: 'Duas empresas de monitoramento no mesmo endereco com necessidades distintas.',
|
||||
desafio: 'Dois negocios no mesmo predio, um com operacao centralizada em SP e outro local. Necessidade de separacao de redes, VPN e administracao de servidores.',
|
||||
solucao: 'Configuracao de pfSense para roteamento, VPN entre unidades, administracao de servidores e suporte a equipe tecnica e comercial.',
|
||||
tecnologias: ['pfSense', 'VPN', 'Windows Server', 'MikroTik'],
|
||||
resultado: 'Duas operacoes funcionando independentemente com comunicacao segura entre unidades.',
|
||||
servicos: ['Servidores', 'VPN', 'Rede', 'Suporte'],
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
titulo: 'Lucena Textil',
|
||||
segmento: 'Textil',
|
||||
cidade: 'Sao Paulo - Bras',
|
||||
descricao: 'Empresa textil com infraestrutura hibrida.',
|
||||
desafio: 'Necessidade de hospedar servidor local com acesso remoto seguro para equipe externa e backup confiavel.',
|
||||
solucao: 'Colocation do servidor em nossa infraestrutura, configuracao de VPN, suporte a rede local e backup automatizado.',
|
||||
tecnologias: ['Colocation', 'VPN', 'Backup', 'Rede'],
|
||||
resultado: 'Servidor sempre online com acesso remoto seguro. Backup funcionando automaticamente.',
|
||||
servicos: ['Colocation', 'VPN', 'Rede', 'Backup'],
|
||||
},
|
||||
];
|
||||
|
||||
const estatisticas = [
|
||||
{ valor: '+500', label: 'Clientes atendidos', icon: <Users className="w-6 h-6" /> },
|
||||
{ valor: '99.9%', label: 'Uptime médio', icon: <Clock className="w-6 h-6" /> },
|
||||
{ valor: 'R$ 15K', label: 'Economia média', icon: <TrendingUp className="w-6 h-6" /> },
|
||||
];
|
||||
const segmentos = ['Todos', ...new Set(cases.map(c => c.segmento))];
|
||||
|
||||
const Cases = () => {
|
||||
const heroRef = useRef<HTMLDivElement>(null);
|
||||
const casesRef = useRef<HTMLDivElement>(null);
|
||||
const depoimentosRef = useRef<HTMLDivElement>(null);
|
||||
const [filtro, setFiltro] = useState('Todos');
|
||||
|
||||
useEffect(() => {
|
||||
const ctx = gsap.context(() => {
|
||||
const heroItems = heroRef.current?.querySelectorAll('.animate-item');
|
||||
if (heroItems?.length) {
|
||||
gsap.fromTo(heroItems, { y: 50, opacity: 0 }, { y: 0, opacity: 1, duration: 0.8, stagger: 0.1, ease: 'expo.out' });
|
||||
}
|
||||
|
||||
const caseCards = casesRef.current?.querySelectorAll('.case-card');
|
||||
if (caseCards?.length) {
|
||||
gsap.fromTo(caseCards, { y: 50, opacity: 0 }, { y: 0, opacity: 1, duration: 0.6, stagger: 0.15, ease: 'back.out(1.7)', scrollTrigger: { trigger: casesRef.current, start: 'top 80%' } });
|
||||
}
|
||||
|
||||
const depoCards = depoimentosRef.current?.querySelectorAll('.depo-card');
|
||||
if (depoCards?.length) {
|
||||
gsap.fromTo(depoCards, { y: 40, opacity: 0 }, { y: 0, opacity: 1, duration: 0.5, stagger: 0.08, ease: 'expo.out', scrollTrigger: { trigger: depoimentosRef.current, start: 'top 80%' } });
|
||||
}
|
||||
});
|
||||
|
||||
return () => ctx.revert();
|
||||
}, []);
|
||||
|
||||
// Schema.org para SEO
|
||||
const schemaData = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "ItemList",
|
||||
"itemListElement": casesReais.map((c, i) => ({
|
||||
"@type": "ListItem",
|
||||
"position": i + 1,
|
||||
"item": {
|
||||
"@type": "Review",
|
||||
"author": { "@type": "Person", "name": c.responsavel },
|
||||
"reviewRating": { "@type": "Rating", "ratingValue": 5, "bestRating": 5 },
|
||||
"reviewBody": c.quote,
|
||||
"publisher": { "@type": "Organization", "name": c.cliente }
|
||||
}
|
||||
}))
|
||||
};
|
||||
const casesFiltrados = filtro === 'Todos'
|
||||
? cases
|
||||
: cases.filter(c => c.segmento === filtro);
|
||||
|
||||
return (
|
||||
<div className="bg-[#0e0e0e] min-h-screen">
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Cases de Sucesso"
|
||||
description="Veja os cases de sucesso da Avanzato Tecnologia. Projetos realizados para empresas de diversos segmentos em Sao Paulo."
|
||||
title="Cases de Sucesso - Avanzato Tecnologia"
|
||||
description="Conheca nossos cases de sucesso em TI. Empresas de contabilidade, advocacia, industria, monitoramento e mais. +23 anos de experiencia."
|
||||
keywords="cases de sucesso ti, projetos ti empresas, suporte ti empresarial"
|
||||
schema={breadcrumbSchema}
|
||||
/>
|
||||
{/* Schema.org JSON-LD */}
|
||||
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schemaData) }} />
|
||||
|
||||
{/* Hero */}
|
||||
<section ref={heroRef} className="pt-32 pb-20 relative overflow-hidden">
|
||||
<div className="absolute top-0 right-0 w-[600px] h-[600px] bg-[#cbf400]/5 rounded-full blur-3xl -translate-y-1/2 translate-x-1/2" />
|
||||
<div className="container-custom relative z-10">
|
||||
<div className="text-center max-w-3xl mx-auto">
|
||||
<span className="animate-item inline-block px-4 py-2 rounded-full bg-[#cbf400]/10 text-[#cbf400] text-sm font-semibold mb-6 border border-[#cbf400]/20">
|
||||
Cases de Sucesso
|
||||
</span>
|
||||
<h1 className="animate-item text-4xl md:text-5xl lg:text-6xl font-black text-white mb-6">
|
||||
Resultados que <span className="text-gradient">falam</span> por si
|
||||
</h1>
|
||||
<p className="animate-item text-xl text-gray-400 mb-12">
|
||||
Histórias reais de empresas que transformaram sua TI com a Avanzato.
|
||||
</p>
|
||||
<div className="animate-item grid grid-cols-3 gap-8">
|
||||
{estatisticas.map((stat, i) => (
|
||||
<div key={i} className="text-center">
|
||||
<div className="w-14 h-14 rounded-xl bg-[#cbf400]/10 flex items-center justify-center mx-auto mb-3 text-[#cbf400]">{stat.icon}</div>
|
||||
<div className="text-3xl md:text-4xl font-black text-[#cbf400]">{stat.valor}</div>
|
||||
<div className="text-gray-500 text-sm">{stat.label}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Cases de <span className="text-[#cbf400]">Sucesso</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Conheca alguns dos projetos que realizamos. Empresas de diversos segmentos
|
||||
que confiam na Avanzato para sua infraestrutura de TI.
|
||||
</p>
|
||||
|
||||
{/* Filtros */}
|
||||
<div className="flex flex-wrap gap-3 mb-12">
|
||||
<Filter className="w-5 h-5 text-[#cbf400] mr-2" />
|
||||
{segmentos.map(seg => (
|
||||
<button
|
||||
key={seg}
|
||||
onClick={() => setFiltro(seg)}
|
||||
className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors ${
|
||||
filtro === seg
|
||||
? 'bg-[#cbf400] text-[#0e0e0e]'
|
||||
: 'bg-[#1a1a1a] text-gray-300 hover:text-white border border-[#2a2a2a]'
|
||||
}`}
|
||||
>
|
||||
{seg}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Cases Detalhados */}
|
||||
<section ref={casesRef} className="py-20">
|
||||
<div className="container-custom">
|
||||
<h2 className="text-3xl md:text-4xl font-black text-white text-center mb-16">
|
||||
Cases de <span className="text-gradient">Sucesso</span>
|
||||
</h2>
|
||||
<div className="space-y-16">
|
||||
{casesReais.map((caseItem, index) => (
|
||||
<div key={caseItem.id} className={`case-card grid lg:grid-cols-2 gap-8 items-center ${index % 2 === 1 ? 'lg:flex-row-reverse' : ''}`}>
|
||||
<div className={index % 2 === 1 ? 'lg:order-2' : ''}>
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-white/5">
|
||||
<div className="flex items-center gap-4 mb-6">
|
||||
<div className="w-16 h-16 rounded-full bg-gradient-to-br from-[#cbf400]/20 to-[#cbf400]/5 flex items-center justify-center text-3xl">
|
||||
{caseItem.icone}
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-xl font-bold text-white">{caseItem.cliente}</h3>
|
||||
<div className="flex items-center gap-2 text-gray-400 text-sm">
|
||||
<Building2 className="w-3 h-3" />
|
||||
<span>{caseItem.segmento}</span>
|
||||
<span>•</span>
|
||||
<MapPin className="w-3 h-3" />
|
||||
<span>{caseItem.cidade}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<span className="text-[#cbf400] text-sm font-medium">Serviço:</span>
|
||||
<p className="text-white">{caseItem.servico}</p>
|
||||
</div>
|
||||
<div>
|
||||
<span className="text-gray-500 text-sm">Desafio:</span>
|
||||
<p className="text-gray-300">{caseItem.desafio}</p>
|
||||
</div>
|
||||
<div>
|
||||
<span className="text-gray-500 text-sm">Solução:</span>
|
||||
<p className="text-gray-300">{caseItem.solucao}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* Grid de Cases */}
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-16">
|
||||
{casesFiltrados.map((c) => (
|
||||
<div
|
||||
key={c.id}
|
||||
className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] hover:border-[#cbf400]/30 transition-all"
|
||||
>
|
||||
<div className="flex items-center gap-2 text-sm text-[#cbf400] mb-3">
|
||||
<MapPin className="w-4 h-4" />
|
||||
{c.cidade}
|
||||
<span className="text-gray-500">|</span>
|
||||
<Building2 className="w-4 h-4" />
|
||||
{c.segmento}
|
||||
</div>
|
||||
|
||||
<h2 className="text-2xl font-bold text-white mb-3">{c.titulo}</h2>
|
||||
<p className="text-gray-300 mb-6">{c.descricao}</p>
|
||||
|
||||
<div className="space-y-4 mb-6">
|
||||
<div>
|
||||
<h3 className="text-sm font-semibold text-[#cbf400] uppercase tracking-wide mb-1">Desafio</h3>
|
||||
<p className="text-gray-400 text-sm">{c.desafio}</p>
|
||||
</div>
|
||||
<div className={index % 2 === 1 ? 'lg:order-1' : ''}>
|
||||
<div className="bg-gradient-to-br from-[#cbf400]/10 to-transparent rounded-2xl p-8 border border-[#cbf400]/20">
|
||||
<h4 className="text-lg font-bold text-white mb-6 flex items-center gap-2">
|
||||
<TrendingUp className="w-5 h-5 text-[#cbf400]" />
|
||||
Resultados
|
||||
</h4>
|
||||
<ul className="space-y-4 mb-8">
|
||||
{caseItem.resultados.map((r, i) => (
|
||||
<li key={i} className="flex items-center gap-3">
|
||||
<div className="w-6 h-6 rounded-full bg-[#cbf400]/20 flex items-center justify-center flex-shrink-0"><Check className="w-4 h-4 text-[#cbf400]" /></div>
|
||||
<span className="text-white">{r}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
<div className="bg-[#0e0e0e] rounded-xl p-6">
|
||||
<div className="flex gap-1 mb-3">
|
||||
{[...Array(5)].map((_, i) => <Star key={i} className="w-4 h-4 text-[#cbf400] fill-[#cbf400]" />)}
|
||||
</div>
|
||||
<p className="text-2xl mb-3">{caseItem.icone}</p>
|
||||
<p className="text-gray-300 italic mb-4">"{caseItem.quote}"</p>
|
||||
<div className="text-white font-medium text-sm">{caseItem.responsavel}</div>
|
||||
<div className="text-gray-500 text-xs">{caseItem.cliente}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-sm font-semibold text-[#cbf400] uppercase tracking-wide mb-1">Solucao</h3>
|
||||
<p className="text-gray-400 text-sm">{c.solucao}</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-sm font-semibold text-[#cbf400] uppercase tracking-wide mb-1">Resultado</h3>
|
||||
<p className="text-gray-400 text-sm">{c.resultado}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Mais Depoimentos */}
|
||||
<section className="py-20 bg-[#1a1a1a]">
|
||||
<div className="container-custom">
|
||||
<h2 className="text-3xl md:text-4xl font-black text-white text-center mb-4">
|
||||
Mais <span className="text-gradient">Depoimentos</span>
|
||||
<div className="flex flex-wrap gap-2 mb-4">
|
||||
{c.tecnologias.map(tech => (
|
||||
<span key={tech} className="px-3 py-1 bg-[#cbf400]/10 text-[#cbf400] rounded-full text-xs">
|
||||
{tech}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2 text-gray-500 text-sm">
|
||||
<CheckCircle className="w-4 h-4 text-[#cbf400]" />
|
||||
Servicos: {c.servicos.join(', ')}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* CTA */}
|
||||
<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">
|
||||
Quer um case de sucesso como estes?
|
||||
</h2>
|
||||
<p className="text-gray-400 text-center mb-12 max-w-2xl mx-auto">
|
||||
Veja o que outros clientes dizem sobre nossos serviços.
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Entre em contato e descubra como a Avanzato pode transformar a infraestrutura de TI da sua empresa.
|
||||
</p>
|
||||
<div ref={depoimentosRef} className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{todosDepoimentos.map((d, i) => (
|
||||
<div key={i} className="depo-card bg-[#0e0e0e] rounded-2xl p-6 border border-white/5">
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
<span className="text-2xl">{d.icone}</span>
|
||||
<div className="flex gap-0.5">
|
||||
{[...Array(5)].map((_, j) => <Star key={j} className="w-4 h-4 text-[#cbf400] fill-[#cbf400]" />)}
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-gray-300 text-sm mb-4 italic">"{d.quote}"</p>
|
||||
<span className="inline-block px-3 py-1 bg-[#cbf400]/10 text-[#cbf400] text-xs rounded-full mb-4">{d.destaque}</span>
|
||||
<div className="pt-4 border-t border-white/5">
|
||||
<p className="text-white font-medium text-sm">{d.responsavel}</p>
|
||||
<p className="text-gray-500 text-xs">{d.cliente} • {d.cidade}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
<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
|
||||
<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>
|
||||
</section>
|
||||
|
||||
{/* CTA */}
|
||||
<section className="py-20">
|
||||
<div className="container-custom">
|
||||
<div className="bg-gradient-to-r from-[#cbf400]/10 to-transparent rounded-2xl p-12 text-center border border-[#cbf400]/20">
|
||||
<h2 className="text-3xl md:text-4xl font-black text-white mb-4">Quer ser nosso próximo case de sucesso?</h2>
|
||||
<p className="text-gray-400 mb-8 max-w-2xl mx-auto">Entre em contato e descubra como podemos ajudar sua empresa.</p>
|
||||
<div className="flex flex-wrap justify-center gap-4">
|
||||
<a href="https://api.whatsapp.com/send?phone=551148101704&text=Olá!%20Gostaria%20de%20conhecer%20cases%20de%20sucesso" target="_blank" rel="noopener noreferrer" className="btn-primary inline-flex items-center gap-2">Falar com consultor<ArrowRight className="w-5 h-5" /></a>
|
||||
<a href="/contato" className="btn-secondary">Solicitar proposta</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { organizationSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, ArrowRight } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [organizationSchema, breadcrumbSchema];
|
||||
|
||||
const localidades = [
|
||||
{ cidade: 'Guarulhos', slug: 'guarulhos', regiao: 'Grande SP', desc: 'Matriz da Avanzato. Atendimento completo com equipe local.' },
|
||||
{ cidade: 'Mogi das Cruzes', slug: 'mogi-das-cruzes', regiao: 'Alto Tiete', desc: 'Suporte tecnico para industrias e comercios da regiao.' },
|
||||
{ cidade: 'Ipiranga', slug: 'ipiranga', regiao: 'Zona Sul SP', desc: 'Atendimento a clinicas, escolas e comercios do bairro.' },
|
||||
{ cidade: 'Vila Formosa', slug: 'vila-formosa', regiao: 'Zona Leste SP', desc: 'Suporte TI para industrias e logistica da regiao leste.' },
|
||||
{ cidade: 'Cerqueira Cesar', slug: 'cerqueira-cesar', regiao: 'Zona Oeste SP', desc: 'Atendimento a escritorios e empresas de servicos.' },
|
||||
{ cidade: 'Santana', slug: 'santana', regiao: 'Zona Norte SP', desc: 'Suporte para comercios e prestadores de servicos do norte.' },
|
||||
{ cidade: 'Bras', slug: 'bras', regiao: 'Centro SP', desc: 'Atendimento a lojas e empresas do polo comercial do Bras.' },
|
||||
{ cidade: 'Ribeirao Preto', slug: 'ribeirao-preto', regiao: 'Interior SP', desc: 'Suporte remoto e visitas periodicas para empresas do interior.' },
|
||||
];
|
||||
|
||||
const OndeAtuamos = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Onde Atuamos - Suporte de TI em Sao Paulo"
|
||||
description="Avanzato Tecnologia atende em Guarulhos, Mogi das Cruzes, Ipiranga, Zona Leste, Zona Norte, Centro e Ribeirao Preto. Suporte presencial e remoto."
|
||||
keywords="suporte ti sao paulo, ti guarulhos, ti mogi das cruzes, terceirizacao ti sp"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<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">Onde Atuamos</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Onde a <span className="text-[#cbf400]">Avanzato</span> Atua
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-12 max-w-3xl">
|
||||
Presente em toda a regiao metropolitana de Sao Paulo e interior.
|
||||
Atendimento presencial e remoto para empresas de todos os portes.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6 mb-16">
|
||||
{localidades.map((loc) => (
|
||||
<Link
|
||||
key={loc.slug}
|
||||
to={`/suporte-ti-${loc.slug}`}
|
||||
className="bg-[#1a1a1a] rounded-2xl p-6 border border-[#2a2a2a] hover:border-[#cbf400]/50 transition-all group"
|
||||
>
|
||||
<MapPin className="w-8 h-8 text-[#cbf400] mb-4" />
|
||||
<h3 className="text-xl font-semibold text-white mb-1 group-hover:text-[#cbf400] transition-colors">
|
||||
{loc.cidade}
|
||||
</h3>
|
||||
<p className="text-sm text-gray-500 mb-2">{loc.regiao}</p>
|
||||
<p className="text-gray-400 text-sm">{loc.desc}</p>
|
||||
<div className="mt-4 flex items-center gap-2 text-[#cbf400] text-sm font-medium">
|
||||
Ver servicos <ArrowRight className="w-4 h-4" />
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<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">
|
||||
Sua cidade nao esta na lista?
|
||||
</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Atendemos toda a Grande Sao Paulo e interior com suporte remoto e visitas periodicas.
|
||||
Entre em contato para verificar disponibilidade na sua regiao.
|
||||
</p>
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
<a
|
||||
href="https://wa.me/551148101704"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-2 bg-[#cbf400] text-[#0e0e0e] px-8 py-4 rounded-xl font-semibold hover:bg-[#b8e000] transition-colors"
|
||||
>
|
||||
<Phone className="w-5 h-5" />
|
||||
Falar no WhatsApp
|
||||
</a>
|
||||
<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"
|
||||
>
|
||||
Entrar em Contato
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default OndeAtuamos;
|
||||
@@ -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;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Bras', 'bras');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Bras?', a: 'Sim, atuamos em Bras e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Bras?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Bras.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Bras?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Bras?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Bras', url: 'https://avanzato.com.br/suporte-ti-bras' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalBras = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Bras - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Bras. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti bras, ti empresarial Bras, terceirizacao ti Bras"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Bras</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Bras</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Bras com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Bras</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Bras.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Rua Santa Rita, 300 - Bras, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalBras;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Cerqueira Cesar', 'cerqueira-cesar');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Cerqueira Cesar?', a: 'Sim, atuamos em Cerqueira Cesar e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Cerqueira Cesar?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Cerqueira Cesar.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Cerqueira Cesar?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Cerqueira Cesar?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Cerqueira Cesar', url: 'https://avanzato.com.br/suporte-ti-cerqueira-cesar' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalCerqueiraCesar = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Cerqueira Cesar - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Cerqueira Cesar. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti cerqueira-cesar, ti empresarial Cerqueira Cesar, terceirizacao ti Cerqueira Cesar"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Cerqueira Cesar</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Cerqueira Cesar</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Cerqueira Cesar com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Cerqueira Cesar</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Cerqueira Cesar.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Rua Oscar Freire, 500 - Cerqueira Cesar, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalCerqueiraCesar;
|
||||
@@ -0,0 +1,176 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle, Building2 } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Guarulhos', 'guarulhos');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Guarulhos?', a: 'Sim, nossa matriz fica em Guarulhos e atendemos dezenas de empresas da regiao ha mais de 23 anos.' },
|
||||
{ q: 'Qual o tempo de resposta em Guarulhos?', a: 'Como estamos na cidade, oferecemos o melhor SLA: atendimento em ate 4 horas para chamados criticos.' },
|
||||
{ q: 'Quais segmentos a Avanzato atende em Guarulhos?', a: 'Contabilidades, advocacias, industrias, BPO, embalagens, logistica, monitoramento e mais.' },
|
||||
{ q: 'A Avanzato faz suporte presencial em Guarulhos?', a: 'Sim, fazemos visitas presenciais mensais com relatorio completo de cada computador e servidor.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Guarulhos', url: 'https://avanzato.com.br/suporte-ti-guarulhos' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico 24/7',
|
||||
'Firewall e seguranca',
|
||||
'Microsoft 365',
|
||||
'Backup corporativo',
|
||||
'Servidores e virtualizacao',
|
||||
'Cloud Computing',
|
||||
'VoIP e PABX IP',
|
||||
'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const clientes = [
|
||||
{ nome: 'Dellacont', segmento: 'Contabilidade', servicos: 'Suporte + Servidor + Backup' },
|
||||
{ nome: 'Madri', segmento: 'Contabilidade', servicos: 'Suporte + Servidor Nuvem + Backup' },
|
||||
{ nome: 'Mouradi Naddi', segmento: 'Advocacia', servicos: 'Suporte + Servidor + Backup' },
|
||||
{ nome: 'EFLAW', segmento: 'Advocacia', servicos: 'Suporte + Servidor + Backup' },
|
||||
{ nome: 'Moraes Advogados', segmento: 'Advocacia', servicos: 'Suporte + Servidor + Backup' },
|
||||
{ nome: 'Thalls', segmento: 'Industria', servicos: 'Suporte + Servidor + Backup + VoIP' },
|
||||
{ nome: 'Ganiko', segmento: 'BPO', servicos: 'Suporte + Servidor Nuvem + Backup' },
|
||||
{ nome: 'DCarvalho', segmento: 'Embalagens', servicos: 'Suporte + Servidor Nuvem + Backup' },
|
||||
{ nome: 'Garuppy', segmento: 'Logistica', servicos: 'Suporte + Servidor Nuvem + Backup' },
|
||||
{ nome: 'Premier', segmento: 'Monitoramento', servicos: 'Suporte + Servidor + Backup' },
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidade', 'Advocacia', 'Industria', 'BPO',
|
||||
'Embalagens', 'Logistica', 'Monitoramento', 'Condominios',
|
||||
];
|
||||
|
||||
const LocalGuarulhos = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Guarulhos - Matriz Avanzato"
|
||||
description="Suporte de TI empresarial em Guarulhos. Atendemos contabilidades, advocacias, industrias e mais. Matriz da Avanzato. +23 anos de experiencia."
|
||||
keywords="suporte ti guarulhos, ti empresarial guarulhos, terceirizacao ti guarulhos, suporte informatica guarulhos"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Guarulhos</span>
|
||||
</nav>
|
||||
|
||||
<div className="inline-block px-4 py-1 bg-[#cbf400]/20 text-[#cbf400] rounded-full text-sm font-medium mb-4">
|
||||
Matriz Avanzato
|
||||
</div>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Guarulhos</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Nossa matriz esta em Guarulhos e atendemos mais de 10 empresas da regiao.
|
||||
+23 anos de experiencia com suporte presencial e remoto.
|
||||
</p>
|
||||
|
||||
{/* Clientes */}
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<h2 className="text-2xl font-semibold text-white mb-6">
|
||||
Empresas que Confiam na Avanzato em Guarulhos
|
||||
</h2>
|
||||
<div className="grid md:grid-cols-2 gap-4">
|
||||
{clientes.map((c) => (
|
||||
<div key={c.nome} className="flex items-start gap-3 p-4 bg-[#0e0e0e] rounded-xl">
|
||||
<Building2 className="w-5 h-5 text-[#cbf400] mt-0.5 shrink-0" />
|
||||
<div>
|
||||
<p className="text-white font-medium">{c.nome}</p>
|
||||
<p className="text-gray-400 text-sm">{c.segmento}</p>
|
||||
<p className="text-gray-500 text-xs">{c.servicos}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* FAQ */}
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<h3 className="text-lg font-semibold text-[#cbf400] mb-2">{faq.q}</h3>
|
||||
<p className="text-gray-300">{faq.a}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* CTA */}
|
||||
<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">
|
||||
Solicite uma Avaliacao Gratuita de TI
|
||||
</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Junte-se as mais de 10 empresas de Guarulhos que confiam na Avanzato.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Rua Maria Curupaiti, 471 - Guarulhos, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalGuarulhos;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Ipiranga', 'ipiranga');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Ipiranga?', a: 'Sim, atuamos em Ipiranga e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Ipiranga?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Ipiranga.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Ipiranga?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Ipiranga?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Ipiranga', url: 'https://avanzato.com.br/suporte-ti-ipiranga' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalIpiranga = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Ipiranga - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Ipiranga. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti ipiranga, ti empresarial Ipiranga, terceirizacao ti Ipiranga"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Ipiranga</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Ipiranga</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Ipiranga com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Ipiranga</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Ipiranga.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Rua dos Patriotas, 100 - Ipiranga, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalIpiranga;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Mogi das Cruzes', 'mogi-das-cruzes');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Mogi das Cruzes?', a: 'Sim, atuamos em Mogi das Cruzes e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Mogi das Cruzes?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Mogi das Cruzes.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Mogi das Cruzes?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Mogi das Cruzes?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Mogi das Cruzes', url: 'https://avanzato.com.br/suporte-ti-mogi-das-cruzes' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalMogidasCruzes = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Mogi das Cruzes - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Mogi das Cruzes. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti mogi-das-cruzes, ti empresarial Mogi das Cruzes, terceirizacao ti Mogi das Cruzes"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Mogi das Cruzes</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Mogi das Cruzes</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Mogi das Cruzes com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Mogi das Cruzes</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Mogi das Cruzes.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Centro - Mogi das Cruzes, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalMogidasCruzes;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Ribeirao Preto', 'ribeirao-preto');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Ribeirao Preto?', a: 'Sim, atuamos em Ribeirao Preto e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Ribeirao Preto?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Ribeirao Preto.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Ribeirao Preto?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Ribeirao Preto?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Ribeirao Preto', url: 'https://avanzato.com.br/suporte-ti-ribeirao-preto' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalRibeiraoPreto = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Ribeirao Preto - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Ribeirao Preto. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti ribeirao-preto, ti empresarial Ribeirao Preto, terceirizacao ti Ribeirao Preto"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Ribeirao Preto</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Ribeirao Preto</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Ribeirao Preto com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Ribeirao Preto</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Ribeirao Preto.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Avenida do Cafe, 100 - Ribeirao Preto, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalRibeiraoPreto;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Santana', 'santana');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Santana?', a: 'Sim, atuamos em Santana e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Santana?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Santana.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Santana?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Santana?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Santana', url: 'https://avanzato.com.br/suporte-ti-santana' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalSantana = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Santana - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Santana. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti santana, ti empresarial Santana, terceirizacao ti Santana"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Santana</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Santana</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Santana com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Santana</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Santana.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Rua Voluntarios da Patria, 1000 - Santana, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalSantana;
|
||||
@@ -0,0 +1,130 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createLocalBusinessSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { MapPin, Phone, Mail, ArrowRight, CheckCircle } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createLocalBusinessSchema('Vila Formosa', 'vila-formosa');
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende empresas em Vila Formosa?', a: 'Sim, atuamos em Vila Formosa e regiao com suporte tecnico presencial e remoto para empresas de todos os portes.' },
|
||||
{ q: 'Qual o tempo de resposta para chamados em Vila Formosa?', a: 'Nosso SLA garante atendimento em ate 4 horas para chamados criticos na regiao de Vila Formosa.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece em Vila Formosa?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento.' },
|
||||
{ q: 'A Avanzato trabalha com qual segmento em Vila Formosa?', a: 'Atendemos contabilidades, advocacias, industrias, clinicas, imobiliarias e mais.' },
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Onde Atuamos', url: 'https://avanzato.com.br/onde-atuamos' },
|
||||
{ name: 'Vila Formosa', url: 'https://avanzato.com.br/suporte-ti-vila-formosa' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico', 'Firewall e seguranca', 'Microsoft 365',
|
||||
'Backup corporativo', 'Servidores', 'Cloud Computing',
|
||||
'VoIP e PABX', 'Monitoramento CFTV',
|
||||
];
|
||||
|
||||
const segmentos = [
|
||||
'Contabilidades', 'Advocacias', 'Industrias', 'Clinicas',
|
||||
'Imobiliarias', 'Condominios', 'Logistica', 'Comercio',
|
||||
];
|
||||
|
||||
const LocalVilaFormosa = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="Suporte de TI em Vila Formosa - Avanzato Tecnologia"
|
||||
description="Suporte de TI empresarial em Vila Formosa. Atendimento presencial e remoto. Firewall, Microsoft 365, Backup, Cloud, VoIP. Solicite avaliacao gratuita."
|
||||
keywords="suporte ti vila-formosa, ti empresarial Vila Formosa, terceirizacao ti Vila Formosa"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/onde-atuamos" className="hover:text-[#cbf400]">Onde Atuamos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">Vila Formosa</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
Suporte de TI em <span className="text-[#cbf400]">Vila Formosa</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-8 max-w-3xl">
|
||||
Empresa de suporte de TI em Vila Formosa com atendimento presencial e remoto. +23 anos de experiencia atendendo empresas da regiao.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Nossos Servicos em Vila Formosa</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Segmentos Atendidos</h2>
|
||||
<div className="space-y-3">
|
||||
{segmentos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita de TI</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como otimizar a infraestrutura de TI da sua empresa em Vila Formosa.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 grid md:grid-cols-3 gap-6">
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<MapPin className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>Avenida dos Remedios, 200 - Vila Formosa, SP</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Phone className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>(11) 4810-1704</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 text-gray-300">
|
||||
<Mail className="w-5 h-5 text-[#cbf400]" />
|
||||
<span>contato@avanzato.com.br</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalVilaFormosa;
|
||||
@@ -0,0 +1,131 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createServiceSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { ArrowRight, CheckCircle, Building2 } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createServiceSchema(
|
||||
'TI para Clinicas',
|
||||
'Solucoes de TI especializadas para clinicas. Suporte tecnico, seguranca, cloud e comunicacao.',
|
||||
'/suporte-ti-clinicas'
|
||||
);
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende clinicas?', a: 'Sim, temos vasta experiencia atendendo clinicas. Oferecemos solucoes personalizadas para as necessidades especificas do setor.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece para clinicas?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento. Tudo adaptado as necessidades de clinicas.' },
|
||||
{ q: 'Como funciona o suporte para clinicas?', a: 'Nosso suporte funciona com atendimento remoto 24/7 e visitas presenciais conforme necessidade. SLA garantido.' },
|
||||
{ q: 'Quanto custa terceirizar TI para clinicas?', a: 'O investimento varia conforme o porte e necessidades. Faca uma avaliacao gratuita para receber uma proposta personalizada.' }
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Servicos', url: 'https://avanzato.com.br/servicos/ti-gerenciada' },
|
||||
{ name: 'TI para Clinicas', url: 'https://avanzato.com.br/suporte-ti-clinicas' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const subsegmentos = [
|
||||
{ nome: 'Odontologia', desc: 'Sistema de gestao, imagem digital, backup' },
|
||||
{ nome: 'Fisioterapia', desc: 'Agendamento online, prontuario eletronico' },
|
||||
{ nome: 'Medica', desc: 'LGPD, prontuario digital, telemedicina' },
|
||||
{ nome: 'Veterinaria', desc: 'Gestao de pacientes, imagem' },
|
||||
{ nome: 'Estetica', desc: 'Agendamento, CRM, marketing' }
|
||||
];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico 24/7',
|
||||
'Firewall e seguranca',
|
||||
'Microsoft 365',
|
||||
'Backup corporativo',
|
||||
'Servidores e virtualizacao',
|
||||
'Cloud Computing',
|
||||
'VoIP e PABX IP',
|
||||
'Monitoramento CFTV'
|
||||
];
|
||||
|
||||
const NichoClinicas = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="TI para Clinicas - Avanzato Tecnologia"
|
||||
description="Solucoes de TI especializadas para clinicas. Suporte tecnico, seguranca, cloud, VoIP. +23 anos de experiencia. Avaliacao gratuita."
|
||||
keywords="ti para clinicas, suporte ti clinicas, terceirizacao ti clinicas"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/servicos/ti-gerenciada" className="hover:text-[#cbf400]">Servicos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">TI para Clinicas</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
TI para <span className="text-[#cbf400]">Clinicas</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-12 max-w-3xl">
|
||||
Solucoes de tecnologia especializadas para clinicas.
|
||||
Entendemos as necessidades especificas do seu setor.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Servicos para Clinicas</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Subsegmentos</h2>
|
||||
<div className="space-y-4">
|
||||
{subsegmentos.map((sub) => (
|
||||
<div key={sub.nome} className="flex items-start gap-3">
|
||||
<Building2 className="w-5 h-5 text-[#cbf400] mt-0.5" />
|
||||
<div>
|
||||
<p className="text-white font-medium">{sub.nome}</p>
|
||||
<p className="text-gray-400 text-sm">{sub.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como a Avanzato pode ajudar sua clinicas a ter uma infraestrutura de TI de ponta.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default NichoClinicas;
|
||||
@@ -0,0 +1,131 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createServiceSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { ArrowRight, CheckCircle, Building2 } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createServiceSchema(
|
||||
'TI para Imobiliarias',
|
||||
'Solucoes de TI especializadas para imobiliarias. Suporte tecnico, seguranca, cloud e comunicacao.',
|
||||
'/suporte-ti-imobiliarias'
|
||||
);
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende imobiliarias?', a: 'Sim, temos vasta experiencia atendendo imobiliarias. Oferecemos solucoes personalizadas para as necessidades especificas do setor.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece para imobiliarias?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento. Tudo adaptado as necessidades de imobiliarias.' },
|
||||
{ q: 'Como funciona o suporte para imobiliarias?', a: 'Nosso suporte funciona com atendimento remoto 24/7 e visitas presenciais conforme necessidade. SLA garantido.' },
|
||||
{ q: 'Quanto custa terceirizar TI para imobiliarias?', a: 'O investimento varia conforme o porte e necessidades. Faca uma avaliacao gratuita para receber uma proposta personalizada.' }
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Servicos', url: 'https://avanzato.com.br/servicos/ti-gerenciada' },
|
||||
{ name: 'TI para Imobiliarias', url: 'https://avanzato.com.br/suporte-ti-imobiliarias' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const subsegmentos = [
|
||||
{ nome: 'Residencial', desc: 'Sistemas de gestao, CRM, site de imoveis' },
|
||||
{ nome: 'Comercial', desc: 'Gestao de locacao, contratos digitais' },
|
||||
{ nome: 'Industrial', desc: 'Galpoes, armazens, logistica' },
|
||||
{ nome: 'Loteamento', desc: 'Gestao de loteamento, documentacao' },
|
||||
{ nome: 'Condominio', desc: 'Administracao de condominios, portaria' }
|
||||
];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico 24/7',
|
||||
'Firewall e seguranca',
|
||||
'Microsoft 365',
|
||||
'Backup corporativo',
|
||||
'Servidores e virtualizacao',
|
||||
'Cloud Computing',
|
||||
'VoIP e PABX IP',
|
||||
'Monitoramento CFTV'
|
||||
];
|
||||
|
||||
const NichoImobiliarias = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="TI para Imobiliarias - Avanzato Tecnologia"
|
||||
description="Solucoes de TI especializadas para imobiliarias. Suporte tecnico, seguranca, cloud, VoIP. +23 anos de experiencia. Avaliacao gratuita."
|
||||
keywords="ti para imobiliarias, suporte ti imobiliarias, terceirizacao ti imobiliarias"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/servicos/ti-gerenciada" className="hover:text-[#cbf400]">Servicos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">TI para Imobiliarias</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
TI para <span className="text-[#cbf400]">Imobiliarias</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-12 max-w-3xl">
|
||||
Solucoes de tecnologia especializadas para imobiliarias.
|
||||
Entendemos as necessidades especificas do seu setor.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Servicos para Imobiliarias</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Subsegmentos</h2>
|
||||
<div className="space-y-4">
|
||||
{subsegmentos.map((sub) => (
|
||||
<div key={sub.nome} className="flex items-start gap-3">
|
||||
<Building2 className="w-5 h-5 text-[#cbf400] mt-0.5" />
|
||||
<div>
|
||||
<p className="text-white font-medium">{sub.nome}</p>
|
||||
<p className="text-gray-400 text-sm">{sub.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como a Avanzato pode ajudar sua imobiliarias a ter uma infraestrutura de TI de ponta.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default NichoImobiliarias;
|
||||
@@ -0,0 +1,131 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createServiceSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { ArrowRight, CheckCircle, Building2 } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createServiceSchema(
|
||||
'TI para Industria',
|
||||
'Solucoes de TI especializadas para industrias. Suporte tecnico, seguranca, cloud e comunicacao.',
|
||||
'/suporte-ti-industria'
|
||||
);
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende industrias?', a: 'Sim, temos vasta experiencia atendendo industrias. Oferecemos solucoes personalizadas para as necessidades especificas do setor.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece para industrias?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento. Tudo adaptado as necessidades de industrias.' },
|
||||
{ q: 'Como funciona o suporte para industrias?', a: 'Nosso suporte funciona com atendimento remoto 24/7 e visitas presenciais conforme necessidade. SLA garantido.' },
|
||||
{ q: 'Quanto custa terceirizar TI para industrias?', a: 'O investimento varia conforme o porte e necessidades. Faca uma avaliacao gratuita para receber uma proposta personalizada.' }
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Servicos', url: 'https://avanzato.com.br/servicos/ti-gerenciada' },
|
||||
{ name: 'TI para Industria', url: 'https://avanzato.com.br/suporte-ti-industria' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const subsegmentos = [
|
||||
{ nome: 'Automotiva', desc: 'Sistemas ERP, controle de producao, redes industriais' },
|
||||
{ nome: 'Alimenticia', desc: 'Rastreabilidade, controle de lote, normas ANVISA' },
|
||||
{ nome: 'Textil', desc: 'Gestao de producao, controle de estoque' },
|
||||
{ nome: 'Metalurgica', desc: 'CNC, robos, automacao' },
|
||||
{ nome: 'Quimica', desc: 'Seguranca, compliance, monitoramento' }
|
||||
];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico 24/7',
|
||||
'Firewall e seguranca',
|
||||
'Microsoft 365',
|
||||
'Backup corporativo',
|
||||
'Servidores e virtualizacao',
|
||||
'Cloud Computing',
|
||||
'VoIP e PABX IP',
|
||||
'Monitoramento CFTV'
|
||||
];
|
||||
|
||||
const NichoIndustria = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="TI para Industria - Avanzato Tecnologia"
|
||||
description="Solucoes de TI especializadas para industrias. Suporte tecnico, seguranca, cloud, VoIP. +23 anos de experiencia. Avaliacao gratuita."
|
||||
keywords="ti para industria, suporte ti industria, terceirizacao ti industria"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/servicos/ti-gerenciada" className="hover:text-[#cbf400]">Servicos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">TI para Industria</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
TI para <span className="text-[#cbf400]">Industria</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-12 max-w-3xl">
|
||||
Solucoes de tecnologia especializadas para industrias.
|
||||
Entendemos as necessidades especificas do seu setor.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Servicos para Industria</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Subsegmentos</h2>
|
||||
<div className="space-y-4">
|
||||
{subsegmentos.map((sub) => (
|
||||
<div key={sub.nome} className="flex items-start gap-3">
|
||||
<Building2 className="w-5 h-5 text-[#cbf400] mt-0.5" />
|
||||
<div>
|
||||
<p className="text-white font-medium">{sub.nome}</p>
|
||||
<p className="text-gray-400 text-sm">{sub.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como a Avanzato pode ajudar sua industria a ter uma infraestrutura de TI de ponta.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default NichoIndustria;
|
||||
@@ -0,0 +1,131 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createServiceSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { ArrowRight, CheckCircle, Building2 } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createServiceSchema(
|
||||
'TI para Portaria Remota',
|
||||
'Solucoes de TI especializadas para portaria remotas. Suporte tecnico, seguranca, cloud e comunicacao.',
|
||||
'/suporte-ti-portaria-remota'
|
||||
);
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende portaria remotas?', a: 'Sim, temos vasta experiencia atendendo portaria remotas. Oferecemos solucoes personalizadas para as necessidades especificas do setor.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece para portaria remotas?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento. Tudo adaptado as necessidades de portaria remotas.' },
|
||||
{ q: 'Como funciona o suporte para portaria remotas?', a: 'Nosso suporte funciona com atendimento remoto 24/7 e visitas presenciais conforme necessidade. SLA garantido.' },
|
||||
{ q: 'Quanto custa terceirizar TI para portaria remotas?', a: 'O investimento varia conforme o porte e necessidades. Faca uma avaliacao gratuita para receber uma proposta personalizada.' }
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Servicos', url: 'https://avanzato.com.br/servicos/ti-gerenciada' },
|
||||
{ name: 'TI para Portaria Remota', url: 'https://avanzato.com.br/suporte-ti-portaria-remota' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const subsegmentos = [
|
||||
{ nome: 'Condominios', desc: 'Interfonia IP, controle de acesso, cameras' },
|
||||
{ nome: 'Empresas', desc: 'Controle de visitantes, integracao com RH' },
|
||||
{ nome: 'Industrias', desc: 'Controle de portaria 24h, seguranca perimetral' },
|
||||
{ nome: 'Shopping', desc: 'Fluxo de pessoas, integracao com lojas' },
|
||||
{ nome: 'Hospital', desc: 'Controle de acesso a areas restritas' }
|
||||
];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico 24/7',
|
||||
'Firewall e seguranca',
|
||||
'Microsoft 365',
|
||||
'Backup corporativo',
|
||||
'Servidores e virtualizacao',
|
||||
'Cloud Computing',
|
||||
'VoIP e PABX IP',
|
||||
'Monitoramento CFTV'
|
||||
];
|
||||
|
||||
const NichoPortariaRemota = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="TI para Portaria Remota - Avanzato Tecnologia"
|
||||
description="Solucoes de TI especializadas para portaria remotas. Suporte tecnico, seguranca, cloud, VoIP. +23 anos de experiencia. Avaliacao gratuita."
|
||||
keywords="ti para portaria-remota, suporte ti portaria-remota, terceirizacao ti portaria-remota"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/servicos/ti-gerenciada" className="hover:text-[#cbf400]">Servicos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">TI para Portaria Remota</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
TI para <span className="text-[#cbf400]">Portaria Remota</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-12 max-w-3xl">
|
||||
Solucoes de tecnologia especializadas para portaria remotas.
|
||||
Entendemos as necessidades especificas do seu setor.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Servicos para Portaria Remota</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Subsegmentos</h2>
|
||||
<div className="space-y-4">
|
||||
{subsegmentos.map((sub) => (
|
||||
<div key={sub.nome} className="flex items-start gap-3">
|
||||
<Building2 className="w-5 h-5 text-[#cbf400] mt-0.5" />
|
||||
<div>
|
||||
<p className="text-white font-medium">{sub.nome}</p>
|
||||
<p className="text-gray-400 text-sm">{sub.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como a Avanzato pode ajudar sua portaria remota a ter uma infraestrutura de TI de ponta.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default NichoPortariaRemota;
|
||||
@@ -0,0 +1,131 @@
|
||||
import SEO from '../components/SEO';
|
||||
import { createServiceSchema, createFAQSchema, createBreadcrumbSchema } from '../config/schema';
|
||||
import { ArrowRight, CheckCircle, Building2 } from 'lucide-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
const schema = createServiceSchema(
|
||||
'TI para Recrutamento e Selecao',
|
||||
'Solucoes de TI especializadas para recrutamento e selecaos. Suporte tecnico, seguranca, cloud e comunicacao.',
|
||||
'/suporte-ti-recrutamento-selecao'
|
||||
);
|
||||
|
||||
const faqData = [
|
||||
{ q: 'A Avanzato atende recrutamento e selecaos?', a: 'Sim, temos vasta experiencia atendendo recrutamento e selecaos. Oferecemos solucoes personalizadas para as necessidades especificas do setor.' },
|
||||
{ q: 'Quais servicos a Avanzato oferece para recrutamento e selecaos?', a: 'Oferecemos suporte de TI, firewall, Microsoft 365, backup, servidores, cloud, VoIP e monitoramento. Tudo adaptado as necessidades de recrutamento e selecaos.' },
|
||||
{ q: 'Como funciona o suporte para recrutamento e selecaos?', a: 'Nosso suporte funciona com atendimento remoto 24/7 e visitas presenciais conforme necessidade. SLA garantido.' },
|
||||
{ q: 'Quanto custa terceirizar TI para recrutamento e selecaos?', a: 'O investimento varia conforme o porte e necessidades. Faca uma avaliacao gratuita para receber uma proposta personalizada.' }
|
||||
];
|
||||
|
||||
const faqSchema = createFAQSchema(faqData);
|
||||
|
||||
const breadcrumbSchema = createBreadcrumbSchema([
|
||||
{ name: 'Home', url: 'https://avanzato.com.br/' },
|
||||
{ name: 'Servicos', url: 'https://avanzato.com.br/servicos/ti-gerenciada' },
|
||||
{ name: 'TI para Recrutamento e Selecao', url: 'https://avanzato.com.br/suporte-ti-recrutamento-selecao' },
|
||||
]);
|
||||
|
||||
const combinedSchema = [schema, faqSchema, breadcrumbSchema];
|
||||
|
||||
const subsegmentos = [
|
||||
{ nome: 'TI', desc: 'Recrutamento de profissionais de tecnologia' },
|
||||
{ nome: 'Executivo', desc: 'Headhunting, hunting de lideres' },
|
||||
{ nome: 'Operacional', desc: 'Recrutamento em massa, temporarios' },
|
||||
{ nome: 'Temporario', desc: 'Gestao de mao de obra temporaria' },
|
||||
{ nome: 'RH Interno', desc: 'Consultoria em processos de RH' }
|
||||
];
|
||||
|
||||
const servicos = [
|
||||
'Suporte tecnico 24/7',
|
||||
'Firewall e seguranca',
|
||||
'Microsoft 365',
|
||||
'Backup corporativo',
|
||||
'Servidores e virtualizacao',
|
||||
'Cloud Computing',
|
||||
'VoIP e PABX IP',
|
||||
'Monitoramento CFTV'
|
||||
];
|
||||
|
||||
const NichoRecrutamentoeSelecao = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-[#0e0e0e]">
|
||||
<SEO
|
||||
title="TI para Recrutamento e Selecao - Avanzato Tecnologia"
|
||||
description="Solucoes de TI especializadas para recrutamento e selecaos. Suporte tecnico, seguranca, cloud, VoIP. +23 anos de experiencia. Avaliacao gratuita."
|
||||
keywords="ti para recrutamento-selecao, suporte ti recrutamento-selecao, terceirizacao ti recrutamento-selecao"
|
||||
schema={combinedSchema}
|
||||
/>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-6 py-16">
|
||||
<nav className="text-sm text-gray-400 mb-6">
|
||||
<Link to="/" className="hover:text-[#cbf400]">Home</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<Link to="/servicos/ti-gerenciada" className="hover:text-[#cbf400]">Servicos</Link>
|
||||
<span className="mx-2">/</span>
|
||||
<span className="text-white">TI para Recrutamento e Selecao</span>
|
||||
</nav>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl font-bold text-white mb-4">
|
||||
TI para <span className="text-[#cbf400]">Recrutamento e Selecao</span>
|
||||
</h1>
|
||||
<p className="text-xl text-gray-300 mb-12 max-w-3xl">
|
||||
Solucoes de tecnologia especializadas para recrutamento e selecaos.
|
||||
Entendemos as necessidades especificas do seu setor.
|
||||
</p>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 mb-12">
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Servicos para Recrutamento e Selecao</h2>
|
||||
<div className="space-y-3">
|
||||
{servicos.map((s) => (
|
||||
<div key={s} className="flex items-center gap-3 text-gray-300">
|
||||
<CheckCircle className="w-5 h-5 text-[#cbf400]" />
|
||||
{s}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a]">
|
||||
<h2 className="text-2xl font-semibold text-white mb-4">Subsegmentos</h2>
|
||||
<div className="space-y-4">
|
||||
{subsegmentos.map((sub) => (
|
||||
<div key={sub.nome} className="flex items-start gap-3">
|
||||
<Building2 className="w-5 h-5 text-[#cbf400] mt-0.5" />
|
||||
<div>
|
||||
<p className="text-white font-medium">{sub.nome}</p>
|
||||
<p className="text-gray-400 text-sm">{sub.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#1a1a1a] rounded-2xl p-8 border border-[#2a2a2a] mb-12">
|
||||
<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">
|
||||
<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 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">Solicite uma Avaliacao Gratuita</h2>
|
||||
<p className="text-gray-300 mb-6 max-w-2xl mx-auto">
|
||||
Descubra como a Avanzato pode ajudar sua recrutamento e selecao a ter uma infraestrutura de TI de ponta.
|
||||
</p>
|
||||
<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">
|
||||
Avaliar minha TI Agora
|
||||
<ArrowRight className="w-5 h-5" />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default NichoRecrutamentoeSelecao;
|
||||
+15
-9
@@ -143,11 +143,17 @@ const About = () => {
|
||||
{/* Image */}
|
||||
<div ref={imageRef} className="relative">
|
||||
<div className="relative rounded-2xl overflow-hidden shadow-2xl border border-white/5">
|
||||
<img
|
||||
src="/about-image.jpg"
|
||||
alt="Equipe Avanzato"
|
||||
className="w-full h-auto object-cover"
|
||||
/>
|
||||
<picture>
|
||||
<source srcSet="/about-image.webp" type="image/webp" />
|
||||
<img
|
||||
src="/about-image.jpg"
|
||||
alt="Equipe Avanzato"
|
||||
loading="lazy"
|
||||
width="500"
|
||||
height="685"
|
||||
className="w-full h-auto object-cover"
|
||||
/>
|
||||
</picture>
|
||||
|
||||
{/* Glassmorphism overlay card */}
|
||||
<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">
|
||||
<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" />
|
||||
<span className="text-sm">Clientes atendidos</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-center">
|
||||
<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" />
|
||||
<span className="text-sm">Uptime garantido</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-center">
|
||||
<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" />
|
||||
<span className="text-sm">Anos de experiência</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-center">
|
||||
<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" />
|
||||
<span className="text-sm">Suporte técnico</span>
|
||||
</div>
|
||||
|
||||
@@ -117,7 +117,7 @@ const CondominiosCTA = () => {
|
||||
<Phone className="w-6 h-6 text-[#cbf400]" />
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -127,7 +127,7 @@ const CondominiosCTA = () => {
|
||||
<Server className="w-6 h-6 text-blue-400" />
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -137,7 +137,7 @@ const CondominiosCTA = () => {
|
||||
<Wifi className="w-6 h-6 text-purple-400" />
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -147,7 +147,7 @@ const CondominiosCTA = () => {
|
||||
<Shield className="w-6 h-6 text-red-400" />
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+11
-4
@@ -15,10 +15,17 @@ const Footer = () => {
|
||||
const [version, setVersion] = useState('');
|
||||
|
||||
useEffect(() => {
|
||||
fetch('/version.json?t=' + Date.now())
|
||||
.then(r => r.json())
|
||||
.then(data => setVersion(data.version))
|
||||
.catch(() => setVersion(''));
|
||||
// Ler versao da meta tag (mais confiavel que fetch de arquivo separado)
|
||||
const metaVersion = document.querySelector('meta[name="app-version"]')?.getAttribute('content');
|
||||
if (metaVersion && metaVersion !== '1.0.0') {
|
||||
setVersion(metaVersion);
|
||||
} else {
|
||||
// Fallback: tentar version.json
|
||||
fetch('/version.json?t=' + Date.now())
|
||||
.then(r => r.json())
|
||||
.then(data => setVersion(data.version))
|
||||
.catch(() => setVersion(''));
|
||||
}
|
||||
}, []);
|
||||
|
||||
const scrollToTop = () => {
|
||||
|
||||
+12
-6
@@ -247,13 +247,19 @@ const Hero = () => {
|
||||
{/* Glow effect */}
|
||||
<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">
|
||||
<img
|
||||
src="/hero-dashboard.jpg"
|
||||
alt="Dashboard Avanzato"
|
||||
className="w-full h-auto"
|
||||
/>
|
||||
<picture>
|
||||
<source srcSet="/hero-dashboard.webp" type="image/webp" />
|
||||
<img
|
||||
src="/hero-dashboard.jpg"
|
||||
alt="Dashboard Avanzato"
|
||||
fetchPriority="high"
|
||||
width="800"
|
||||
height="500"
|
||||
className="w-full h-auto"
|
||||
/>
|
||||
</picture>
|
||||
|
||||
{/* Glossy overlay */}
|
||||
<div
|
||||
|
||||
@@ -46,7 +46,7 @@ const Navigation = () => {
|
||||
<div className="container-custom">
|
||||
<div className="flex items-center justify-between h-20">
|
||||
{/* 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()}
|
||||
</Link>
|
||||
|
||||
|
||||
@@ -121,6 +121,9 @@ const ServiceCard = ({ service }: { service: Service }) => {
|
||||
setMousePos({ x, y });
|
||||
};
|
||||
|
||||
// Gerar caminho WebP com fallback PNG/JPG
|
||||
const webpImage = service.image.replace(/\.(png|jpg|jpeg)$/, '.webp');
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={cardRef}
|
||||
@@ -138,13 +141,19 @@ const ServiceCard = ({ service }: { service: Service }) => {
|
||||
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">
|
||||
<img
|
||||
src={service.image}
|
||||
alt={service.title}
|
||||
className="w-full h-full object-contain p-6 transition-transform duration-500 group-hover:scale-110"
|
||||
/>
|
||||
<picture>
|
||||
<source srcSet={webpImage} type="image/webp" />
|
||||
<img
|
||||
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 */}
|
||||
<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">
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
import path from "path"
|
||||
import react from "@vitejs/plugin-react"
|
||||
import { defineConfig } from "vite"
|
||||
import { inspectAttr } from 'kimi-plugin-inspect-react'
|
||||
// import { inspectAttr } from 'kimi-plugin-inspect-react'
|
||||
import { viteStaticCopy } from 'vite-plugin-static-copy'
|
||||
|
||||
/**
|
||||
@@ -22,7 +22,7 @@ const devNoIndexPlugin = () => ({
|
||||
export default defineConfig({
|
||||
base: '/',
|
||||
plugins: [
|
||||
inspectAttr(),
|
||||
// inspectAttr(), // Desabilitado - pode causar tela em branco
|
||||
react(),
|
||||
devNoIndexPlugin(),
|
||||
viteStaticCopy({
|
||||
|
||||
Reference in New Issue
Block a user