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/.
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
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:
/* 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ável | Tipo | Uso | Fonte 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
No Google Fonts, escolha a nova fonte e copie o URL de importação.
Nos ficheiros HTML, substitua o link existente dentro da tag <head>:
<!-- Substituir o href abaixo pelo URL da nova fonte --> <link href="https://fonts.googleapis.com/css2?family=Playfair+Display..." rel="stylesheet" />
Em assets/css/style.css, actualize a variável:
--font-serif: 'Playfair Display', Georgia, serif;
Escala de tamanhos
05
Conteúdo das Páginas
index.html — secções e o que alterar
| Secção | O que editar | Localizaçã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.
<!-- 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
| Uso | Formato | Dimensões | Notas |
|---|---|---|---|
| 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
<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
<!-- 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-category | Botão de filtro |
|---|---|
todos | Todos (mostra tudo, não usar nos cards) |
beleza | Beleza |
gastronomia | Gastronomia |
arquitectura | Arquitectura |
juridico | Jurídico |
ecommerce | E-commerce |
hotelaria | Hotelaria |
saude | Saúde |
educacao | Educação |
fotografia | Fotografia |
financeiro | Financeiro |
imobiliaria | Imobiliá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:
<!-- 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
| # | Elemento | Localizaçã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
<!-- 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
<address class="footer__address"> O Alfaiate do Algoritmo<br /> Rua Alecrim, 26<br /> 2735-268 Rio de Mouro<br /> Sintra / Portugal </address>
Redes 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)
| Campo | Placeholder actual | Ficheiros |
|---|---|---|
| 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:
<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:
define('RESEND_API_KEY', 're_SUA_API_KEY_AQUI');
Verificar o domínio no Resend
Em resend.com → Domains → Add Domain, adicione oaa.pt.
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.
Em API Keys → Create API Key, gere a key e cole-a no config.php.
Alterar destinatário dos emails
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.