pr_01m47d15m3e54sn21z27rpy5n9/apps/web/app/routes/policies.tsx

81 lines3,647 bytesCodeBlame
1import { ArrowRight } from "lucide-react";
2import { Link } from "react-router";
3
4import type { Route } from "./+types/policies";
5import { TrustPage } from "../components/trust-page";
6import { CONTACT, POLICIES, POLICIES_UPDATED, POLICY_HISTORY, longDate } from "../lib/legal";
7import { page } from "../lib/meta";
8
9export function meta(args: Route.MetaArgs) {
10 return page(args, {
11 title: "Policies · g1t",
12 description:
13 "g1t's Terms of Service, Privacy Policy, Acceptable Use Policy, refunds and subprocessors, in plain language, with every change listed.",
14 });
15}
16
17export default function Policies() {
18 return (
19 <TrustPage
20 eyebrow="Policies"
21 title="The rules we both play by"
22 lede={
23 <p>
24 What you agree to when you use g1t, and what we promise in return, written to be read. Last
25 updated {longDate(POLICIES_UPDATED)}.
26 </p>
27 }
28 >
29 <ul className="grid gap-3 sm:grid-cols-2">
30 {POLICIES.map((policy) => (
31 <li key={policy.slug}>
32 <Link
33 to={`/policies/${policy.slug}`}
34 className="group flex h-full flex-col rounded-xl border border-line bg-surface p-5 transition-colors hover:border-line-strong hover:bg-raised"
35 >
36 <span className="flex items-center justify-between gap-3 font-medium">
37 {policy.title}
38 <ArrowRight size={15} className="shrink-0 text-faint transition-transform group-hover:translate-x-0.5 group-hover:text-fg" />
39 </span>
40 <span className="mt-1.5 text-sm text-muted">{policy.summary}</span>
41 </Link>
42 </li>
43 ))}
44 <li>
45 <Link
46 to="/security"
47 className="group flex h-full flex-col rounded-xl border border-line bg-surface p-5 transition-colors hover:border-line-strong hover:bg-raised"
48 >
49 <span className="flex items-center justify-between gap-3 font-medium">
50 Security and disclosure
51 <ArrowRight size={15} className="shrink-0 text-faint transition-transform group-hover:translate-x-0.5 group-hover:text-fg" />
52 </span>
53 <span className="mt-1.5 text-sm text-muted">How g1t protects code and accounts, and how to report a vulnerability.</span>
54 </Link>
55 </li>
56 </ul>
57
58 <section className="mt-14 max-w-3xl">
59 <h2 className="text-xl font-semibold tracking-tight">Changes</h2>
60 <p className="mt-2 text-sm text-muted">
61 We'll tell you before material changes take effect: by email to account holders and here, at least 30 days
62 ahead, unless the law or a security problem needs a change sooner. Every change is listed below.
63 </p>
64 <ol className="mt-5 divide-y divide-line rounded-xl border border-line">
65 {POLICY_HISTORY.map((entry) => (
66 <li key={entry.date + entry.change} className="flex flex-col gap-1 px-4 py-3 text-sm sm:flex-row sm:gap-6">
67 <time dateTime={entry.date} className="shrink-0 font-mono text-xs leading-6 text-faint sm:w-28">
68 {entry.date}
69 </time>
70 <span className="text-fg/90">{entry.change}</span>
71 </li>
72 ))}
73 </ol>
74 <p className="mt-6 text-sm text-muted">
75 Questions about a policy: <a className="text-accent hover:underline" href={`mailto:${CONTACT.legal}`}>{CONTACT.legal}</a>.
76 About your information: <a className="text-accent hover:underline" href={`mailto:${CONTACT.privacy}`}>{CONTACT.privacy}</a>.
77 </p>
78 </section>
79 </TrustPage>
80 );
81}