8aa65014b4
Roadmap item #11. Ships the non-modal bottom-of-page cookie consent banner, the default /privacy and /cookies policy pages, the `cookie_consent` table + two §17 endpoints for server-side persistence, the localStorage fallback for anonymous viewers, the /settings "Privacy & cookies" tab for revisiting the choice, and the `frontend/src/lib/consent.js` helper that roadmap item #13's analytics SDK (v0.15.0) will gate against. No analytics SDK ships in this release — the consent infrastructure goes in first so the gate is already in place. Adds SPEC §14.5 / §14.6, lists two new endpoints in §17, names the new table in §5, and surfaces four §19.2 candidates (content-repo file vs env-var policy, GPC / DNT headers, i18n, item-#13 dependency). Two new optional env vars (`VITE_PRIVACY_POLICY_URL`, `VITE_COOKIES_POLICY_URL`) — defaults render the framework's stub pages. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
119 lines
4.6 KiB
React
119 lines
4.6 KiB
React
// Privacy.jsx — v0.13.0 / roadmap item #11 / SPEC §14.5.
|
|
//
|
|
// The framework's default privacy policy page. Reachable by anonymous
|
|
// and authenticated viewers alike at `/privacy`. The text below is a
|
|
// minimal stub that describes the framework's stance; deployments are
|
|
// expected to override it via the `VITE_PRIVACY_POLICY_URL` env var.
|
|
//
|
|
// When `VITE_PRIVACY_POLICY_URL` is set:
|
|
// - http(s) URL → the page renders the framework's stub above a
|
|
// "Read the full deployment policy" link to the configured URL.
|
|
// We don't iframe-embed third-party policy hosts because their
|
|
// Content-Security-Policy frequently refuses framing; the link is
|
|
// the predictable affordance.
|
|
//
|
|
// The framework's stub is intentionally short — the rules that matter
|
|
// to a user are: (1) what categories of cookies the app sets, (2) how
|
|
// to change consent, (3) where to reach the deployment operator with a
|
|
// complaint. Each deployment's content repo can carry a fuller version.
|
|
|
|
import { useNavigate, Link } from 'react-router-dom'
|
|
|
|
export default function Privacy() {
|
|
const navigate = useNavigate()
|
|
const deploymentUrl = (import.meta.env.VITE_PRIVACY_POLICY_URL || '').trim()
|
|
const appName = import.meta.env.VITE_APP_NAME || 'this deployment'
|
|
|
|
return (
|
|
<div className="policy-page">
|
|
<header className="policy-header">
|
|
<button
|
|
className="policy-back"
|
|
onClick={() => (history.length > 1 ? navigate(-1) : navigate('/'))}
|
|
>
|
|
← Back
|
|
</button>
|
|
<span className="policy-title">Privacy policy</span>
|
|
</header>
|
|
<article className="policy-body">
|
|
<h1>Privacy policy</h1>
|
|
<p className="policy-subtitle">
|
|
What {appName} stores, why, and how to control it.
|
|
</p>
|
|
|
|
<h2>What we store</h2>
|
|
<p>
|
|
{appName} runs on the Wiggleverse RFC framework. The framework
|
|
stores the identity you sign in with (your Gitea login,
|
|
display name, email, and avatar URL), the proposals and edits
|
|
you author, the discussion threads you participate in, and
|
|
your notification preferences. Authoring is public by design —
|
|
this is a framework for public-async RFC work, and threads,
|
|
changes, and PRs are visible to anyone who reaches the
|
|
deployment. Settings (notification toggles, quiet hours, mute
|
|
list, cookie consent) are private to your account.
|
|
</p>
|
|
|
|
<h2>Cookies</h2>
|
|
<p>
|
|
The app sets a small set of cookies. The full list is on the{' '}
|
|
<Link to="/cookies">cookies policy page</Link>. You can choose
|
|
which categories you allow from the consent banner shown on
|
|
your first visit or from <Link to="/settings/notifications">
|
|
Settings → Privacy & cookies</Link> any time
|
|
afterwards.
|
|
</p>
|
|
|
|
<h2>Analytics</h2>
|
|
<p>
|
|
The framework supports an optional anonymous analytics layer
|
|
gated behind your consent choice. As of v0.13.0 no analytics
|
|
SDK ships in the framework; deployments that enable analytics
|
|
do so via a later framework version (roadmap item #13). The
|
|
consent toggle exists today so the gate is already in place
|
|
when the SDK lands.
|
|
</p>
|
|
|
|
<h2>Your data, your control</h2>
|
|
<ul>
|
|
<li>Revoke cookie consent any time from settings.</li>
|
|
<li>
|
|
Edit notification preferences — including the global email
|
|
opt-out — from{' '}
|
|
<Link to="/settings/notifications">notification settings</Link>.
|
|
</li>
|
|
<li>
|
|
Your authored content (proposals, threads, edits) is public
|
|
and not retractable from the meta-repo's Git history. If you
|
|
need a redaction, reach the deployment operator directly.
|
|
</li>
|
|
</ul>
|
|
|
|
{deploymentUrl ? (
|
|
<>
|
|
<h2>Deployment-specific policy</h2>
|
|
<p>
|
|
This deployment may layer additional policy on top of the
|
|
framework's defaults. Read the full deployment policy at:
|
|
</p>
|
|
<p>
|
|
<a href={deploymentUrl} target="_blank" rel="noopener noreferrer">
|
|
{deploymentUrl}
|
|
</a>
|
|
</p>
|
|
</>
|
|
) : (
|
|
<>
|
|
<h2>Deployment contact</h2>
|
|
<p>
|
|
For deployment-specific privacy questions — data subject
|
|
requests, redaction requests, complaints — contact the
|
|
operator of {appName}.
|
|
</p>
|
|
</>
|
|
)}
|
|
</article>
|
|
</div>
|
|
)
|
|
}
|