Manual: Como Criar uma Pagina de Ferramenta

Guia completo para converter qualquer pagina de ferramenta do Chipak Tools para o design system padrao (baseado em /ferramenta/modelo.html). Inclui checklist, estrutura HTML, CSS obrigatorio, armadilhas conhecidas e diretrizes de conteudo SEO.

REGRAS FUNDAMENTAIS — Leia antes de qualquer coisa:
  1. Toda pagina de ferramenta DEVE seguir o modelo: /ferramenta/modelo.html e a referencia canonica. A estrutura, classes CSS, IDs e ordem dos elementos devem ser identicos.
  2. O site e componentizado: A sidebar, header, auth modal e mobile nav sao injetados por ChipakComponents.init('Nome'). Rating, favoritos, report e feedback sao injetados por ChipakFeatures.init('slug'). Voce NAO deve escrever esses elementos manualmente — apenas fornecer os containers e IDs corretos para os componentes funcionarem.
  3. O conteudo textual deve ser rico: O texto (aba Sobre, info-card, description) deve ser escrito pensando em SEO e em quem busca pelo tema no Google. Nao basta descrever a ferramenta — e preciso educar, explicar o contexto e responder as duvidas comuns.
  4. Exemplos ja convertidos: Use gerador-cpf.html e gerador-cnpj.html como referencia pratica. Eles seguem 100% deste manual.
Indice
  1. Visao geral do processo
  2. Componentizacao — o que e automatico e o que e manual
  3. Estrutura HTML obrigatoria (seguir /ferramenta/modelo)
  4. CSS obrigatorio (incluindo modais injetados)
  5. IDs e elementos obrigatorios para o JS funcionar
  6. Scripts e ordem de carregamento
  7. Conteudo e SEO — como escrever texto rico para buscas
  8. Armadilhas conhecidas (bugs ja enfrentados)
  9. Checklist final

1. Visao Geral do Processo

Cada pagina de ferramenta segue o template definido em /ferramenta/modelo.html (~2400 linhas). O processo de conversao e:

  1. Ler a pagina antiga e entender a funcionalidade JS especifica (geracao, validacao, conversao, etc.).
  2. Reescrever o HTML usando a estrutura do modelo (breadcrumbs → hero → tabs → tool-section → instructions → info-card → article → related-tools).
  3. Copiar TODO o bloco CSS do modelo para dentro do <style> da pagina.
  4. Manter o JS funcional da ferramenta original, adaptando apenas os hooks visuais (IDs, classes).
  5. Escrever conteudo SEO rico na aba "Sobre" (artigo com 5-6 secoes).
  6. Testar: funcionalidade, favoritos, rating, report, feedback modal, responsivo.
Tempo medio: a conversao de uma pagina leva entre 15-30 minutos se voce seguir este manual. O maior trabalho e a redacao do artigo SEO.

2. Componentizacao — O Que E Automatico e O Que E Manual

O Chipak Tools e um site estatico componentizado. Isso significa que varios elementos sao injetados em tempo de execucao pelo JavaScript, e nao escritos diretamente no HTML. Entender essa divisao e essencial para nao duplicar codigo nem esquecer de fornecer os hooks necessarios.

2.1. O que o ChipakComponents.init('Nome') injeta automaticamente

ComponenteOnde injetaO que voce precisa fornecer
Sidebar completa#sidebar-containerUm <div id="sidebar-container"></div> vazio
Auth modal (login/cadastro)body (append)Nada — e 100% automatico
Mobile bottom nav#mobile-nav-containerUm <div id="mobile-nav-container"></div> vazio
User menu updates#loggedOutMenu, #loggedInMenu, #userAvatar, #userNameO HTML do header com esses IDs (veja secao 3)
Sidebar logo link#sidebarLogoLinkAutomatico — atualiza href baseado no estado de login

2.2. O que o ChipakFeatures.init('slug') injeta automaticamente

