chore(tenants): conteudo de publico/ atualizado

This commit is contained in:
deploy
2026-10-13 15:34:52 +00:00
parent 86e375e467
commit cef90bc062
20 changed files with 24146 additions and 664 deletions
+3
View File
@@ -142,6 +142,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
+190 -4
View File
@@ -696,6 +696,191 @@ data:
global.AtmDesafio = { resolver: resolver };
})(window);
excluir-conta.css: |
/* Formulário de /excluir-conta. Arquivo próprio: a CSP da página não aceita atributo style="..." nem <style>. */
.sem-margem { margin-top: 0; }
form#pedido { background: #fff; border: 1px solid var(--line); border-radius: 10px; padding: 1.2rem; margin: 1.2rem 0; }
form#pedido label { display: block; font-weight: 600; margin: 1rem 0 .3rem; }
form#pedido label:first-child { margin-top: 0; }
form#pedido input, form#pedido select, form#pedido textarea {
width: 100%; padding: .6rem .7rem; border: 1px solid #b9c2c8; border-radius: 6px;
font: inherit; color: var(--navy); background: #fff;
}
form#pedido input:focus, form#pedido select:focus, form#pedido textarea:focus {
outline: 3px solid rgba(245, 130, 32, .35); border-color: var(--orange);
}
form#pedido button {
margin-top: 1.2rem; padding: .7rem 1.4rem; border: 0; border-radius: 6px; background: var(--orange); color: #fff;
font: inherit; font-weight: 700; cursor: pointer;
}
form#pedido button[disabled] { opacity: .6; cursor: default; }
#resposta { margin: 1rem 0 0; font-weight: 600; }
#resposta.ok { color: #1b6e3c; }
#resposta.erro { color: #b3261e; }
/* Fora da tela, e não display:none: alguns robôs ignoram campo que não renderiza. */
.isca { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
excluir-conta.html: |
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Exclusão de conta e de dados — Athletic Map</title>
<link rel="stylesheet" href="/publico/_estilo.css">
<link rel="stylesheet" href="/publico/excluir-conta.css">
</head>
<body>
<header><div class="marca">/// Athletic <span>Map</span></div></header>
<main>
<div class="minuta">
<strong>⚠️ MINUTA — não publicar nesta forma.</strong>
Este texto ainda <b>não passou por revisão jurídica</b>. Remover este aviso é parte da publicação, não antes dela.
</div>
<h1>Exclusão de conta e de dados</h1>
<p class="data">Para pais, responsáveis, alunos, atletas e funcionários de escolas que usam o Athletic Map. Não precisa de login.</p>
<div class="destaque">
<h3 class="sem-margem">Quem decide sobre os seus dados é a escola</h3>
<p>A escola onde você ou seu filho treina é a <i>controladora</i> dos dados; a Athletic Map é a <i>operadora</i> e
segue as instruções dela. Por isso, <b>o seu pedido é encaminhado à escola</b>, que decide e nos pede a exclusão.
Você recebe a resposta no e-mail que informar, <b>em até 15 dias</b>.</p>
</div>
<h2>Como pedir</h2>
<p>De um dos dois jeitos — o resultado é o mesmo:</p>
<ul>
<li><b>Pelo formulário abaixo.</b></li>
<li><b>Por e-mail</b>, para <a href="mailto:suporte@athleticmap.com">suporte@athleticmap.com</a>, informando seu nome,
o nome da escola e o que você quer (excluir a conta e os dados, acessar ou corrigir).</li>
</ul>
<form id="pedido" novalidate>
<label for="tipo">O que você quer?</label>
<select id="tipo" name="tipo" required>
<option value="EXCLUSAO">Excluir a minha conta e os meus dados</option>
<option value="ACESSO">Saber quais dados vocês têm sobre mim</option>
<option value="CORRECAO">Corrigir dados</option>
<option value="OUTRO">Outro pedido sobre dados pessoais</option>
</select>
<label for="nome">Seu nome</label>
<input id="nome" name="nome" type="text" autocomplete="name" maxlength="120" required>
<label for="email">Seu e-mail (a resposta chega aqui)</label>
<input id="email" name="email" type="email" autocomplete="email" maxlength="200" required>
<label for="escola">Nome da escola (se souber)</label>
<input id="escola" name="escola" type="text" maxlength="160">
<label for="mensagem">Detalhes (opcional)</label>
<textarea id="mensagem" name="mensagem" rows="4" maxlength="2000"></textarea>
<!-- Campo-isca: pessoas não o veem; robôs costumam preenchê-lo. Preenchido, o pedido é descartado em silêncio. -->
<div class="isca" aria-hidden="true">
<label for="site">Não preencha</label>
<input id="site" name="site" type="text" tabindex="-1" autocomplete="off">
</div>
<button type="submit" id="enviar">Enviar pedido</button>
<p id="resposta" role="status" aria-live="polite"></p>
</form>
<p>Por segurança, a resposta desta página é a mesma para qualquer e-mail: ela não confirma se o endereço está ou não
cadastrado em alguma escola.</p>
<h2>O que é apagado e o que fica</h2>
<ul>
<li><b>Apagamos</b> os dados do aluno e do responsável que a escola mandar excluir: cadastro, fichas, registros de
treino e de saúde, documentos e acessos ao sistema e aos aplicativos.</li>
<li><b>Pode ficar, por obrigação legal</b>, o que a lei manda guardar — como os registros de cobrança e de notas
fiscais — e o mínimo necessário para provar o cumprimento do seu pedido.</li>
<li><b>Cópias de segurança</b> (backups) deixam de conter os dados em até <b>7 dias</b> depois da exclusão.</li>
</ul>
<h2>Prazos</h2>
<p>Respondemos em até <b>15 dias</b> (art. 19, II da LGPD). Para falar do pedido, escreva para
<a href="mailto:suporte@athleticmap.com">suporte@athleticmap.com</a>. O Encarregado pelo tratamento de dados é
Carlos Oliveira, e este é o canal dele — veja a <a href="/privacidade">Política de Privacidade</a>.</p>
<footer>
<p>Athletic Map · <a href="/privacidade">Política de Privacidade</a> · <a href="/termos">Termos de Uso</a></p>
</footer>
</main>
<script src="/publico/excluir-conta.js"></script>
</body>
</html>
excluir-conta.js: |
/* Pedido de exclusão de conta e de dados (/excluir-conta). Sem biblioteca, sem terceiro: manda o formulário ao
servidor da própria Athletic Map (POST /api/public/privacidade/pedidos) e mostra a resposta, que é a mesma para
qualquer e-mail — a página nunca diz se o endereço está cadastrado. */
(function () {
"use strict";
var API = "/api/public/privacidade/pedidos";
var EMAIL = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
function mostrar(resposta, texto, ok) {
resposta.textContent = texto;
resposta.className = ok ? "ok" : "erro";
}
/* Valida o que dá para validar sem o servidor. Devolve a mensagem de erro, ou "" se está certo. */
function conferir(v) {
if (!v.nome || v.nome.trim().length < 2) return "Digite o seu nome.";
if (!EMAIL.test((v.email || "").trim())) return "Digite um e-mail válido.";
return "";
}
function ler(f) {
function v(id) { return document.getElementById(id).value; }
return { tipo: v("tipo"), nome: v("nome"), email: v("email"), escola: v("escola"), mensagem: v("mensagem"), site: v("site") };
}
function iniciar() {
var f = document.getElementById("pedido");
if (!f) return;
var resposta = document.getElementById("resposta");
var botao = document.getElementById("enviar");
f.addEventListener("submit", function (e) {
e.preventDefault();
var pedido = ler(f);
var erro = conferir(pedido);
if (erro) { mostrar(resposta, erro, false); return; }
botao.disabled = true;
mostrar(resposta, "Enviando…", true);
fetch(API, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(pedido)
}).then(function (r) {
return r.json().catch(function () { return {}; }).then(function (corpo) { return { status: r.status, corpo: corpo }; });
}).then(function (r) {
if (r.status === 202) {
f.reset();
mostrar(resposta, r.corpo.detail || "Recebemos o seu pedido.", true);
} else {
mostrar(resposta, r.corpo.detail || "Não foi possível enviar agora. Escreva para suporte@athleticmap.com.", false);
}
}).catch(function () {
mostrar(resposta, "Sem conexão com o servidor. Tente de novo ou escreva para suporte@athleticmap.com.", false);
}).then(function () { botao.disabled = false; });
});
}
if (typeof module !== "undefined" && module.exports) {
module.exports = { conferir: conferir, ler: ler, iniciar: iniciar };
}
if (typeof document !== "undefined") {
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", iniciar);
else iniciar();
}
})();
fontes--fontes.css: |
/* ============================================================
* As fontes da landing page, servidas POR NOS.
@@ -7785,8 +7970,8 @@ data:
<tr><th>Quem</th><th>Para quê</th><th>O que recebe</th><th>Onde fica</th></tr>
<tr><td><b>Asaas</b></td><td>Cobrar a mensalidade e emitir nota fiscal</td>
<td>Nome, CPF, e-mail e valor de quem paga</td><td>Brasil</td></tr>
<tr><td>⟨provedor de hospedagem⟩</td><td>Servidores onde o sistema roda</td>
<td>Os dados, em repouso</td><td>⟨país⟩</td></tr>
<tr><td><b>Hostinger International Limited</b></td><td>Servidores onde o sistema roda</td>
<td>Os dados, em repouso</td><td>Brasil</td></tr>
<tr><td><b>Garmin</b></td><td>Importar atividade e sono — <b>só se você conectar
seu dispositivo</b></td><td>Identificador na Garmin, atividade, sono</td>
<td><b>Estados Unidos</b></td></tr>
@@ -7854,11 +8039,12 @@ data:
<table>
<tr><th>Campo</th><th>Valor</th></tr>
<tr><td>Nome do Encarregado</td><td>Carlos Oliveira</td></tr>
<tr><td>E-mail do canal</td><td><a href="mailto:carlos.oliveira@athleticmap.com">carlos.oliveira@athleticmap.com</a></td></tr>
<tr><td>E-mail do canal</td><td><a href="mailto:suporte@athleticmap.com">suporte@athleticmap.com</a></td></tr>
<tr><td>Endereço para correspondência</td><td>⟨opcional, mas recomendado⟩</td></tr>
<tr><td>Prazo de resposta declarado</td><td>15 dias (art. 19, II)</td></tr>
</table>
<p style="margin-bottom:0">Ver <code>docs/juridico/ato-de-nomeacao-encarregado.md</code>.</p>
<p>Para pedir a exclusão da conta e dos dados, ou exercer outro direito, use a página <a href="/excluir-conta">Exclusão de conta e de dados</a> ou escreva para o e-mail do canal.</p>
<p>Ver <code>docs/juridico/ato-de-nomeacao-encarregado.md</code>.</p>
</div>
<h2>10. Mudanças nesta política</h2>
+6
View File
@@ -132,6 +132,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -139,6 +142,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
+6
View File
@@ -132,6 +132,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -139,6 +142,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
@@ -141,6 +141,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -148,6 +151,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
@@ -141,6 +141,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -148,6 +151,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
+6
View File
@@ -132,6 +132,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -139,6 +142,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
+6
View File
@@ -132,6 +132,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -139,6 +142,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
+3
View File
@@ -129,6 +129,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
+190 -4
View File
@@ -696,6 +696,191 @@ data:
global.AtmDesafio = { resolver: resolver };
})(window);
excluir-conta.css: |
/* Formulário de /excluir-conta. Arquivo próprio: a CSP da página não aceita atributo style="..." nem <style>. */
.sem-margem { margin-top: 0; }
form#pedido { background: #fff; border: 1px solid var(--line); border-radius: 10px; padding: 1.2rem; margin: 1.2rem 0; }
form#pedido label { display: block; font-weight: 600; margin: 1rem 0 .3rem; }
form#pedido label:first-child { margin-top: 0; }
form#pedido input, form#pedido select, form#pedido textarea {
width: 100%; padding: .6rem .7rem; border: 1px solid #b9c2c8; border-radius: 6px;
font: inherit; color: var(--navy); background: #fff;
}
form#pedido input:focus, form#pedido select:focus, form#pedido textarea:focus {
outline: 3px solid rgba(245, 130, 32, .35); border-color: var(--orange);
}
form#pedido button {
margin-top: 1.2rem; padding: .7rem 1.4rem; border: 0; border-radius: 6px; background: var(--orange); color: #fff;
font: inherit; font-weight: 700; cursor: pointer;
}
form#pedido button[disabled] { opacity: .6; cursor: default; }
#resposta { margin: 1rem 0 0; font-weight: 600; }
#resposta.ok { color: #1b6e3c; }
#resposta.erro { color: #b3261e; }
/* Fora da tela, e não display:none: alguns robôs ignoram campo que não renderiza. */
.isca { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
excluir-conta.html: |
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Exclusão de conta e de dados — Athletic Map</title>
<link rel="stylesheet" href="/publico/_estilo.css">
<link rel="stylesheet" href="/publico/excluir-conta.css">
</head>
<body>
<header><div class="marca">/// Athletic <span>Map</span></div></header>
<main>
<div class="minuta">
<strong>⚠️ MINUTA — não publicar nesta forma.</strong>
Este texto ainda <b>não passou por revisão jurídica</b>. Remover este aviso é parte da publicação, não antes dela.
</div>
<h1>Exclusão de conta e de dados</h1>
<p class="data">Para pais, responsáveis, alunos, atletas e funcionários de escolas que usam o Athletic Map. Não precisa de login.</p>
<div class="destaque">
<h3 class="sem-margem">Quem decide sobre os seus dados é a escola</h3>
<p>A escola onde você ou seu filho treina é a <i>controladora</i> dos dados; a Athletic Map é a <i>operadora</i> e
segue as instruções dela. Por isso, <b>o seu pedido é encaminhado à escola</b>, que decide e nos pede a exclusão.
Você recebe a resposta no e-mail que informar, <b>em até 15 dias</b>.</p>
</div>
<h2>Como pedir</h2>
<p>De um dos dois jeitos — o resultado é o mesmo:</p>
<ul>
<li><b>Pelo formulário abaixo.</b></li>
<li><b>Por e-mail</b>, para <a href="mailto:suporte@athleticmap.com">suporte@athleticmap.com</a>, informando seu nome,
o nome da escola e o que você quer (excluir a conta e os dados, acessar ou corrigir).</li>
</ul>
<form id="pedido" novalidate>
<label for="tipo">O que você quer?</label>
<select id="tipo" name="tipo" required>
<option value="EXCLUSAO">Excluir a minha conta e os meus dados</option>
<option value="ACESSO">Saber quais dados vocês têm sobre mim</option>
<option value="CORRECAO">Corrigir dados</option>
<option value="OUTRO">Outro pedido sobre dados pessoais</option>
</select>
<label for="nome">Seu nome</label>
<input id="nome" name="nome" type="text" autocomplete="name" maxlength="120" required>
<label for="email">Seu e-mail (a resposta chega aqui)</label>
<input id="email" name="email" type="email" autocomplete="email" maxlength="200" required>
<label for="escola">Nome da escola (se souber)</label>
<input id="escola" name="escola" type="text" maxlength="160">
<label for="mensagem">Detalhes (opcional)</label>
<textarea id="mensagem" name="mensagem" rows="4" maxlength="2000"></textarea>
<!-- Campo-isca: pessoas não o veem; robôs costumam preenchê-lo. Preenchido, o pedido é descartado em silêncio. -->
<div class="isca" aria-hidden="true">
<label for="site">Não preencha</label>
<input id="site" name="site" type="text" tabindex="-1" autocomplete="off">
</div>
<button type="submit" id="enviar">Enviar pedido</button>
<p id="resposta" role="status" aria-live="polite"></p>
</form>
<p>Por segurança, a resposta desta página é a mesma para qualquer e-mail: ela não confirma se o endereço está ou não
cadastrado em alguma escola.</p>
<h2>O que é apagado e o que fica</h2>
<ul>
<li><b>Apagamos</b> os dados do aluno e do responsável que a escola mandar excluir: cadastro, fichas, registros de
treino e de saúde, documentos e acessos ao sistema e aos aplicativos.</li>
<li><b>Pode ficar, por obrigação legal</b>, o que a lei manda guardar — como os registros de cobrança e de notas
fiscais — e o mínimo necessário para provar o cumprimento do seu pedido.</li>
<li><b>Cópias de segurança</b> (backups) deixam de conter os dados em até <b>7 dias</b> depois da exclusão.</li>
</ul>
<h2>Prazos</h2>
<p>Respondemos em até <b>15 dias</b> (art. 19, II da LGPD). Para falar do pedido, escreva para
<a href="mailto:suporte@athleticmap.com">suporte@athleticmap.com</a>. O Encarregado pelo tratamento de dados é
Carlos Oliveira, e este é o canal dele — veja a <a href="/privacidade">Política de Privacidade</a>.</p>
<footer>
<p>Athletic Map · <a href="/privacidade">Política de Privacidade</a> · <a href="/termos">Termos de Uso</a></p>
</footer>
</main>
<script src="/publico/excluir-conta.js"></script>
</body>
</html>
excluir-conta.js: |
/* Pedido de exclusão de conta e de dados (/excluir-conta). Sem biblioteca, sem terceiro: manda o formulário ao
servidor da própria Athletic Map (POST /api/public/privacidade/pedidos) e mostra a resposta, que é a mesma para
qualquer e-mail — a página nunca diz se o endereço está cadastrado. */
(function () {
"use strict";
var API = "/api/public/privacidade/pedidos";
var EMAIL = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
function mostrar(resposta, texto, ok) {
resposta.textContent = texto;
resposta.className = ok ? "ok" : "erro";
}
/* Valida o que dá para validar sem o servidor. Devolve a mensagem de erro, ou "" se está certo. */
function conferir(v) {
if (!v.nome || v.nome.trim().length < 2) return "Digite o seu nome.";
if (!EMAIL.test((v.email || "").trim())) return "Digite um e-mail válido.";
return "";
}
function ler(f) {
function v(id) { return document.getElementById(id).value; }
return { tipo: v("tipo"), nome: v("nome"), email: v("email"), escola: v("escola"), mensagem: v("mensagem"), site: v("site") };
}
function iniciar() {
var f = document.getElementById("pedido");
if (!f) return;
var resposta = document.getElementById("resposta");
var botao = document.getElementById("enviar");
f.addEventListener("submit", function (e) {
e.preventDefault();
var pedido = ler(f);
var erro = conferir(pedido);
if (erro) { mostrar(resposta, erro, false); return; }
botao.disabled = true;
mostrar(resposta, "Enviando…", true);
fetch(API, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(pedido)
}).then(function (r) {
return r.json().catch(function () { return {}; }).then(function (corpo) { return { status: r.status, corpo: corpo }; });
}).then(function (r) {
if (r.status === 202) {
f.reset();
mostrar(resposta, r.corpo.detail || "Recebemos o seu pedido.", true);
} else {
mostrar(resposta, r.corpo.detail || "Não foi possível enviar agora. Escreva para suporte@athleticmap.com.", false);
}
}).catch(function () {
mostrar(resposta, "Sem conexão com o servidor. Tente de novo ou escreva para suporte@athleticmap.com.", false);
}).then(function () { botao.disabled = false; });
});
}
if (typeof module !== "undefined" && module.exports) {
module.exports = { conferir: conferir, ler: ler, iniciar: iniciar };
}
if (typeof document !== "undefined") {
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", iniciar);
else iniciar();
}
})();
fontes--fontes.css: |
/* ============================================================
* As fontes da landing page, servidas POR NOS.
@@ -7785,8 +7970,8 @@ data:
<tr><th>Quem</th><th>Para quê</th><th>O que recebe</th><th>Onde fica</th></tr>
<tr><td><b>Asaas</b></td><td>Cobrar a mensalidade e emitir nota fiscal</td>
<td>Nome, CPF, e-mail e valor de quem paga</td><td>Brasil</td></tr>
<tr><td>⟨provedor de hospedagem⟩</td><td>Servidores onde o sistema roda</td>
<td>Os dados, em repouso</td><td>⟨país⟩</td></tr>
<tr><td><b>Hostinger International Limited</b></td><td>Servidores onde o sistema roda</td>
<td>Os dados, em repouso</td><td>Brasil</td></tr>
<tr><td><b>Garmin</b></td><td>Importar atividade e sono — <b>só se você conectar
seu dispositivo</b></td><td>Identificador na Garmin, atividade, sono</td>
<td><b>Estados Unidos</b></td></tr>
@@ -7854,11 +8039,12 @@ data:
<table>
<tr><th>Campo</th><th>Valor</th></tr>
<tr><td>Nome do Encarregado</td><td>Carlos Oliveira</td></tr>
<tr><td>E-mail do canal</td><td><a href="mailto:carlos.oliveira@athleticmap.com">carlos.oliveira@athleticmap.com</a></td></tr>
<tr><td>E-mail do canal</td><td><a href="mailto:suporte@athleticmap.com">suporte@athleticmap.com</a></td></tr>
<tr><td>Endereço para correspondência</td><td>⟨opcional, mas recomendado⟩</td></tr>
<tr><td>Prazo de resposta declarado</td><td>15 dias (art. 19, II)</td></tr>
</table>
<p style="margin-bottom:0">Ver <code>docs/juridico/ato-de-nomeacao-encarregado.md</code>.</p>
<p>Para pedir a exclusão da conta e dos dados, ou exercer outro direito, use a página <a href="/excluir-conta">Exclusão de conta e de dados</a> ou escreva para o e-mail do canal.</p>
<p>Ver <code>docs/juridico/ato-de-nomeacao-encarregado.md</code>.</p>
</div>
<h2>10. Mudanças nesta política</h2>
+6
View File
@@ -141,6 +141,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -148,6 +151,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff
+6
View File
@@ -141,6 +141,9 @@ spec:
- { key: "convite.html", path: "convite.html" }
- { key: "convite.js", path: "convite.js" }
- { key: "desafio.js", path: "desafio.js" }
- { key: "excluir-conta.css", path: "excluir-conta.css" }
- { key: "excluir-conta.html", path: "excluir-conta.html" }
- { key: "excluir-conta.js", path: "excluir-conta.js" }
- { key: "fontes--fontes.css", path: "fontes/fontes.css" }
- { key: "lp-escolinhas.css", path: "lp-escolinhas.css" }
- { key: "lp-escolinhas.html", path: "lp-escolinhas.html" }
@@ -148,6 +151,9 @@ spec:
- { key: "minha-conta.css", path: "minha-conta.css" }
- { key: "minha-conta.html", path: "minha-conta.html" }
- { key: "minha-conta.js", path: "minha-conta.js" }
- { key: "painel-c4.css", path: "painel-c4.css" }
- { key: "painel-c4.js", path: "painel-c4.js" }
- { key: "painel-markdown.js", path: "painel-markdown.js" }
- { key: "painel.css", path: "painel.css" }
- { key: "painel.html", path: "painel.html" }
- { key: "painel.js", path: "painel.js" }
File diff suppressed because it is too large Load Diff