112 lines
3.7 KiB
Plaintext
112 lines
3.7 KiB
Plaintext
---
|
|
/**
|
|
* Privacy. The honest version is short and unusually good, so it is stated plainly
|
|
* rather than padded into a policy.
|
|
*
|
|
* Anything that depends on how the site is deployed (what the web server logs and for
|
|
* how long) is written conditionally and marked, because this repo cannot know the
|
|
* operator's nginx and logrotate settings. See NOTES-PAGES.md.
|
|
*/
|
|
import Base from '../../layouts/Base.astro';
|
|
import { localePath, useI18n, type Locale } from '../../i18n';
|
|
import { localePaths } from '../../i18n/paths';
|
|
|
|
/** One page per locale: `/privacy`, `/es/privacy`, `/nl/privacy`. */
|
|
export const getStaticPaths = localePaths;
|
|
|
|
interface Props {
|
|
locale: Locale;
|
|
}
|
|
const { locale } = Astro.props;
|
|
|
|
const t = useI18n(locale);
|
|
|
|
const GITHUB = 'https://github.com/Azzamo-net/cashumints.space';
|
|
/** Bump `disclaimer.updated` in every catalog when the text changes. */
|
|
const updated = t('disclaimer.updated');
|
|
|
|
const description = t('privacy.description');
|
|
|
|
/*
|
|
* Three list items that open with a bold lead, and two sentences with a link. Each is
|
|
* one catalog string with a placeholder, so the lead and the link can sit wherever the
|
|
* language puts them rather than always first.
|
|
*/
|
|
const bold = (value: string): string => `<b>${value}</b>`;
|
|
|
|
const operatorNote =
|
|
bold(t('privacy.logs.operatorLabel')) + ' ' + t('privacy.logs.operator');
|
|
|
|
const thirdPartyLi1 = t('privacy.thirdParties.li1', {
|
|
strong: bold(t('privacy.thirdParties.li1Label')),
|
|
link: `<a href="${localePath('/about', locale)}#relays">${t('privacy.thirdParties.li1Link')}</a>`,
|
|
});
|
|
const thirdPartyLi2 = t('privacy.thirdParties.li2', {
|
|
strong: bold(t('privacy.thirdParties.li2Label')),
|
|
});
|
|
const contactP1 = t('privacy.contact.p1', {
|
|
github: `<a href="${GITHUB}" rel="noopener">GitHub</a>`,
|
|
});
|
|
---
|
|
|
|
<Base title={t('privacy.title')} description={description}>
|
|
<div class="page">
|
|
<div class="prose">
|
|
<h1>{t('privacy.heading')}</h1>
|
|
<p class="lede">{t('privacy.lede', { date: updated })}</p>
|
|
|
|
<h2 id="no-accounts">{t('privacy.noAccounts.title')}</h2>
|
|
<p>{t('privacy.noAccounts.p1')}</p>
|
|
|
|
<h2 id="no-tracking">{t('privacy.noTracking.title')}</h2>
|
|
<p>{t('privacy.noTracking.p1')}</p>
|
|
|
|
<h2 id="logs">{t('privacy.logs.title')}</h2>
|
|
<p>{t('privacy.logs.p1')}</p>
|
|
<p class="operator-note" set:html={operatorNote} />
|
|
|
|
<h2 id="local-storage">{t('privacy.storage.title')}</h2>
|
|
<p>{t('privacy.storage.p1')}</p>
|
|
<ul>
|
|
<li>{t('privacy.storage.li1')}</li>
|
|
<li>{t('privacy.storage.li2')}</li>
|
|
</ul>
|
|
<p>{t('privacy.storage.p2')}</p>
|
|
|
|
<h2 id="third-parties">{t('privacy.thirdParties.title')}</h2>
|
|
<p>{t('privacy.thirdParties.p1')}</p>
|
|
<ul>
|
|
<li set:html={thirdPartyLi1} />
|
|
<li set:html={thirdPartyLi2} />
|
|
</ul>
|
|
|
|
<h2 id="publishing">{t('privacy.publishing.title')}</h2>
|
|
<p>{t('privacy.publishing.p1')}</p>
|
|
|
|
<h2 id="permanent">{t('privacy.permanent.title')}</h2>
|
|
<p>{t('privacy.permanent.p1')}</p>
|
|
<ul>
|
|
<li>{t('privacy.permanent.li1')}</li>
|
|
<li>{t('privacy.permanent.li2')}</li>
|
|
<li>{t('privacy.permanent.li3')}</li>
|
|
<li>{t('privacy.permanent.li4')}</li>
|
|
</ul>
|
|
<p>{t('privacy.permanent.p2')}</p>
|
|
|
|
<h2 id="contact">{t('privacy.contact.title')}</h2>
|
|
<p set:html={contactP1} />
|
|
</div>
|
|
</div>
|
|
</Base>
|
|
|
|
<style>
|
|
/* A note addressed to whoever deploys this, not to the reader. Marked as such so it
|
|
is obvious it is placeholder text until the operator confirms the real number. */
|
|
.operator-note {
|
|
border: 1px solid var(--line); border-left: 3px solid var(--amber-dim);
|
|
border-radius: 10px; background: var(--card);
|
|
padding: 14px 16px; font-size: 13.5px;
|
|
}
|
|
.operator-note b { color: var(--text); }
|
|
</style>
|