Compare commits

..

51 Commits

Author SHA1 Message Date
avanzato dc697c8962 Release PROD: Aplicativos de Atrair Leads
Deploy PROD Avanzato / deploy-prod (push) Successful in 45s
2026-06-03 22:19:56 -03:00
avanzato 667447c389 Merge remote-tracking branch 'origin/develop' 2026-06-03 22:19:52 -03:00
avanzato e3f35d808d Log release HML: Aplicativos de Atrair Leads
Deploy HML Avanzato / deploy-hml (push) Successful in 37s
2026-06-03 22:07:59 -03:00
avanzato fdfb4606f0 Aplicativos de Atrair Leads 2026-06-03 22:07:59 -03:00
avanzato e5c18bb6fc Log release HML: Aplicativos de Atrair Leads
Deploy HML Avanzato / deploy-hml (push) Successful in 2m21s
2026-06-02 22:34:40 -03:00
avanzato 6dfdf01830 Aplicativos de Atrair Leads 2026-06-02 22:34:39 -03:00
avanzato cd6bcf5b3d Release PROD: Paginas e SEO master, correção javascript google
Deploy PROD Avanzato / deploy-prod (push) Successful in 35s
2026-06-02 14:21:08 -03:00
avanzato 35e5727e60 Merge remote-tracking branch 'origin/develop' 2026-06-02 12:50:56 -03:00
avanzato 96563b30e9 Log release HML: Paginas e SEO master
Deploy HML Avanzato / deploy-hml (push) Successful in 42s
2026-06-02 12:43:58 -03:00
avanzato 80dbb986f4 Paginas e SEO master 2026-06-02 12:43:57 -03:00
avanzato 6db7b5200b Log release HML: Paginas e SEO master
Deploy HML Avanzato / deploy-hml (push) Successful in 1m17s
2026-06-02 12:07:35 -03:00
avanzato 52cda4304b Paginas e SEO master 2026-06-02 12:07:34 -03:00
avanzato a85a6c9b3f Log release HML: Paginas e SEO master
Deploy HML Avanzato / deploy-hml (push) Successful in 46s
2026-06-02 11:45:37 -03:00
avanzato 2900b9afd9 Paginas e SEO master 2026-06-02 11:45:36 -03:00
avanzato 433773c4b8 Log release HML: Paginas e SEO master
Deploy HML Avanzato / deploy-hml (push) Successful in 47s
2026-06-02 10:42:23 -03:00
avanzato 6140142bab Paginas e SEO master 2026-06-02 10:42:23 -03:00
avanzato 529036bfe9 Release PROD: Paginas e SEO master
Deploy PROD Avanzato / deploy-prod (push) Successful in 34s
2026-06-01 20:28:34 -03:00
avanzato 52f86cbba5 Release PROD: Paginas e SEO master
Deploy PROD Avanzato / deploy-prod (push) Successful in 43s
2026-06-01 19:56:51 -03:00
avanzato 3eb41133f4 Merge remote-tracking branch 'origin/develop' 2026-06-01 19:56:36 -03:00
avanzato e8f15d63ed Log release HML: Paginas e SEO master
Deploy HML Avanzato / deploy-hml (push) Successful in 42s
2026-06-01 19:55:54 -03:00
avanzato 24786e3512 Paginas e SEO master 2026-06-01 19:55:53 -03:00
avanzato 7bcc582664 Release PROD: Paginas e SEO master
Deploy PROD Avanzato / deploy-prod (push) Successful in 42s
2026-06-01 19:44:45 -03:00
avanzato 4f15851f09 Merge remote-tracking branch 'origin/develop' 2026-06-01 19:43:55 -03:00
avanzato 15ce64e786 Log release HML: Paginas e SEO master
Deploy HML Avanzato / deploy-hml (push) Successful in 35s
2026-06-01 19:39:58 -03:00
avanzato 913e717a21 Paginas e SEO master 2026-06-01 19:39:58 -03:00
avanzato aa275ef538 Log release HML: Revisão Logo, Favicon, Robots
Deploy HML Avanzato / deploy-hml (push) Successful in 39s
2026-06-01 19:30:24 -03:00
avanzato 19f2848fec Revisão Logo, Favicon, Robots 2026-06-01 19:30:24 -03:00
avanzato 10e910eb6b Release PROD: Revisão Logo, Favicon, Robots
Deploy PROD Avanzato / deploy-prod (push) Successful in 34s
2026-05-31 00:58:08 -03:00
avanzato 9885f59b06 Merge remote-tracking branch 'origin/develop' 2026-05-31 00:58:01 -03:00
avanzato d79c9c48a9 Log release HML: Revisão Logo, Favicon, Robots
Deploy HML Avanzato / deploy-hml (push) Successful in 33s
2026-05-31 00:57:46 -03:00
avanzato 7f6c800ab0 Revisão Logo, Favicon, Robots 2026-05-31 00:57:45 -03:00
avanzato ec3e439973 Release PROD: Revisão Logo, Favicon, Robots
Deploy PROD Avanzato / deploy-prod (push) Successful in 33s
2026-05-31 00:29:03 -03:00
avanzato bfb022866b Merge remote-tracking branch 'origin/develop' 2026-05-31 00:29:00 -03:00
avanzato be22792b6d Log release HML: Revisão Logo, Favicon, Robots
Deploy HML Avanzato / deploy-hml (push) Successful in 37s
2026-05-31 00:28:42 -03:00
avanzato cb08c53b40 Revisão Logo, Favicon, Robots 2026-05-31 00:28:42 -03:00
avanzato 8c056b0c50 Release PROD: Revisão Logo, Favicon, Robots
Deploy PROD Avanzato / deploy-prod (push) Successful in 33s
2026-05-31 00:03:02 -03:00
avanzato b284c4d258 Merge remote-tracking branch 'origin/develop' 2026-05-31 00:02:57 -03:00
avanzato 3d36e98185 Log release HML: Revisão Logo, Favicon, Robots
Deploy HML Avanzato / deploy-hml (push) Successful in 59s
2026-05-30 23:54:49 -03:00
avanzato 4e26c13240 Revisão Logo, Favicon, Robots 2026-05-30 23:54:48 -03:00
avanzato 3e91269f12 Log release HML: Revisão logo
Deploy HML Avanzato / deploy-hml (push) Successful in 33s
2026-05-30 23:52:08 -03:00
avanzato b3b8917a96 Revisão logo 2026-05-30 23:52:07 -03:00
avanzato d15474365c Release PROD: Favivon - Correção
Deploy PROD Avanzato / deploy-prod (push) Successful in 33s
2026-05-30 23:15:12 -03:00
avanzato e9f47c5b1e Merge remote-tracking branch 'origin/develop' 2026-05-30 23:15:09 -03:00
avanzato af8ef2693d Release PROD: Favivon - Correção
Deploy PROD Avanzato / deploy-prod (push) Successful in 34s
2026-05-30 20:36:09 -03:00
avanzato 5b729b23be Merge remote-tracking branch 'origin/develop' 2026-05-30 20:35:32 -03:00
avanzato 41312945d9 Release PROD: Atualização e correção de diretorios
Deploy PROD Avanzato / deploy-prod (push) Successful in 30s
2026-05-30 19:30:29 -03:00
avanzato bb73783e9f Merge remote-tracking branch 'origin/develop' 2026-05-30 19:30:26 -03:00
avanzato 57c4abf055 Merge branch 'develop'
Deploy PROD Avanzato / deploy-prod (push) Successful in 50s
2026-05-29 01:15:14 -03:00
avanzato f493c55040 Merge branch 'develop'
Deploy PROD Avanzato / deploy-prod (push) Successful in 31s
2026-05-27 22:45:17 -03:00
avanzato 0a0d2382d1 Merge branch 'develop'
Deploy PROD Avanzato / deploy-prod (push) Successful in 54s
2026-05-27 16:17:46 -03:00
avanzato 47fdcab3b4 Adiciona deploy automático produção
Deploy PROD Avanzato / deploy-prod (push) Successful in 58s
2026-05-26 22:07:42 -03:00
96 changed files with 5849 additions and 34104 deletions
Vendored
BIN
View File
Binary file not shown.
+37
View File
@@ -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
'
+135
View File
@@ -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*
+162
View File
@@ -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
View File
@@ -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
+95
View File
@@ -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%)
BIN
View File
Binary file not shown.
-246
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+42 -11
View File
@@ -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>
+10 -23
View File
@@ -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
+116
View File
@@ -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
View File
@@ -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
-33
View File
@@ -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
+57
View File
@@ -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
+132
View File
@@ -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
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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"
},
@@ -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
@@ -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
@@ -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
File diff suppressed because one or more lines are too long
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-39
View File
@@ -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
View File
@@ -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

+116
View File
@@ -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
View File
@@ -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"
}
+21
View File
@@ -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"
}
]
}
+30
View File
@@ -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 ""
+260
View File
@@ -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
View File
@@ -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 />
+13 -10
View File
@@ -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" />
+4 -3
View File
@@ -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;
+373
View File
@@ -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,
};
}
+73
View File
@@ -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
View File
@@ -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);
}
};
};
+176
View File
@@ -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,
},
});
+3
View File
@@ -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
View File
@@ -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>
);
};
+100
View File
@@ -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;
+60
View File
@@ -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;
+60
View File
@@ -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;
+60
View File
@@ -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;
+67
View File
@@ -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' },
};
}
+60
View File
@@ -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;
+222
View File
@@ -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;
+130
View File
@@ -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;
+130
View File
@@ -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;
+176
View File
@@ -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;
+130
View File
@@ -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;
+130
View File
@@ -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;
+130
View File
@@ -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;
+130
View File
@@ -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;
+130
View File
@@ -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;
+131
View File
@@ -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;
+131
View File
@@ -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;
+131
View File
@@ -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;
+131
View File
@@ -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;
+131
View File
@@ -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
View File
@@ -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>
+4 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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>
+15 -6
View File
@@ -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
View File
@@ -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({