feat(rgpd): política de privacidade e termos, mapa a pedido, fotos locais, retenção, tema claro/escuro
- Política de privacidade reescrita: tabela de dados/finalidades/fundamento (inclui os pedidos de aula, inscrição e eventos com IP), prazos concretos, subcontratantes, Google Maps e reviews, cookies. Termos e condições novos (/home/termos), no rodapé e no sitemap. Campos [ENTRE PARÊNTESES RETOS] e revisão por jurista pendentes antes de publicar no domínio real. - Google Maps só carrega ao carregar em «Mostrar mapa» (map_click_to_load); as fotos dos autores das reviews são guardadas pelo servidor em uploads/reviews/ e servidas localmente (review_avatar_url). - Retenção que a política declara, aplicada pelo cron (04:00): leads com mais de 12 meses → lixeira; blocked_submissions e outbox de segurança apagados aos 90 dias (trash_retention_sweep, auditado). - Backoffice e login com tema claro/escuro/automático: data-bs-theme aplicado no <head> antes do CSS (sem flash), escolha em localStorage, segue o sistema em tempo real, color-scheme e theme-color para os dois. Cores próprias passaram a variáveis do Bootstrap. lang="pt-PT". Testado numa cópia da BD de produção: 72/72 verificações. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
04c8c83e66
commit
b202262da0
16 files changed
+297
-34
No files matched your search
@@ -8,12 +8,26 @@
|
||||
$page_title = $page_title ?? 'Entrar';
|
||||
$app_name = defined('APP_NAME') ? APP_NAME : 'FitMe 3070';
|
||||
?><!doctype html>
|
||||
<html lang="pt">
|
||||
<html lang="pt-PT">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<title><?= htmlspecialchars($page_title) ?> — <?= htmlspecialchars($app_name) ?></title>
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<meta name="theme-color" content="#eef0f4" media="(prefers-color-scheme: light)">
|
||||
<meta name="theme-color" content="#0a0a0a" media="(prefers-color-scheme: dark)">
|
||||
<script>
|
||||
// Tema antes do CSS, para não piscar o tema errado. Escolha guardada no
|
||||
// navegador (claro / escuro / auto); auto segue o sistema operativo.
|
||||
(function () {
|
||||
var pref = 'auto';
|
||||
try { pref = localStorage.getItem('bo-theme') || 'auto'; } catch (e) {}
|
||||
var dark = pref === 'dark' || (pref === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
||||
document.documentElement.setAttribute('data-bs-theme', dark ? 'dark' : 'light');
|
||||
document.documentElement.setAttribute('data-theme-pref', pref);
|
||||
})();
|
||||
</script>
|
||||
<link href="<?= base_url('assets/vendor/bootstrap5/css/bootstrap.min.css') ?>" rel="stylesheet">
|
||||
<link href="<?= base_url('assets/vendor/bootstrap-icons/bootstrap-icons.css') ?>" rel="stylesheet">
|
||||
<style>
|
||||
@@ -32,7 +46,7 @@ $app_name = defined('APP_NAME') ? APP_NAME : 'FitMe 3070';
|
||||
}
|
||||
.auth-card {
|
||||
width: 100%; max-width: 420px;
|
||||
background: #fff; color: #0a0a0a;
|
||||
background: var(--bs-body-bg); color: var(--bs-body-color);
|
||||
border-radius: 14px; padding: 2rem;
|
||||
box-shadow: 0 18px 50px rgba(0,0,0,.45);
|
||||
}
|
||||
@@ -41,12 +55,13 @@ $app_name = defined('APP_NAME') ? APP_NAME : 'FitMe 3070';
|
||||
letter-spacing: .5px; margin-bottom: .25rem;
|
||||
}
|
||||
.auth-brand i { color: var(--bo-accent); }
|
||||
.auth-sub { text-align: center; color: #6c757d; font-size: .875rem; margin-bottom: 1.5rem; }
|
||||
.auth-sub { text-align: center; color: var(--bs-secondary-color); font-size: .875rem; margin-bottom: 1.5rem; }
|
||||
.btn-primary { background: var(--bo-accent); border-color: var(--bo-accent); color: var(--bo-dark); font-weight: 600; }
|
||||
.btn-primary:hover, .btn-primary:focus { background: #a8ba00; border-color: #a8ba00; color: var(--bo-dark); }
|
||||
.form-control:focus { border-color: var(--bo-accent); box-shadow: 0 0 0 .2rem rgba(var(--bo-accent-rgb), .25); }
|
||||
.auth-foot { color: #6c757d; }
|
||||
.auth-foot { color: var(--bs-secondary-color); }
|
||||
.auth-foot a, .auth-card a { color: #6a7a00; }
|
||||
[data-bs-theme="dark"] .auth-foot a, [data-bs-theme="dark"] .auth-card a { color: var(--bo-accent); }
|
||||
/* 16px inputs stop iOS from auto-zooming on focus */
|
||||
@media (max-width: 575.98px) { .form-control { font-size: 16px; } .auth-card { padding: 1.5rem; } }
|
||||
</style>
|
||||
|
||||
Reference in new issue
Block a user