FeatureO que injeta/fazO que voce precisa fornecer
Rating (estrelas)Carrega nota e contagem do Firestore, atualiza UI#starRating com 5 buttons + #ratingScore + #ratingCount + #ratingThankyou
FavoritosVerifica estado no Firestore, alterna botoes#btnFavoriteOff + #btnFavoriteOn (dois botoes separados!)
Report modalInjeta HTML do modal no body (com SVGs sem width/height)CSS para .report-modal-* na pagina (senao SVGs ficam gigantes)
Feedback modalInjeta HTML do modal no body (abre para 1-2 estrelas)CSS para .feedback-modal-* na pagina
Funcoes globaisRegistra: rateTool(), hoverStars(), unhoverStars(), toggleFavorite(), openReportModal(), sendFeedback(), closeFeedbackModal()Os handlers onclick nos elementos HTML

2.3. O que voce escreve manualmente

Resumo: Voce fornece os containers vazios e os IDs corretos, e os componentes JS preenchem tudo. Voce NAO escreve sidebar, auth modal ou mobile nav manualmente. Mas voce DEVE escrever o CSS para modais injetados, porque o JS injeta HTML cru sem estilos — o CSS precisa estar na pagina.

3. Estrutura HTML Obrigatoria

A pagina deve seguir exatamente esta arvore. Cada bloco e explicado abaixo.

<head> ├─ meta (charset, viewport, title, description, keywords, canonical) ├─ Open Graph (og:type, og:title, og:description, og:url) ├─ Fonts (Inter + JetBrains Mono) ├─ styles.css ├─ Firebase SDKs (app, auth, firestore — compat v10.7.0) ├─ Schema.org JSON-LD (WebApplication) └─ <style> ... TODO O CSS DO MODELO ... </style> <body> ├─ div.sidebar-overlay #sidebarOverlay ├─ div#sidebar-container (injetado por ChipakComponents) ├─ main.main-content │ ├─ header.app-header (menu toggle + titulo + user menu) │ └─ div.content-area.full-width │ ├─ nav.breadcrumbs │ ├─ div.tool-hero ★ HERO │ │ └─ badges, h1, description, meta, star-rating, actions │ ├─ div.tool-tabs │ ├─ div.tool-tab-panel#tab-ferramenta ★ TAB 1 │ │ ├─ div.tool-section (a ferramenta em si) │ │ ├─ div.instructions-card │ │ └─ div.info-card │ ├─ div.tool-tab-panel#tab-sobre ★ TAB 2 │ │ └─ div.article-section (artigo SEO completo) │ └─ div.related-tools ├─ div#mobile-nav-container ├─ div.toast-container#toastContainer └─ scripts

3.1. Head — Meta Tags

<title>Nome da Ferramenta Online Gratis - Para Testes | Chipak Tools</title>
<meta name="description" content="Descricao com 150-160 caracteres. Inclua a palavra-chave principal, o beneficio e 'sem cadastro' ou 'gratuito'.">
<meta name="keywords" content="palavra1, palavra2, variacao1, variacao2, variacao longa">
<link rel="canonical" href="https://chipak.tools/ferramenta/slug-da-ferramenta">

<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:title" content="Mesmo titulo ou versao curta">
<meta property="og:description" content="Versao curta da description">
<meta property="og:url" content="https://chipak.tools/ferramenta/slug-da-ferramenta">

3.2. Head — Schema.org

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "name": "Nome da Ferramenta",
    "description": "Descricao curta",
    "url": "https://chipak.tools/ferramenta/slug",
    "applicationCategory": "DeveloperApplication",
    "operatingSystem": "Web",
    "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "BRL"
    },
    "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": "4.7",
        "bestRating": "5",
        "worstRating": "1",
        "ratingCount": "XXX"
    }
}
</script>

3.3. Tool Hero

O hero e o cabecalho visual principal. Contem:

