Some checks failed
PR checks / checks (pull_request) Failing after -31s
Step 5 of docs/website/ACCOUNT_DELETION.md (§4.5). The page explains how to delete an account on a community's site and in the app, what goes, what stays and for how long, and who to ask when you cannot sign in. It cannot delete anything, because we hold no account. - The facts are one deployment row in collection.mjs (deletion.goes, .stays with a keep each, .staff), in the website's own words. /privacy section 3 renders it as prose, the page renders its lists, and PLAY_DATA_SAFETY.md prints them under the console's deletion questions. - The app rows that a deletion touches (session, trust token, push, inbox snapshot) say so. The Data Safety notes now answer "yes" to account deletion and name the URL. lastUpdated is 2026-10-30. - D85: linked from the footer's legal bar, /privacy sections 2 and 3, and /app/'s "Two ways to get it". - D86: someone who cannot sign in is sent to their community's operator, never to us. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
93 lines
3.1 KiB
Plaintext
93 lines
3.1 KiB
Plaintext
---
|
|
import { renderBrand } from '../lib/brand.mjs';
|
|
import { legal } from '../data/legal.mjs';
|
|
import { footerColumns } from '../data/footer.mjs';
|
|
import platform from '../data/platform.json';
|
|
|
|
/**
|
|
* The footer is on every page, so it is the one place that must never quote a fact from
|
|
* memory. The version chip reads `platform.json` (§12); the contact address and the links
|
|
* read `brand.json` (§7, D13).
|
|
*
|
|
* `/privacy` and `/terms` are linked from every page (§9). Phase 6 built them and put them
|
|
* in the legal bar at the foot rather than in the columns: a legal link is not a thing a
|
|
* reader browses to alongside Features, it is a thing they go looking for, and the line
|
|
* that already carries the licence and the copyright is where people look.
|
|
* `/delete-account/` joined them for the same reason (D85): it is the address Google Play
|
|
* is given, and a player looking for it looks where the privacy link is.
|
|
*/
|
|
// `/beta` renders per request, so the footer it gets must read the mount rather than the
|
|
// value baked at build time. See `renderBrand` in src/lib/brand.mjs (phase 11).
|
|
const brand = renderBrand(Astro);
|
|
|
|
const year = new Date().getFullYear();
|
|
|
|
// The columns live in src/data/footer.mjs so a test can read them — see the note there,
|
|
// and test/footer.test.mjs. The two Project links come from the mounted brand (§7).
|
|
const columns = footerColumns(brand);
|
|
|
|
const isExternal = (href: string) => href.startsWith('http');
|
|
---
|
|
|
|
<footer class="site-footer">
|
|
<div class="page">
|
|
<div class="site-footer__cols">
|
|
{
|
|
columns.map((column) => (
|
|
<section>
|
|
<h2>{column.heading}</h2>
|
|
<ul>
|
|
{column.links.map((link) => (
|
|
<li>
|
|
<a
|
|
href={link.href}
|
|
rel={isExternal(link.href) ? 'noopener noreferrer' : undefined}
|
|
>
|
|
{link.label}
|
|
</a>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</section>
|
|
))
|
|
}
|
|
</div>
|
|
|
|
<div class="site-footer__legal">
|
|
<p>
|
|
{brand.siteName} is free software under the{' '}
|
|
<a href={legal.licence.url} rel="noopener noreferrer">{legal.licence.id}</a>. ©
|
|
{' '}{year}.
|
|
<span class="site-footer__links">
|
|
<a href="/privacy/">Privacy</a>
|
|
<a href="/terms/">Terms</a>
|
|
<a href="/delete-account/">Delete account</a>
|
|
</span>
|
|
</p>
|
|
<p class="site-footer__meta">
|
|
{/* D66, as on the hero: the shared version only. Each game's protocol and bundle
|
|
are on that game's pages. */}
|
|
<span class="chip chip--version">Module API {platform.moduleApi}</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
<style>
|
|
/* Sits on the licence line rather than in a column of its own — see the header. The
|
|
separator is a border so it never appears at the start of a wrapped line. */
|
|
.site-footer__links {
|
|
display: inline-flex;
|
|
gap: 0.9rem;
|
|
margin-left: 0.9rem;
|
|
padding-left: 0.9rem;
|
|
border-left: 1px solid var(--line-soft);
|
|
}
|
|
|
|
.site-footer__meta {
|
|
display: flex;
|
|
gap: 0.5rem;
|
|
flex-wrap: wrap;
|
|
}
|
|
</style>
|