Página inicial

Documentação técnica

Manual de
Personalização

11 secções · Guia completo Versão 1.0 — Março de 2026

Este manual descreve como personalizar cada aspecto do website. Todas as alterações de estilo são feitas em assets/css/style.css, os comportamentos interactivos em assets/js/main.js, e o conteúdo directamente nos ficheiros .html.

01

Estrutura de Ficheiros

Os ficheiros HTML principais ficam na raiz. As páginas de detalhe de cada template estão na pasta templates/. Os recursos estáticos ficam em assets/ e os handlers PHP em php/.

oaa-sintra/
├── index.html — página principal
├── catalogo.html — catálogo de templates
├── obrigado-contacto.html — sucesso formulário de contacto
├── obrigado-newsletter.html — sucesso subscrição newsletter
├── politica-privacidade.html — legal
├── termos-utilizacao.html — legal
├── cookies.html — legal
├── manual.html — este ficheiro
├── templates/ — páginas de detalhe dos templates
    ├── template-aurelia.html
    ├── template-strutur.html
    ├── template-travesseiro.html
    ├── template-heritage.html
    ├── template-ritual-studio.html
    ├── template-mesa-terroir.html
    ├── template-atelier-vao.html
    ├── template-advocatia.html
    ├── template-volt-leather.html
    ├── template-palacio-digital.html
    ├── template-clinica-viva.html
    ├── template-scriptorium.html
    └── template-olhar.html
├── assets/
    ├── css/
        └── style.css — folha de estilos master
    ├── js/
        └── main.js — cursor, scroll, animações
    └── img/ — imagens dos templates
├── php/
    ├── contact.php — handler formulário de contacto
    ├── newsletter.php — handler subscrição newsletter
    ├── config.php — API key Resend, emails, rate limiting
    └── helpers.php — resend_send(), rate limiting, etc.
└── data/ — newsletter.csv, ficheiros de rate limit

Os ficheiros dentro de templates/ usam caminhos relativos com ../ para referenciar assets/, php/ e as páginas na raiz (ex: ../index.html, ../catalogo.html).

02

Sistema de Design — Tokens CSS

Toda a aparência do site é controlada por variáveis CSS definidas no bloco :root no início de assets/css/style.css. Alterar um token actualiza automaticamente todos os elementos que o usam — nunca é necessário procurar valores dispersos pelo ficheiro.

Grupo Variáveis Uso
Cores --color-* Paleta completa — fundos, texto, acentos, bordas
Tipografia --font-serif, --font-sans Famílias de tipo usadas em todo o site
Tamanhos --text-xs--text-5xl Escala tipográfica — 11 px a 88 px
Espaçamento --space-section, --space-gap Padding vertical das secções e gutter interno
Movimento --duration-*, --ease-* Velocidade e curva das transições e animações
Navbar --navbar-height Altura fixa da barra de navegação (72 px)

03

Paleta de Cores

O conceito Silent Luxury assenta numa paleta neutra e quente, com dois acentos cromáticos — musgo e bronze. Para alterar a paleta, edite apenas as variáveis em :root.

Cores actuais

Fundo principal
--color-bg · #F9F8F5
Fundo quente
--color-bg-warm · #F4F2EE
Texto principal
--color-text · #2C302E
Texto suave
--color-text-muted · #7A7D7B
Musgo (acento)
--color-moss · #4A5C4E
Musgo escuro
--color-moss-dark · #354039
Bronze (acento)
--color-bronze · #8B7355
Borda
--color-border · #E3E1DB

Como alterar uma cor

Abra assets/css/style.css e localize o bloco :root no início do ficheiro (linha 10). Substitua o valor hexadecimal:

assets/css/style.css — :root
/* Exemplo: mudar o acento musgo de verde para azul profundo */
:root {
  --color-moss:      #2A4A6B; /* era #4A5C4E */
  --color-moss-dark: #1C3348; /* era #354039 */
}

Atenção: altere sempre o par --color-moss + --color-moss-dark em conjunto. O tom escuro é usado nos estados hover e nos textos de ênfase.

04

Tipografia

Famílias de tipo

O site usa duas famílias carregadas via Google Fonts — uma serifada para títulos, outra sem serifas para corpo de texto.

VariávelTipoUsoFonte actual
--font-serif Serifada Títulos, nome da marca, preços, citações Cormorant Garamond
--font-sans Sem serifa Corpo de texto, labels, navegação, botões Montserrat 300

Substituir a fonte serifada

1

No Google Fonts, escolha a nova fonte e copie o URL de importação.

2

Nos ficheiros HTML, substitua o link existente dentro da tag <head>:

qualquer .html — <head>
<!-- Substituir o href abaixo pelo URL da nova fonte -->
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display..."
      rel="stylesheet" />
3

Em assets/css/style.css, actualize a variável:

