- "Ver Horário das aulas" desaparece assim que o acordeão abre (clique no
próprio botão ou o link "Horário" da navbar a abrir por JS) — deixa de
ficar um botão grande por cima da grelha já visível.
- Setas ‹ › junto ao dia em foco também no desktop (vista de 3 dias): só o
dia central as mostra, os laterais continuam sem elas (já são clicáveis
diretamente).
- Deslizar no telemóvel/tablet muda de dia, com o mesmo efeito das setas —
só reage a arrastos maioritariamente horizontais, para não roubar o
scroll vertical da página.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fecha o item 6.9 da auditoria (sem server-side/AJAX — todas as tabelas
estão bem abaixo de 60 linhas): ordenação, pesquisa, paginação, pt-PT
e Responsive (colapso em ecrãs estreitos), reaproveitando o botão
"Exportar CSV" já existente.
DataTables 2.3.4 + Responsive 3.0.6 vendorizados em
assets/vendor/datatables-2.3.4/ (mesma versão/decisão do hub.andmore.pt),
nunca de CDN. Tradução pt-PT oficial inline em assets/js/datatables-init.js,
que expõe initDataTable(selector, opts) — cada página dá um id estável à
tabela e marca a coluna de Ações como orderable:false/searchable:false.
Os vendor scripts só carregam nas 10 páginas que os usam (injeção dinâmica
depois do DOMContentLoaded, como o loader do Summernote), não no
header/footer partilhado.
views/admin/trials/index.php ficou de fora de propósito: cada linha tem
um <select> de estado e um <textarea> de notas editados in-line antes de
"Guardar" — um redraw da DataTable a meio dessa edição (ordenar, paginar)
arrisca perder ou baralhar o que ainda não foi submetido.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Sidebar do backoffice: Backups/Auditoria/IP bans/Geo/Origem das visitas/
Atualizações deixam de ser um link cada (enumerados à mão) e passam a um
só link "Sistema" para o índice partilhado do platform-tools
(platform.php?tool=index), como a fotografia/design/dance já fazem — uma
ferramenta nova no platform-tools passa a aparecer sozinha, sem link novo
a escrever aqui. Definições, Mensagens e Comunicações continuam com link
próprio (são páginas do fitme, não do router).
- Horário de Aulas (home e CrossFit, mesmo componente partilhado): a grelha
fica fechada por omissão atrás de um botão "Ver Horário das aulas"
(Bootstrap collapse); clicar em "Horário" na navbar (ou abrir a página já
com #horario no URL) abre-a de imediato em vez de só rolar até uma secção
fechada.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
O mapa deixa de ser um cartão comprimido dentro da coluna de Informações
(220px) e passa a ocupar a largura toda numa linha própria, por baixo da
grelha Informações + Formulário (480px, mesma altura do .map de outras
páginas). A coluna de Informações fica só com o texto (Localização,
Telefone, E-mail, Horário de Funcionamento).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Informações e contactos: os ícones fas ao lado do texto saem (desalinhavam
em layout centrado — fa-envelope é mais largo que os outros e o texto ficava
a começar em posições diferentes). Horário de Funcionamento deixa de ser
cartões (dt/dd com barra escura) e passa a texto simples centrado, uma
linha por dia, a condizer com o resto da coluna.
- Textarea "Mensagem" deixa de esticar até à base do mapa (chegava a 763px
de altura, vazio) — volta ao min-height:150px + resize:vertical do CSS.
- CrossFit: removida a secção "A nossa Localização" duplicada, agora que a
página tem a sua própria secção de Contactos com mapa incluído.
- Reviews: "Ver todas no Google" passa a link de texto simples (sublinhado);
"Deixa a tua review" mantém-se o botão em destaque.
- api/health.php, api/hub_ops.php, api/hub_pair.php: stubs de uma linha para
o platform-tools (mesmo padrão da fotografia/design/dance) — preparam a
entrada do fitme3070 na Frota do hub.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Horário de aulas (home e CrossFit, mesmo componente partilhado): removida
a barra de botões Seg/Ter/Qua/Qui/Sex/Sab acima da grelha — o próprio
cabeçalho do dia (já existente) passa a ser sempre visível (antes só em
desktop, 3 dias) e ganha setas ‹ › ao lado do nome do dia para mudar de
dia em ecrãs de telemóvel/tablet. No desktop (3 dias lado a lado) as
setas ficam escondidas — clicar no dia lateral já muda o dia em foco.
CSS/JS morto do botão-filtro removido.
- Informações e contactos extraído para site/includes/contactos.php,
partilhado pela home e pelo CrossFit — a página CrossFit ganha a mesma
secção de contactos (localização, telefone, e-mail, horário de
funcionamento, mapa, formulário) em vez de só linkar de volta à home.
Hero e restantes secções do CrossFit não foram tocados.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- .reviews-section deixa de repetir o fundo metálico escuro da secção de
mensalidades logo a seguir — passa a branca, restaurando a alternância de
fundos ao longo da página. Textos e o botão "Ver todas no Google"
recuperam as cores por omissão (escuras sobre branco); os cartões de
review mantêm o próprio fundo escuro.
- Horário de Funcionamento deixa de ser secção própria e passa a viver
dentro de "Informações" (Contactos), como mais um bloco de info, antes do
mapa.
- Ícones de Localização/Telefone/E-mail alinhados: fa-envelope é mais largo
que fa-map-marker-alt/fa-phone-volume, o que desalinhava o texto ao lado
(4.8px de deslocamento, medido no browser); os ícones ganham uma largura
fixa comum.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- migration_20260925_rgpd_requests.sql: tabela rgpd_requests (email, tipo,
estado, consentimento).
- config/functions_rgpd.php: rgpd_find() (acesso, art.º 15) e rgpd_erase()
(apagamento por anonimização, art.º 17) sobre membership_leads/trial_leads/
event_leads, + CRUD dos pedidos.
- Política de Privacidade: formulário público (POST + CSRF + anti-spam) para
pedir acesso ou apagamento, e o processo escrito (resposta em 30 dias).
- Backoffice: página "Pedidos RGPD" (nav + index) para exportar os dados de um
email (CSV, audit) ou anonimizá-los (POST + CSRF, audit).
O email está desligado, por isso os pedidos ficam guardados (como as leads),
não dependem de SMTP. Texto legal com placeholders — rever com jurista antes
do go-live (como já constava na Política).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Novo helper csv_export() (config/functions.php): CSV Excel-friendly (BOM UTF-8
+ ';') e cada exportação fica no audit_log (RGPD: exportar dados pessoais tem
de ser rastreável). Botão "Exportar CSV" em todas as listagens do backoffice:
equipa, eventos, galerias, ginásios, horário, mensalidades, modalidades,
horário de funcionamento e lixeira (pedidos de inscrição e aulas experimentais
já tinham). Fecha a metade "exportação com permissões e audit" do item 6.9
(a única parte que o relatório considera ganho real à escala atual).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
O diretório vendorizado incluía ficheiros de build/fonte que nunca são
carregados em runtime: js/, less/, scss/, metadata/, sprites/, svgs/, os
formatos de fonte não-woff2 (eot/svg/ttf/woff) e 13 folhas CSS redundantes.
Ficam só o que o site carrega de facto: css/all.css + 3 webfonts woff2
(solid/brands/regular). Sem alterar a fonte em si — nenhum ícone muda.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
As regras `.container>.row` e `.contact-form .row` usavam margem negativa de
-15px (herança do Bootstrap 4), mas o container do Bootstrap 5 tem padding de
12px — sobrava 3px de overflow horizontal a 375px (scrollWidth 378 vs 375).
Passaram a -0.75rem (o gutter real do BS5), anulando exatamente o padding.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Contraste (auditoria 4.8, WCAG AA):
- Novo token --fitme-accent-ink #667000 (≈5.1:1 sobre #F7F8FA), aplicado aos 7
usos de texto que estavam em --fitme-accent-dark (#A6B600 ≈2.1:1 em fundo claro).
O --fitme-accent-dark mantém-se para fundos de botões em hover/active (onde tem
texto escuro por cima — escurecê-lo quebraria esses estados).
- .section-eyebrow passa a usar o ink green nas secções claras (oferta, galeria,
modalidades, horário, workhours); as secções escuras mantêm o verde vivo.
Fontes (CSS "Google Fonts ainda carregado do CDN"):
- Roboto (variável, latin, 43 KB woff2) em site/assets/fonts/roboto/.
- @font-face 100-900 em style.css; removidos os <link> para fonts.googleapis.com
em include.php e gym_chooser.php. Ficam apenas os pedidos à API do Places
(legítimos, server-side).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>