<div class="tool-hero">
    <div class="tool-hero-inner">
        <div class="tool-hero-content">
            <!-- Badges -->
            <div class="tool-hero-badges">
                <span class="badge badge-free">...Gratuito</span>
                <span class="badge badge-category">Categoria</span>
                <span class="badge badge-popular">...Popular</span>  <!-- opcional -->
            </div>

            <h1>Nome da Ferramenta</h1>
            <p class="tool-hero-description">Descricao rica em 1-2 frases.</p>

            <!-- Meta info -->
            <div class="tool-hero-meta">
                <span class="tool-hero-meta-item">...XX.Xk usuarios</span>
                <span class="tool-hero-meta-item">...Atualizado em Mes Ano</span>
                <span class="tool-hero-meta-item">...X.X/5</span>
            </div>

            <!-- Star Rating (IDs OBRIGATORIOS) -->
            <div class="star-rating">
                <span class="star-rating-label">Avalie esta ferramenta:</span>
                <div class="star-rating-stars" id="starRating">
                    <!-- 5 buttons com data-value="1" a "5" -->
                    <!-- onclick="rateTool(N)" onmouseenter="hoverStars(N)" onmouseleave="unhoverStars()" -->
                </div>
                <span class="star-rating-score" id="ratingScore">X.X</span>
                <span class="star-rating-count" id="ratingCount">(XXX votos)</span>
                <span class="star-rating-thankyou" id="ratingThankyou">...Obrigado!</span>
            </div>
        </div>

        <!-- Actions (IDs OBRIGATORIOS para favoritos) -->
        <div class="tool-hero-actions">
            <button class="btn-favorite" id="btnFavoriteOff" onclick="toggleFavorite()">...Favoritar</button>
            <button class="btn-favorite active" id="btnFavoriteOn" onclick="toggleFavorite()" style="display:none;">...Favoritado</button>
            <button class="btn-share" onclick="shareTool()">...Compartilhar</button>
            <button class="btn-report" onclick="openReportModal()">...Reportar Bug</button>
        </div>
    </div>
</div>
CRITICO — Dois botoes de favorito: O chipak-features.js procura por #btnFavoriteOff e #btnFavoriteOn separadamente. Se voce usar um unico botao com toggle de classe, os favoritos NAO funcionam. Sempre use dois botoes, com o btnFavoriteOn comecando com style="display:none;".

3.4. Tabs

<div class="tool-tabs">
    <button class="tool-tab active" onclick="switchTab('ferramenta')" data-tab="ferramenta">
        ...Ferramenta
    </button>
    <button class="tool-tab" onclick="switchTab('sobre')" data-tab="sobre">
        ...Sobre
    </button>
</div>

<div class="tool-tab-panel active" id="tab-ferramenta">...</div>
<div class="tool-tab-panel" id="tab-sobre">...</div>

A funcao switchTab() deve ser definida no script da pagina:

function switchTab(tabName) {
    document.querySelectorAll('.tool-tab').forEach(tab => {
        tab.classList.toggle('active', tab.dataset.tab === tabName);
    });
    document.querySelectorAll('.tool-tab-panel').forEach(panel => {
        panel.classList.toggle('active', panel.id === 'tab-' + tabName);
    });
}

3.5. Tab 1 — Ferramenta

Contem tres blocos nesta ordem:

  1. div.tool-section — A ferramenta em si (inputs, botao principal .btn-calculate, resultado .result-display, acoes secundarias .actions-row, historico).
  2. div.instructions-card — "Como Usar" em 3-4 passos com .step-item numerados.
  3. div.info-card — Resumo sobre a ferramenta + usos permitidos + aviso legal.

3.6. Tab 2 — Sobre (Artigo)

Ver secao 7. Conteudo e SEO para detalhes completos.

3.7. Related Tools

<div class="related-tools">
    <div class="related-tools-title">...Ferramentas Relacionadas</div>
    <div class="related-tools-grid">
        <a href="/ferramenta/slug" class="related-tool-card">
            <div class="related-tool-icon">...svg...</div>
            <div class="related-tool-info">
                <div class="related-tool-name">Nome</div>
                <div class="related-tool-desc">Descricao curta</div>
            </div>
        </a>
        <!-- 3-4 ferramentas relacionadas -->
    </div>
</div>

Escolha 3-4 ferramentas do mesmo grupo tematico. Se a ferramenta e um gerador, inclua o validador correspondente e vice-versa.

4. CSS Obrigatorio