assets/css/style.css — :root
--font-serif: 'Playfair Display', Georgia, serif;

Escala de tamanhos

--text-xs 11px Labels, caps, datas, tags
--text-sm 13px Corpo de texto, parágrafos
--text-base 15px Tamanho base do body
--text-lg 20px Nome da marca, sub-títulos pequenos
--text-xl 26px Títulos de card, H3
--text-2xl 36px Títulos de secção
--text-3xl 48px Página legal / hero
--text-5xl 88px Hero principal

05

Conteúdo das Páginas

index.html — secções e o que alterar

SecçãoO que editarLocalização no HTML
Hero Título principal, subtítulo, texto do botão CTA <section id="inicio">
Sobre Texto descritivo, valores nos 3 contadores de estatísticas <section id="sobre">
Serviços 4 cards — título, descrição e ícone de cada serviço <section id="servicos">
Processo 4 passos da timeline — número, título, descrição <section id="processo">
Templates 6 cards em destaque — imagem placeholder, tag, título, preço <section id="templates">
Testemunho Citação, nome e cargo do cliente <section class="testimonial">
Contacto Texto do CTA escuro, email e telefone de contacto <section id="contatos">

Alterar ícones (Lucide)

Os ícones são carregados via Lucide Icons. Para trocar um ícone, altere o atributo data-lucide pelo nome do ícone desejado. Consulte o catálogo completo em lucide.dev/icons.

exemplo — trocar ícone
<!-- Era "globe", passou a "layout-dashboard" -->
<i data-lucide="layout-dashboard"
   width="20" height="20"
   stroke-width="1"></i>

Mantenha sempre stroke-width="1" a 1.5" para preservar a estética de linha fina do conceito Silent Luxury. Valores acima de 1.5 ficam visualmente pesados.

06

Imagens dos Templates

Todas as imagens são colocadas em assets/img/. Cada template tem 3 imagens numeradas (ex: ritual1.jpg, ritual2.jpg, ritual3.jpg) usadas no card do catálogo, no carousel da página de detalhe e nos cards "Outros templates".

Formato e dimensões recomendados

UsoFormatoDimensõesNotas
Card do catálogo (imagem 1) JPG / PNG 1920 × 1280 px Rácio 3:2 — object-position: top
Carousel da página de detalhe JPG / PNG 1920 × 1280 px 3 imagens por template — mesmo rácio 3:2
Cards "Outros templates" JPG / PNG 1920 × 1280 px Mesma imagem 1 do catálogo

Estrutura do card com imagem real

catalogo.html — thumb do card
<div class="template-card__thumb">
  <a href="templates/template-ritual-studio.html"
     tabindex="-1" aria-hidden="true">
    <img src="assets/img/ritual1.jpg"
         alt="Ritual Studio — template de beleza e bem-estar"
         loading="lazy" />
  </a>
</div>

Nas páginas de detalhe (templates/), o caminho da imagem usa prefixo ../: ../assets/img/ritual1.jpg.

07

Catálogo — Adicionar um Novo Template

O catálogo (catalogo.html) usa um sistema de filtros baseado no atributo data-category. Para adicionar um novo template, copie e cole um bloco de card existente e actualize os valores.

Estrutura de um card

catalogo.html — card completo
<!-- O data-category define a qual filtro este card pertence -->
<div class="col-md-6 col-lg-4"
     data-category="restaurante">   <!-- ① categoria -->
  <article class="template-card reveal">
    <div class="template-card__image">
      <img src="assets/img/nome-template.webp"  <!-- ② imagem -->
           alt="Template Nome — preview"
           loading="lazy"
           width="800" height="540" />
    </div>
    <div class="template-card__body">
      <p class="template-card__tag">Restaurante</p>  <!-- ③ tag -->
      <h3 class="template-card__title">Mesa do Chef</h3>  <!-- ④ título -->
      <p class="template-card__desc">
        Descrição breve do template, 1 a 2 linhas.  <!-- ⑤ descrição -->
      </p>
      <div class="template-card__footer">
        <span class="template-card__price">€ 290</span>  <!-- ⑥ preço -->
        <a href="template-detalhe.html"
           class="btn-oaa-ghost btn-oaa--sm">Saber mais</a>
      </div>
    </div>
  </article>
</div>

Categorias disponíveis

Valor do data-categoryBotão de filtro
todosTodos (mostra tudo, não usar nos cards)
belezaBeleza
gastronomiaGastronomia
arquitecturaArquitectura
juridicoJurídico
ecommerceE-commerce
hotelariaHotelaria
saudeSaúde
educacaoEducação
fotografiaFotografia
financeiroFinanceiro
imobiliariaImobiliária

Para adicionar uma nova categoria, adicione um botão de filtro na barra de filtros do catálogo e atribua o novo valor nos cards respectivos:

