Privacy policy, terms of service, cookie policy + a cookie notice
Three plain-language documents in both app languages (lib/legal.ts, rendered by components/LegalPage.tsx): /privacy describes the local-first storage, the key never leaving the browser and the three opt-in server copies (sync, reminders, reports); /terms covers the GPL-3.0-only software, your own Ollama key, fair use and liability; /cookies states what is true — no cookies at all (no Set-Cookie, no document.cookie), strictly-necessary local storage instead, no tracking. A cookie notice tells every new browser the same thing once and remembers the dismissal (freezmo.consent.v1). It sits at z-44: below the immersive study feeds so it can never cover a session, above the phone tab bar. Settings links all three documents. The regression suite checks the pages render with real sections and that dismissing the notice sticks. Version 0.1.7, SW -> freezmo-v53.
This commit is contained in:
parent
df34337b4a
commit
464781a7fd
13 changed files with 583 additions and 2 deletions
|
|
@ -1,5 +1,6 @@
|
|||
"use client";
|
||||
|
||||
import Link from "next/link";
|
||||
import { AnimatePresence, motion, useDragControls, useReducedMotion } from "framer-motion";
|
||||
import { useEffect, useRef, useState, useSyncExternalStore } from "react";
|
||||
|
||||
|
|
@ -529,6 +530,24 @@ export function SettingsDialog({
|
|||
/>
|
||||
) : null}
|
||||
</dl>
|
||||
{/* Legal: the same three documents the cookie banner
|
||||
links to, always reachable from Settings. */}
|
||||
<div className="pt-3">
|
||||
<p className="text-[11px] font-semibold uppercase tracking-wider text-[var(--text-subtle)]">
|
||||
{t("settings.legal")}
|
||||
</p>
|
||||
<div className="mt-1.5 flex flex-wrap gap-x-3 gap-y-1 text-[12.5px] font-semibold">
|
||||
<Link href="/privacy" className="text-[var(--text)] underline decoration-dotted">
|
||||
{t("legal.privacy")}
|
||||
</Link>
|
||||
<Link href="/terms" className="text-[var(--text)] underline decoration-dotted">
|
||||
{t("legal.terms")}
|
||||
</Link>
|
||||
<Link href="/cookies" className="text-[var(--text)] underline decoration-dotted">
|
||||
{t("legal.cookies")}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
{health?.mode === "direct-cloud" && health.needsKey ? (
|
||||
<p className="pt-2 text-[11px] leading-relaxed text-[var(--text-subtle)]">
|
||||
{t("health.createKey.before")}{" "}
|
||||
|
|
@ -808,6 +827,19 @@ export function SettingsDialog({
|
|||
</p>
|
||||
) : null}
|
||||
|
||||
{/* Legal: the same three documents the cookie banner links to. */}
|
||||
<div className="mt-3 flex flex-wrap gap-x-3 gap-y-1 text-[12px] font-semibold">
|
||||
<Link href="/privacy" className="text-[var(--text-muted)] underline decoration-dotted">
|
||||
{t("legal.privacy")}
|
||||
</Link>
|
||||
<Link href="/terms" className="text-[var(--text-muted)] underline decoration-dotted">
|
||||
{t("legal.terms")}
|
||||
</Link>
|
||||
<Link href="/cookies" className="text-[var(--text-muted)] underline decoration-dotted">
|
||||
{t("legal.cookies")}
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
{/* keeps real content out of the 36px fade strip at the bottom */}
|
||||
<div className="h-9" aria-hidden />
|
||||
</>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue