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