catalogo.html — barra de filtros
<!-- Adicionar este botão junto aos outros filtros -->
<button class="catalog-filter__btn"
        data-filter="hotelaria">Hotelaria</button>

08

Página de Detalhe do Template

O ficheiro template-detalhe.html serve de base para todos os templates. Cada template deve ter a sua própria cópia desta página (ex: ritual-studio.html, mesa-do-chef.html).

O que actualizar em cada cópia

#ElementoLocalização
1 <title> e <meta description> Cabeçalho <head>
2 Tag de categoria, título do template, descrição Hero section
3 Preço (hero + sidebar card) .detail-hero__price e .detail-sidebar
4 Carousel com 3 imagens e URL do browser bar .detail-carousel-wrap — atributo id único por template
5 Lista "O que inclui" .include-item
6 Tabela de especificações .spec-row
7 3 cards de templates relacionados Secção "Outros Templates"

Ligar o card do catálogo à página correcta

catalogo.html — href do botão
<!-- Actualizar href para o ficheiro de detalhe específico -->
<a href="ritual-studio.html"
   class="btn-oaa-ghost btn-oaa--sm">Saber mais</a>

09

Rodapé e Contactos

O rodapé é repetido em todos os ficheiros HTML. Qualquer alteração deve ser aplicada em todos os ficheiros: index.html, catalogo.html, template-detalhe.html, politica-privacidade.html, termos-utilizacao.html, cookies.html.

Dica: numa fase futura, o rodapé pode ser transformado num componente incluído via server-side (PHP include, templates Twig, etc.) para evitar a duplicação.

Morada

todos os .html — coluna Localização
<address class="footer__address">
  O Alfaiate do Algoritmo<br />
  Rua Alecrim, 26<br />
  2735-268 Rio de Mouro<br />
  Sintra / Portugal
</address>

Redes sociais

todos os .html — links sociais
<a href="https://www.linkedin.com/company/oaa-webdesign"
   class="footer__social-link" aria-label="LinkedIn"
   target="_blank" rel="noopener">...</a>

<a href="https://www.facebook.com/oalfaiatedoalgoritmo"
   class="footer__social-link" aria-label="Facebook"
   target="_blank" rel="noopener">...</a>

<a href="https://wa.me/351937177802"
   class="footer__social-link" aria-label="WhatsApp"
   target="_blank" rel="noopener">...</a>

10

Páginas Legais

As três páginas legais contêm dados que precisam de ser preenchidos com informação real antes de o site entrar em produção.

Campos em falta (placeholders)

CampoPlaceholder actualFicheiros
NIF [a preencher] politica-privacidade.html, termos-utilizacao.html
Email privacidade privacidade@alfaitedoalgoritmo.pt politica-privacidade.html, cookies.html
Email geral / contacto geral@alfaitedoalgoritmo.pt termos-utilizacao.html

Datas das políticas

Sempre que actualizar o conteúdo de uma página legal, actualize também a data de "Última actualização" no hero da respectiva página:

politica-privacidade.html — data
<span>
  <i data-lucide="calendar"...></i>
  Última actualização: 20 de Março de 2026  <!-- ← actualizar -->
</span>

As páginas legais têm <meta name="robots" content="noindex, follow"> para não serem indexadas pelos motores de busca. Mantenha esta directiva em todos os ficheiros legais, incluindo este manual.

11

Formulários e Envio de Email

Os formulários de contacto e newsletter enviam email via Resend (resend.com), um serviço transaccional externo. O envio usa a API REST do Resend por cURL — sem dependências externas ou Composer.

Configurar a API Key

A API key é guardada em php/config.php. Após criar conta no Resend e verificar o domínio oaa.pt, substitua o valor:

php/config.php
define('RESEND_API_KEY', 're_SUA_API_KEY_AQUI');

Verificar o domínio no Resend

1

Em resend.com → Domains → Add Domain, adicione oaa.pt.

2

Adicione os registos DNS indicados pelo Resend (DKIM + SPF). Estes registos coexistem com os do Microsoft 365 sem conflito — não é necessário alterar os registos existentes do M365.

3

Em API Keys → Create API Key, gere a key e cole-a no config.php.

Alterar destinatário dos emails

php/config.php — destinos de email
define('MAIL_TO',        'orcamentos@oaa.pt');  // recebe os contactos
define('MAIL_REPLY_TO',  'farc@oaa.pt');         // reply-to nas newsletters
define('MAIL_FROM_ADDR', 'noreply@oaa.pt');      // remetente (domínio verificado)

O formulário de contacto só redireciona para obrigado-contacto.html se o Resend confirmar o envio (HTTP 200). Em caso de erro, a mensagem é apresentada inline sem abandonar a página. A newsletter redireciona para obrigado-newsletter.html assim que o email é registado no CSV — independentemente do envio da notificação.