REGRA #1: O bloco <style> da pagina deve conter TODAS as classes CSS listadas abaixo. NAO dependa apenas do styles.css global — ele nao contem as classes especificas do modelo de ferramenta.

As classes CSS se dividem em dois grupos:

4.1. Classes da pagina (visuais)

ClasseO que estiliza
.breadcrumbsNavegacao de migalhas
.tool-hero, .tool-hero-*Cabecalho hero (badges, h1, meta)
.badge, .badge-free, .badge-category, .badge-popularEtiquetas do hero
.star-rating, .star-rating-*Sistema de avaliacao por estrelas
.btn-favorite, .btn-share, .btn-reportBotoes de acao do hero
.tool-tabs, .tool-tab, .tool-tab-panelSistema de abas
.tool-section, .section-titleContainer principal da ferramenta
.input-grid, .input-wrapper, .input-field, .input-label, .input-hintCampos de formulario
.checkbox-group, .checkbox-label, .checkbox-sublabelOpcoes com checkbox
.btn-calculateBotao principal de acao (gradiente)
.actions-rowLinha de botoes secundarios
.result-display, .result-value, .result-placeholderArea de resultado
.history-section, .history-list, .history-itemHistorico de resultados
.alert-box, .alert-box.warningCaixas de alerta/dica
.instructions-card, .step-item, .step-numberCard "Como Usar"
.info-cardCard informativo
.article-section, .article-header, .article-toc, .article-bodyArtigo SEO (aba Sobre)
.related-tools, .related-tool-cardFerramentas relacionadas

4.2. Classes para modais INJETADOS pelo JS CRITICO

O chipak-features.js injeta modais (report e feedback) diretamente no DOM com SVGs que NAO possuem width/height. Se a pagina nao tiver o CSS correspondente, os SVGs renderizam no tamanho total do viewport, causando icones gigantes. Isso ja aconteceu e e o bug mais recorrente ao converter paginas.

Estas classes DEVEM estar no <style> de TODA pagina de ferramenta:

ClassePor que e necessaria
.report-modal-overlayOverlay do modal de report (display:none por padrao, flex quando .active)
.report-modalContainer do modal (max-width: 500px)
.report-modal-headerCabecalho com titulo + botao fechar
.report-modal-header h3 svgLimita SVG do titulo a 20x20px
.report-modal-closeBotao X de fechar
.report-modal-bodyCorpo do modal
.report-type-gridGrid 2 colunas das opcoes de tipo de report
.report-type-optionCada opcao de tipo
.report-type-option svgLimita SVG das opcoes a 16x16px — sem isso, ficam GIGANTES
.report-modal-footerRodape com botoes
.feedback-modal-contentContainer do modal de feedback (max-width: 480px)
.feedback-stars-displayEstrelas dentro do modal
.feedback-stars-display svgLimita SVG das estrelas a 24x24px
.toast-container, .toastNotificacoes toast (posicao fixa, z-index alto)
Dica pratica: A maneira mais segura e copiar o CSS inteiro do gerador-cpf.html (que ja esta validado) e so adaptar as classes especificas da ferramenta, se houver.

4.3. Responsive Breakpoints

Tres breakpoints obrigatorios:

Mais as classes base de .mobile-bottom-nav e .mobile-nav-item (usadas pelo componente injetado).

5. IDs e Elementos Obrigatorios

O chipak-features.js e o components.js buscam estes elementos por ID. Se faltarem, a funcionalidade falha silenciosamente.

