Your Name 6936a2c203
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: add privacy page for youdian biji
2026-03-12 15:15:46 +08:00

145 lines
6.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Metadata } from "next";
export const metadata: Metadata = {
title: { absolute: "Eding(由点笔迹) - Privacy Policy" },
description:
"Privacy Policy for Eding(由点笔迹), an offline app with no login required. We do not collect, store, or transmit personal information to external servers.",
openGraph: {
title: "Eding(由点笔迹) - Privacy Policy",
description:
"Eding(由点笔迹)是一款离线 App,无需登录即可使用。我们不收集、存储或传输你的个人信息到外部服务器。",
},
};
const SUPPORT_EMAIL = "lanmu1818@gmail.com";
const SUPPORT_SUBJECT = encodeURIComponent("由点笔迹 隐私政策咨询");
const SUPPORT_MAILTO = `mailto:${SUPPORT_EMAIL}?subject=${SUPPORT_SUBJECT}`;
export default function YoudianBijIPrivacyPolicyPage() {
return (
<main
className="min-h-dvh text-foreground"
style={{
background:
"radial-gradient(1200px 600px at 20% -10%, rgba(124, 92, 255, 0.18), transparent 55%), radial-gradient(900px 520px at 90% 10%, rgba(45, 212, 191, 0.14), transparent 50%), linear-gradient(180deg, var(--background), var(--background))",
}}
>
<div className="mx-auto max-w-[980px] px-5 py-8 pb-16">
<header className="mb-7 flex items-center justify-between gap-4">
<div className="flex min-w-0 items-center gap-3">
<div
aria-hidden="true"
className="relative h-10 w-10 shrink-0 rounded-xl bg-gradient-to-br from-violet-500 to-teal-400 shadow-2xl"
>
<div className="absolute inset-2.5 rounded-lg border border-white/20 bg-white/15" />
</div>
<div className="min-w-0">
<p className="truncate text-sm font-semibold tracking-tight">Eding(由点笔迹)</p>
<p className="text-xs text-muted-foreground">
Privacy Policy · 隐私政策
</p>
</div>
</div>
<a className="text-xs text-muted-foreground hover:underline" href="/riji">
返回技术支持
</a>
</header>
<section className="rounded-3xl border border-border bg-card/60 p-7 shadow-2xl backdrop-blur">
<h1 className="mb-2 text-balance text-3xl font-semibold tracking-tight sm:text-5xl">
Privacy Policy
</h1>
<p className="text-sm text-muted-foreground">Last Updated: 2025-03-11</p>
<p className="mt-4 text-sm leading-relaxed text-muted-foreground">
Eding(由点笔迹) is a fully offline note-taking app. We value your privacy and are
committed to protecting your information.
</p>
</section>
<div className="mt-8 space-y-3">
<PolicyItem title="1. Information Collection">
Eding(由点笔迹) is a fully offline note-taking app. We do not collect, store, or
transmit any of your personal information to external servers. All notes,
images, videos, and other content you create are stored locally on your device.
</PolicyItem>
<PolicyItem title="2. Data Storage">
<ul className="list-disc space-y-1 pl-5 text-sm leading-relaxed text-muted-foreground">
<li>All note data is saved in local device storage.</li>
<li>Image and video files are stored in the app’s sandbox directory.</li>
<li>Encrypted notes are protected using AES encryption.</li>
<li>Privacy passwords are securely stored in the system Keychain.</li>
<li>Backup files are exported to the Files app and managed by you.</li>
</ul>
</PolicyItem>
<PolicyItem title="3. Biometric Authentication">
Eding(由点笔迹) supports Face ID / Touch ID to unlock encrypted notes. Biometric data
is managed by the iOS system. The app cannot access or store your biometric
information.
</PolicyItem>
<PolicyItem title="4. Photo Library Access">
When you choose to add images or videos, the app requests access to your photo
library. We only read the media files you select and do not scan or upload your
photo library content.
</PolicyItem>
<PolicyItem title="5. Network Usage">
Eding(由点笔迹) does not require a network connection to function. The app does not
make any network requests and does not include any third-party analytics,
advertising, or tracking SDKs.
</PolicyItem>
<PolicyItem title="6. Data Deletion">
You can delete notes at any time by moving them to trash and permanently deleting
them. Uninstalling the app will permanently remove all local data. We do not
retain any copies of your data.
</PolicyItem>
<PolicyItem title="7. Children’s Privacy">
Eding(由点笔迹) does not collect any personal information from any users, including
children. The app is suitable for users of all ages.
</PolicyItem>
<PolicyItem title="8. Policy Updates">
If we update this Privacy Policy, we will notify you through app updates.
Continued use of the app indicates your agreement to the updated policy.
</PolicyItem>
<div className="rounded-2xl border border-border bg-card/50 p-5 shadow-sm">
<h2 className="mb-1 text-sm font-semibold tracking-tight">Contact</h2>
<p className="text-sm leading-relaxed text-muted-foreground">
Questions about this policy? Email us at{" "}
<a className="underline-offset-4 hover:underline" href={SUPPORT_MAILTO}>
{SUPPORT_EMAIL}
</a>
.
</p>
</div>
</div>
<footer className="mt-10 flex flex-wrap items-center justify-between gap-3 border-t border-border pt-5 text-xs text-muted-foreground">
<span>Eding(由点笔迹) · Privacy Policy</span>
<span>Public page (no login required)</span>
</footer>
</div>
</main>
);
}
function PolicyItem({
title,
children,
}: {
title: string;
children: React.ReactNode;
}) {
return (
<section className="rounded-2xl border border-border bg-card/50 p-5 shadow-sm">
<h2 className="mb-1 text-sm font-semibold tracking-tight">{title}</h2>
<div className="text-sm leading-relaxed text-muted-foreground">{children}</div>
</section>
);
}