<!DOCTYPE html>
<html lang=”pt-BR”>
<head>
<meta charset=”UTF-8″ />
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″/>
<title>Gerador de Artigos — GNR Ambiental</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, -apple-system, sans-serif; background: #f3f4f6; color: #1a1a1a; min-height: 100vh; padding: 2rem 1rem; }
.wrap { max-width: 860px; margin: 0 auto; background: white; border-radius: 16px; padding: 2rem; box-shadow: 0 1px 6px rgba(0,0,0,0.08); }

.header { display: flex; align-items: center; gap: 14px; margin-bottom: 28px; padding-bottom: 20px; border-bottom: 1px solid #e5e7eb; }
.logo { width: 46px; height: 46px; border-radius: 10px; background: #0F6E56; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.logo svg { width: 22px; height: 22px; }
.header-text h1 { font-size: 18px; font-weight: 600; }
.header-text p { font-size: 13px; color: #6b7280; margin-top: 2px; }

.section-label { font-size: 11px; font-weight: 600; color: #9ca3af; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 10px; }

.cat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; margin-bottom: 20px; }
.cat-btn { padding: 10px 12px; border-radius: 8px; font-size: 12px; cursor: pointer; text-align: left; line-height: 1.4; font-family: inherit; border: 1px solid #e5e7eb; background: white; color: #374151; transition: all 0.15s; }
.cat-btn:hover { background: #f9fafb; }
.cat-btn.active { border: 1.5px solid #1D9E75; background: #E1F5EE; color: #085041; }
.cat-icon { display: block; font-size: 15px; margin-bottom: 4px; }
.cat-name { font-weight: 500; }

.form-row { margin-bottom: 16px; }
label { display: block; font-size: 13px; font-weight: 500; color: #374151; margin-bottom: 5px; }
input[type=text], textarea, select {
width: 100%; padding: 9px 12px;
border: 1px solid #e5e7eb; border-radius: 8px;
font-size: 14px; font-family: inherit; color: #1a1a1a;
background: white; outline: none; transition: border 0.15s;
}
input[type=text]:focus, textarea:focus, select:focus { border-color: #1D9E75; }
textarea { min-height: 72px; resize: vertical; line-height: 1.6; }
.hint { font-size: 12px; color: #9ca3af; margin-top: 4px; }

.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (max-width: 540px) { .two-col { grid-template-columns: 1fr; } }

.divider { border: none; border-top: 1px solid #e5e7eb; margin: 20px 0; }

.city-wrap { display: flex; flex-wrap: wrap; gap: 7px; }
.city-chip { padding: 5px 14px; border-radius: 999px; font-size: 12px; cursor: pointer; font-family: inherit; border: 1px solid #e5e7eb; background: white; color: #6b7280; transition: all 0.15s; }
.city-chip:hover { background: #f9fafb; }
.city-chip.active { border: 1.5px solid #1D9E75; background: #E1F5EE; color: #085041; font-weight: 500; }

.btn-gen { width: 100%; padding: 13px; background: #0F6E56; color: white; border: none; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; font-family: inherit; transition: background 0.15s; margin-top: 4px; }
.btn-gen:hover { background: #085041; }
.btn-gen:disabled { background: #e5e7eb; color: #9ca3af; cursor: not-allowed; }

.result-box { margin-top: 24px; border: 1px solid #e5e7eb; border-radius: 12px; overflow: hidden; display: none; }
.result-header { padding: 11px 16px; background: #f9fafb; border-bottom: 1px solid #e5e7eb; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.result-label { font-size: 13px; font-weight: 500; color: #6b7280; }
.result-actions { display: flex; gap: 8px; }
.btn-sm { padding: 5px 12px; font-size: 12px; border: 1px solid #e5e7eb; border-radius: 6px; background: white; cursor: pointer; font-family: inherit; transition: background 0.15s; }
.btn-sm:hover { background: #f3f4f6; }
.result-content { padding: 1.5rem; font-size: 14px; line-height: 1.9; white-space: pre-wrap; color: #1a1a1a; }

.dots { display: flex; gap: 6px; align-items: center; padding: 1.5rem; }
.dot { width: 8px; height: 8px; border-radius: 50%; background: #1D9E75; animation: bounce 1.2s infinite; }
.dot:nth-child(2) { animation-delay: 0.2s; }
.dot:nth-child(3) { animation-delay: 0.4s; }
@keyframes bounce { 0%,80%,100%{opacity:.3;transform:scale(.8)} 40%{opacity:1;transform:scale(1)} }

.error-msg { color: #dc2626; font-size: 13px; padding: 1rem 1.5rem; }

.api-warning { background: #fffbeb; border: 1px solid #fcd34d; border-radius: 8px; padding: 10px 14px; font-size: 13px; color: #92400e; margin-bottom: 20px; display: none; }
.api-warning a { color: #0F6E56; text-decoration: underline; }
</style>
</head>
<body>
<div class=”wrap”>

<div class=”header”>
<div class=”logo”>
<svg viewBox=”0 0 24 24″ fill=”none” stroke=”white” stroke-width=”2″>
<circle cx=”12″ cy=”12″ r=”10″/>
<circle cx=”12″ cy=”12″ r=”4″/>
<line x1=”12″ y1=”2″ x2=”12″ y2=”5″/>
<line x1=”12″ y1=”19″ x2=”12″ y2=”22″/>
<line x1=”2″ y1=”12″ x2=”5″ y2=”12″/>
<line x1=”19″ y1=”12″ x2=”22″ y2=”12″/>
</svg>
</div>
<div class=”header-text”>
<h1>Gerador de Artigos — GNR Ambiental</h1>
<p>Artigos técnicos otimizados para SEO e geração de leads</p>
</div>
</div>

<div class=”api-warning” id=”api-warning”>
⚠️ Para usar fora do Claude.ai, insira sua chave de API da Anthropic no campo abaixo.
Obtenha em <a href=”https://console.anthropic.com/settings/keys” target=”_blank”>console.anthropic.com</a>.
</div>

<div class=”form-row” id=”api-key-row” style=”display:none;”>
<label>Chave de API Anthropic (necessária fora do Claude.ai)</label>
<input type=”text” id=”api-key” placeholder=”sk-ant-…” />
<p class=”hint”>A chave não é salva — apenas usada nesta sessão.</p>
</div>

<div class=”section-label”>Categoria</div>
<div class=”cat-grid” id=”cat-grid”>
<button class=”cat-btn” data-cat=”Gestão de Resíduos” onclick=”selectCat(this)”><span class=”cat-icon”>♻️</span><span class=”cat-name”>Gestão de Resíduos</span></button>
<button class=”cat-btn” data-cat=”Legislação Ambiental” onclick=”selectCat(this)”><span class=”cat-icon”>📋</span><span class=”cat-name”>Legislação Ambiental</span></button>
<button class=”cat-btn” data-cat=”Meio Ambiente e Sustentabilidade” onclick=”selectCat(this)”><span class=”cat-icon”>🌿</span><span class=”cat-name”>Meio Ambiente</span></button>
<button class=”cat-btn” data-cat=”Segurança do Trabalho” onclick=”selectCat(this)”><span class=”cat-icon”>⚠️</span><span class=”cat-name”>Segurança do Trabalho</span></button>
<button class=”cat-btn” data-cat=”Engenharia Elétrica” onclick=”selectCat(this)”><span class=”cat-icon”>⚡</span><span class=”cat-name”>Engenharia Elétrica</span></button>
<button class=”cat-btn” data-cat=”Engenharia Civil” onclick=”selectCat(this)”><span class=”cat-icon”>🏗️</span><span class=”cat-name”>Engenharia Civil</span></button>
</div>

<div class=”form-row”>
<label>Tema principal do artigo</label>
<textarea id=”topic” placeholder=”Ex: Descarte correto de resíduos sólidos industriais conforme a PNRS…”></textarea>
</div>

<div class=”two-col form-row”>
<div>
<label>Palavra-chave principal (SEO)</label>
<input type=”text” id=”keyword” placeholder=”Ex: laudo de segurança do trabalho SP” />
<p class=”hint”>Será repetida 5+ vezes no artigo</p>
</div>
<div>
<label>Tamanho do artigo</label>
<select id=”size”>
<option value=”curto”>Curto (300–500 palavras)</option>
<option value=”medio” selected>Médio (600–900 palavras)</option>
<option value=”longo”>Longo (1000–1400 palavras)</option>
</select>
</div>
</div>

<hr class=”divider” />

<div class=”section-label” style=”margin-bottom:10px;”>Cidades a citar no artigo <span style=”font-weight:400;text-transform:none;letter-spacing:0;font-size:11px;”>(mínimo 4)</span></div>
<div class=”city-wrap” id=”city-wrap”>
<button class=”city-chip active” onclick=”toggleCity(this)”>São Paulo</button>
<button class=”city-chip active” onclick=”toggleCity(this)”>São Bernardo do Campo</button>
<button class=”city-chip active” onclick=”toggleCity(this)”>Santo André</button>
<button class=”city-chip active” onclick=”toggleCity(this)”>Diadema</button>
<button class=”city-chip” onclick=”toggleCity(this)”>Osasco</button>
<button class=”city-chip” onclick=”toggleCity(this)”>Campinas</button>
<button class=”city-chip” onclick=”toggleCity(this)”>Sorocaba</button>
<button class=”city-chip” onclick=”toggleCity(this)”>Guarulhos</button>
</div>
<p class=”hint” style=”margin-top:8px;”>Clique para selecionar/desselecionar</p>

<hr class=”divider” />

<button class=”btn-gen” id=”btn-gen” onclick=”generateArticle()”>✦ Gerar artigo otimizado</button>

<div class=”result-box” id=”result-box”>
<div class=”result-header”>
<span class=”result-label” id=”result-label”>Artigo gerado</span>
<div class=”result-actions”>
<button class=”btn-sm” onclick=”copyArticle()”>Copiar texto</button>
<button class=”btn-sm” onclick=”resetForm()”>Novo artigo</button>
</div>
</div>
<div id=”result-content”></div>
</div>

</div>

<script>
let selectedCat = ”;
let articleText = ”;

// Detectar se está fora do Claude.ai
const isExternal = !window.location.hostname.includes(‘claude.ai’) && window.location.protocol === ‘file:’ || (!window.location.hostname.includes(‘claude.ai’) && window.location.hostname !== ”);
if (window.location.protocol === ‘file:’) {
document.getElementById(‘api-warning’).style.display = ‘block’;
document.getElementById(‘api-key-row’).style.display = ‘block’;
}

function selectCat(el) {
document.querySelectorAll(‘.cat-btn’).forEach(b => b.classList.remove(‘active’));
el.classList.add(‘active’);
selectedCat = el.dataset.cat;
}

function toggleCity(el) {
el.classList.toggle(‘active’);
}

function getSelectedCities() {
return […document.querySelectorAll(‘.city-chip.active’)].map(c => c.textContent.trim());
}

function resetForm() {
document.getElementById(‘result-box’).style.display = ‘none’;
document.getElementById(‘topic’).value = ”;
document.getElementById(‘keyword’).value = ”;
document.getElementById(‘size’).value = ‘medio’;
document.querySelectorAll(‘.cat-btn’).forEach(b => b.classList.remove(‘active’));
document.querySelectorAll(‘.city-chip’).forEach(c => {
const defaults = [‘São Paulo’,’São Bernardo do Campo’,’Santo André’,’Diadema’];
c.classList.toggle(‘active’, defaults.includes(c.textContent.trim()));
});
selectedCat = ”;
articleText = ”;
const btn = document.getElementById(‘btn-gen’);
btn.disabled = false;
btn.textContent = ‘✦ Gerar artigo otimizado’;
}

function copyArticle() {
if (!articleText) return;
navigator.clipboard.writeText(articleText).then(() => {
const btn = document.querySelector(‘.result-actions .btn-sm’);
btn.textContent = ‘Copiado!’;
setTimeout(() => btn.textContent = ‘Copiar texto’, 2000);
});
}

async function generateArticle() {
if (!selectedCat) return alert(‘Selecione uma categoria.’);
const topic = document.getElementById(‘topic’).value.trim();
const keyword = document.getElementById(‘keyword’).value.trim();
const size = document.getElementById(‘size’).value;
const cities = getSelectedCities();
if (!topic) return alert(‘Descreva o tema do artigo.’);
if (!keyword) return alert(‘Insira a palavra-chave principal.’);
if (cities.length < 4) return alert(‘Selecione pelo menos 4 cidades.’);

const apiKey = document.getElementById(‘api-key’) ? document.getElementById(‘api-key’).value.trim() : ”;

const sizeMap = { curto: ‘300 a 500 palavras’, medio: ‘600 a 900 palavras’, longo: ‘1000 a 1400 palavras’ };

const prompt = `Você é um engenheiro especialista em meio ambiente, segurança do trabalho e engenharia aplicada, com foco em produção de conteúdo técnico e persuasivo para geração de leads. Trabalha para a GNR Ambiental.

Crie um artigo completo, otimizado para SEO e conversão, sobre o tema abaixo.

CATEGORIA: ${selectedCat}
TEMA PRINCIPAL: ${topic}
PALAVRA-CHAVE PRINCIPAL: ${keyword}
TAMANHO: ${sizeMap[size]}
CIDADES A CITAR: ${cities.join(‘, ‘)}

OBJETIVO:
– Ranquear no Google
– Gerar leads qualificados
– Demonstrar autoridade técnica da GNR Ambiental

DIRETRIZES OBRIGATÓRIAS:

1. SEO
– Repetir a palavra-chave principal pelo menos 5 vezes ao longo do texto
– Usar variações semânticas da palavra-chave
– Criar título chamativo com foco em busca (H1)
– Criar meta descrição até 155 caracteres (inserir logo abaixo do título, com rótulo “META DESCRIÇÃO:”)
– Usar subtítulos H2 e H3 (marcar como H2: e H3:)
– Inserir listas com bullet points onde pertinente

2. CONTEÚDO
– Explicar o problema de forma clara e prática
– Explicar quando o serviço é obrigatório (normas, leis, riscos)
– Inserir normas técnicas reais e relevantes (NRs, NBRs, CETESB, ISO etc.) — NUNCA inventar normas
– Mostrar consequências de não realizar o serviço
– Explicar como é feito (passo a passo técnico simplificado)
– Incluir exemplos reais ou situações comuns

3. REGIONALIZAÇÃO
Citar naturalmente pelo menos 4 das seguintes cidades: ${cities.join(‘, ‘)}

4. AUTORIDADE — incluir tópico “Por que escolher a GNR Ambiental?” com:
– Eng. Guilherme Nunes Rosa
– Engenheiro Ambiental, Civil, Eletricista e de Segurança do Trabalho
– Perito Judicial
– Mais de 10 anos de experiência
– Empresa com certificação ISO 17025 (ruído) e ISO 9001
– Equipamentos próprios e equipe especializada

5. CONVERSÃO — inserir CTA no meio E no final do artigo:
📞 (11) 2374-1201
📱 (11) 95277-2125
✉️ comercial2@gnrambiental.com.br
Usar frases como: “Solicite um orçamento”, “Fale com um especialista”, “Atendimento rápido”

6. ESTRUTURA DO ARTIGO (nesta ordem):
H1: Título
META DESCRIÇÃO: (até 155 caracteres)
– Introdução (com dor do cliente)
H2: O que é [tema]
H2: Quando é obrigatório
H2: Normas aplicáveis
H2: Como é feito o serviço
H2: Riscos de não realizar
H2: Benefícios
[CTA intermediário]
H2: Por que escolher a GNR Ambiental?
H2: Conclusão + CTA forte

7. No final do artigo, incluir obrigatoriamente:
ALT DA IMAGEM: [descrição com palavra-chave]

8. LINGUAGEM:
– Técnica, mas acessível
– Frases curtas e diretas
– Palavras de transição
– Evitar linguagem genérica de IA

PROIBIDO: inventar normas, copiar conteúdo, linguagem genérica.

Escreva o artigo completo agora, sem introduções ou comentários fora do artigo:`;

const btn = document.getElementById(‘btn-gen’);
btn.disabled = true;
btn.textContent = ‘Gerando artigo…’;

const resultBox = document.getElementById(‘result-box’);
const resultContent = document.getElementById(‘result-content’);
resultBox.style.display = ‘block’;
resultContent.innerHTML = ‘<div class=”dots”><div class=”dot”></div><div class=”dot”></div><div class=”dot”></div></div>’;
document.getElementById(‘result-label’).textContent = `Artigo — ${selectedCat}`;
resultBox.scrollIntoView({ behavior: ‘smooth’, block: ‘start’ });

const headers = { ‘Content-Type’: ‘application/json’ };
if (apiKey) headers[‘x-api-key’] = apiKey;

try {
const response = await fetch(‘https://api.anthropic.com/v1/messages’, {
method: ‘POST’,
headers,
body: JSON.stringify({
model: ‘claude-sonnet-4-20250514’,
max_tokens: 2000,
messages: [{ role: ‘user’, content: prompt }]
})
});
const data = await response.json();
if (data.error) {
resultContent.innerHTML = `<p class=”error-msg”>Erro da API: ${data.error.message}</p>`;
} else {
articleText = data.content?.map(b => b.text || ”).join(”) || ‘Erro ao gerar o artigo.’;
resultContent.innerHTML = `<div class=”result-content”>${articleText}</div>`;
}
} catch (err) {
resultContent.innerHTML = ‘<p class=”error-msg”>Erro de conexão. Verifique sua internet e tente novamente.</p>’;
}

btn.disabled = false;
btn.textContent = ‘✦ Gerar novo artigo’;
}
</script>
</body>
</html>

Precisa de ajuda?