IDUsado porDescricao
#sidebarOverlaycomponents.jsOverlay para fechar sidebar no mobile
#sidebar-containercomponents.jsOnde a sidebar e injetada
#userMenucomponents.jsContainer do menu de usuario
#loggedOutMenucomponents.jsBotoes Entrar/Cadastrar
#loggedInMenucomponents.jsMenu do usuario logado (comeca display:none)
#userAvatarcomponents.jsInicial do usuario
#userNamecomponents.jsNome do usuario
#userDropdowncomponents.jsDropdown do usuario
#mobile-nav-containercomponents.jsOnde o nav mobile e injetado
#toastContainercomponents.jsContainer de toasts
#starRatingchipak-features.jsContainer das estrelas de avaliacao
#ratingScorechipak-features.jsNota media exibida
#ratingCountchipak-features.jsContagem de votos
#ratingThankyouchipak-features.jsMensagem "Obrigado!" apos avaliar
#btnFavoriteOffchipak-features.jsBotao favoritar (estado OFF)
#btnFavoriteOnchipak-features.jsBotao favoritado (estado ON, comeca escondido)
Atencao: Os star buttons dentro de #starRating precisam ter o atributo data-value="N" (1 a 5) e os handlers onclick="rateTool(N)", onmouseenter="hoverStars(N)", onmouseleave="unhoverStars()". Essas funcoes globais sao criadas pelo chipak-features.js.

6. Scripts e Ordem de Carregamento

A ordem dos scripts e importante. Sempre nesta sequencia:

<!-- 1. Bibliotecas de dominio (se a ferramenta precisar) -->
<script src="../js/documentos-br.js"></script>

<!-- 2. Componentes visuais (sidebar, header, auth modal, mobile nav) -->
<script src="../js/components.js"></script>

<!-- 3. Firebase config (inicializa app + auth + firestore) -->
<script src="../js/firebase-config.js"></script>

<!-- 4. Features (rating, favorites, report, feedback) -->
<script src="../js/chipak-features.js"></script>

<!-- 5. Router SPA -->
<script src="../js/chipak-router.js"></script>

<!-- 6. Script inline da pagina -->
<script>
    // PRIMEIRO: inicializar componentes
    ChipakComponents.init('Nome da Ferramenta');
    ChipakFeatures.init('slug-da-ferramenta');

    // DEPOIS: funcoes especificas da pagina
    function switchTab(tabName) { ... }
    function shareTool() { ... }
    // ... funcoes da ferramenta ...
</script>

6.1. Funcoes que toda pagina precisa definir

FuncaoDescricao
switchTab(tabName)Alterna entre abas (ferramenta/sobre)
shareTool()Usa navigator.share ou copia URL

As funcoes rateTool(), hoverStars(), unhoverStars(), toggleFavorite(), openReportModal(), sendFeedback() e closeFeedbackModal() sao registradas globalmente pelo chipak-features.js — NAO precisa redefini-las.

6.2. Slug da ferramenta

O slug passado para ChipakFeatures.init('slug') e usado como chave no Firestore para ratings, favoritos e reports. Deve corresponder ao nome do arquivo HTML sem extensao:

7. Conteudo e SEO — Como Escrever

Objetivo: O conteudo da aba "Sobre" deve ser escrito pensando em pessoas que pesquisam pelo tema no Google. Ele e o principal diferencial de SEO entre a nossa pagina e dezenas de ferramentas concorrentes que oferecem a mesma funcionalidade.

7.1. Principio Central

O texto deve ser rico, informativo e util para quem busca pelo assunto — nao apenas para quem ja sabe o que a ferramenta faz. Alguem que pesquisa "gerador de CNPJ" no Google pode estar querendo:

O artigo deve responder a TODAS essas intencoes de busca, nao apenas a primeira.

7.2. Estrutura do Artigo (5-6 secoes)

Siga este modelo testado:

  1. O que e [coisa] e para que serve — Contexto geral, historia breve, importancia no Brasil. Conecte com cenarios reais.
  2. Estrutura e formato — Quantos digitos, como sao organizados, o que cada parte significa. Use listas e exemplos de formato.
  3. Como funciona o algoritmo — Explicacao tecnica acessivel. Pesos, modulo 11, digitos verificadores. Blockquote com frase-chave sobre como o gerador funciona.
  4. Por que desenvolvedores precisam disso — Casos de uso concretos: testes, automacao, staging, demos, integracao com APIs. Liste 4-6 cenarios com explicacao de uma linha.
  5. Como usar a ferramenta — Passo a passo pratico (formatacao → quantidade → gerar → copiar). Mencione que e 100% local.
  6. Perguntas frequentes (FAQ) — 4-6 perguntas. SEMPRE inclua: "E ilegal?", "Pertence a alguem real?", "Funciona em cadastros reais?", "Meus dados sao coletados?".

7.3. Tom e Extensao

7.4. Elementos Visuais do Artigo

<div class="article-section" style="margin-top: 0;">
    <div class="article-header">
        <div class="article-label">...Artigo</div>
        <h2>Titulo longo e descritivo para SEO</h2>
        <div class="article-meta">
            <span>Por Equipe Chipak</span> • <span>Atualizado em Mes Ano</span> • <span>X min de leitura</span>
        </div>
    </div>

    <div class="article-toc">
        <div class="article-toc-title">...Neste artigo</div>
        <ol>
            <li><a href="#art-oque">Titulo da secao 1</a></li>
            <!-- ... -->
        </ol>
    </div>

    <div class="article-body">
        <h3 id="art-oque">1. Titulo</h3>
        <p>...</p>
        <!-- Use <ul>, <ol>, <blockquote>, <strong> para quebrar o texto -->
    </div>
</div>

7.5. O que NAO fazer

8. Armadilhas Conhecidas

Bugs que ja encontramos ao converter paginas. Leia antes de comecar.

8.1. SVGs gigantes no modal de report CRITICO

Sintoma: Ao clicar em "Reportar Bug", a pagina mostra icones de onda/formas enormes cobrindo toda a tela.
Causa: O chipak-features.js injeta o modal de report com SVGs que possuem viewBox mas NAO possuem width/height. Sem CSS para limitar o tamanho, o SVG ocupa o espaco disponivel.
Solucao: Incluir no CSS da pagina as classes .report-type-option svg { width: 16px; height: 16px; }, .report-modal-header h3 svg { width: 20px; height: 20px; } e todas as demais classes de modal listadas na secao 3.2.

8.2. Favorito nao funciona (botao unico) CRITICO

Sintoma: Clicar em "Favoritar" nao faz nada, ou o estado nao alterna.
Causa: Usar um unico botao #btnFavorite ao inves de dois botoes separados (#btnFavoriteOff + #btnFavoriteOn).
Solucao: Sempre usar dois botoes. O _initFavorites() do chipak-features.js busca por esses dois IDs especificos e alterna o display entre eles.

8.3. Feedback modal nao abre para 1-2 estrelas IMPORTANTE

Sintoma: Ao dar 1 ou 2 estrelas, nada acontece (o modal de feedback deveria abrir).
Causa: Isso normalmente acontece em paginas que NAO chamam ChipakFeatures.init('slug') (como o dashboard). Em paginas de ferramenta que chamam init(), o feedback modal e inicializado automaticamente.
Solucao: Certifique-se de que ChipakFeatures.init('slug') e chamado. Se for uma pagina especial sem slug, chame ChipakFeatures._initFeedbackModal() manualmente.

8.4. content-area sem full-width

Sintoma: O conteudo fica mais estreito que o esperado.
Causa: Faltou a classe full-width no div.content-area.
Solucao: Usar <div class="content-area full-width">.

8.5. Router SPA nao intercepta links

Sintoma: Links internos causam reload completo da pagina.
Causa: O chipak-router.js nao foi incluido, ou foi incluido antes do components.js.
Solucao: Incluir chipak-router.js como ultimo script externo, antes do script inline.

8.6. Toast nao aparece ou aparece cortado

Sintoma: Notificacoes de "Copiado!" nao aparecem, ou aparecem sem estilo.
Causa: Faltou o <div class="toast-container" id="toastContainer"></div> no HTML, ou faltou o CSS de .toast-container e .toast.
Solucao: Verificar ambos: o elemento no HTML e o CSS.

9. Checklist Final

Use esta lista para verificar cada pagina antes de considerar a conversao concluida.

Head

CSS (dentro do <style>)

HTML (body)

Scripts

Conteudo e SEO

Teste Final


Manual criado em Março 2026 — Chipak Tools
Referencia: /ferramenta/modelo.html | Exemplos convertidos: gerador-cpf.html, gerador-cnpj.html