Skip to content

Commit 022035d

Browse files
authored
Privacy Policy & Terms of Service (#11)
2 parents 05dddb7 + 2c60c34 commit 022035d

File tree

8 files changed

+1019
-8
lines changed

8 files changed

+1019
-8
lines changed

app.config.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@ export default defineConfig({
1212
server: {
1313
preset: "vercel",
1414
prerender: {
15-
routes: ["/", "/pricing", "/success", "/videos"],
15+
routes: [
16+
"/",
17+
"/pricing",
18+
"/success",
19+
"/videos",
20+
"/privacy-policy",
21+
"/terms-of-service",
22+
"/sign-in",
23+
"/sign-up",
24+
],
1625
},
1726
},
1827
});

app/components/footer.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@ export function Footer() {
77
© {new Date().getFullYear()} Slipstream
88
</p>
99
<nav className="sm:ml-auto flex gap-4 sm:gap-6">
10-
<Link className="text-xs hover:underline underline-offset-4" to="/">
10+
<Link
11+
className="text-xs hover:underline underline-offset-4"
12+
to="/terms-of-service"
13+
>
1114
Terms of Service
1215
</Link>
13-
<Link className="text-xs hover:underline underline-offset-4" to="/">
14-
Privacy
16+
<Link
17+
className="text-xs hover:underline underline-offset-4"
18+
to="/privacy-policy"
19+
>
20+
Privacy Policy
1521
</Link>
1622
</nav>
1723
</footer>

app/components/styled-markdown.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import Markdown from "react-markdown";
2+
3+
export function StyledMarkdown({ children }: { children: string }) {
4+
return (
5+
<Markdown
6+
components={{
7+
h1: ({ node, ...props }) => (
8+
<h1 className="text-4xl font-semibold text-primary mb-4" {...props} />
9+
),
10+
h2: ({ node, ...props }) => (
11+
<h2 className="text-3xl text-primary mt-6 mb-4" {...props} />
12+
),
13+
h3: ({ node, ...props }) => (
14+
<h3 className="text-xl text-primary mt-4 mb-2" {...props} />
15+
),
16+
p: ({ node, ...props }) => <p className="mb-4 font-[300]" {...props} />,
17+
ul: ({ node, ...props }) => (
18+
<ul className="list-disc list-inside mb-4" {...props} />
19+
),
20+
li: ({ node, ...props }) => <li className="mb-2" {...props} />,
21+
a: ({ node, ...props }) => (
22+
<a className="text-blue-400 hover:underline" {...props} />
23+
),
24+
code: ({ node, ...props }) => (
25+
<code className="bg-gray-200 p-1 rounded" {...props} />
26+
),
27+
}}
28+
>
29+
{children}
30+
</Markdown>
31+
);
32+
}

app/routeTree.gen.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212

1313
import { Route as rootRoute } from './routes/__root'
1414
import { Route as VideosImport } from './routes/videos'
15+
import { Route as TermsOfServiceImport } from './routes/terms-of-service'
1516
import { Route as SuccessImport } from './routes/success'
17+
import { Route as PrivacyPolicyImport } from './routes/privacy-policy'
1618
import { Route as PricingImport } from './routes/pricing'
1719
import { Route as IndexImport } from './routes/index'
1820
import { Route as SignUpSplatImport } from './routes/sign-up.$'
@@ -27,12 +29,24 @@ const VideosRoute = VideosImport.update({
2729
getParentRoute: () => rootRoute,
2830
} as any)
2931

32+
const TermsOfServiceRoute = TermsOfServiceImport.update({
33+
id: '/terms-of-service',
34+
path: '/terms-of-service',
35+
getParentRoute: () => rootRoute,
36+
} as any)
37+
3038
const SuccessRoute = SuccessImport.update({
3139
id: '/success',
3240
path: '/success',
3341
getParentRoute: () => rootRoute,
3442
} as any)
3543

44+
const PrivacyPolicyRoute = PrivacyPolicyImport.update({
45+
id: '/privacy-policy',
46+
path: '/privacy-policy',
47+
getParentRoute: () => rootRoute,
48+
} as any)
49+
3650
const PricingRoute = PricingImport.update({
3751
id: '/pricing',
3852
path: '/pricing',
@@ -81,13 +95,27 @@ declare module '@tanstack/react-router' {
8195
preLoaderRoute: typeof PricingImport
8296
parentRoute: typeof rootRoute
8397
}
98+
'/privacy-policy': {
99+
id: '/privacy-policy'
100+
path: '/privacy-policy'
101+
fullPath: '/privacy-policy'
102+
preLoaderRoute: typeof PrivacyPolicyImport
103+
parentRoute: typeof rootRoute
104+
}
84105
'/success': {
85106
id: '/success'
86107
path: '/success'
87108
fullPath: '/success'
88109
preLoaderRoute: typeof SuccessImport
89110
parentRoute: typeof rootRoute
90111
}
112+
'/terms-of-service': {
113+
id: '/terms-of-service'
114+
path: '/terms-of-service'
115+
fullPath: '/terms-of-service'
116+
preLoaderRoute: typeof TermsOfServiceImport
117+
parentRoute: typeof rootRoute
118+
}
91119
'/videos': {
92120
id: '/videos'
93121
path: '/videos'
@@ -124,7 +152,9 @@ declare module '@tanstack/react-router' {
124152
export interface FileRoutesByFullPath {
125153
'/': typeof IndexRoute
126154
'/pricing': typeof PricingRoute
155+
'/privacy-policy': typeof PrivacyPolicyRoute
127156
'/success': typeof SuccessRoute
157+
'/terms-of-service': typeof TermsOfServiceRoute
128158
'/videos': typeof VideosRoute
129159
'/p/$videoId': typeof PVideoIdRoute
130160
'/sign-in/$': typeof SignInSplatRoute
@@ -134,7 +164,9 @@ export interface FileRoutesByFullPath {
134164
export interface FileRoutesByTo {
135165
'/': typeof IndexRoute
136166
'/pricing': typeof PricingRoute
167+
'/privacy-policy': typeof PrivacyPolicyRoute
137168
'/success': typeof SuccessRoute
169+
'/terms-of-service': typeof TermsOfServiceRoute
138170
'/videos': typeof VideosRoute
139171
'/p/$videoId': typeof PVideoIdRoute
140172
'/sign-in/$': typeof SignInSplatRoute
@@ -145,7 +177,9 @@ export interface FileRoutesById {
145177
__root__: typeof rootRoute
146178
'/': typeof IndexRoute
147179
'/pricing': typeof PricingRoute
180+
'/privacy-policy': typeof PrivacyPolicyRoute
148181
'/success': typeof SuccessRoute
182+
'/terms-of-service': typeof TermsOfServiceRoute
149183
'/videos': typeof VideosRoute
150184
'/p/$videoId': typeof PVideoIdRoute
151185
'/sign-in/$': typeof SignInSplatRoute
@@ -157,7 +191,9 @@ export interface FileRouteTypes {
157191
fullPaths:
158192
| '/'
159193
| '/pricing'
194+
| '/privacy-policy'
160195
| '/success'
196+
| '/terms-of-service'
161197
| '/videos'
162198
| '/p/$videoId'
163199
| '/sign-in/$'
@@ -166,7 +202,9 @@ export interface FileRouteTypes {
166202
to:
167203
| '/'
168204
| '/pricing'
205+
| '/privacy-policy'
169206
| '/success'
207+
| '/terms-of-service'
170208
| '/videos'
171209
| '/p/$videoId'
172210
| '/sign-in/$'
@@ -175,7 +213,9 @@ export interface FileRouteTypes {
175213
| '__root__'
176214
| '/'
177215
| '/pricing'
216+
| '/privacy-policy'
178217
| '/success'
218+
| '/terms-of-service'
179219
| '/videos'
180220
| '/p/$videoId'
181221
| '/sign-in/$'
@@ -186,7 +226,9 @@ export interface FileRouteTypes {
186226
export interface RootRouteChildren {
187227
IndexRoute: typeof IndexRoute
188228
PricingRoute: typeof PricingRoute
229+
PrivacyPolicyRoute: typeof PrivacyPolicyRoute
189230
SuccessRoute: typeof SuccessRoute
231+
TermsOfServiceRoute: typeof TermsOfServiceRoute
190232
VideosRoute: typeof VideosRoute
191233
PVideoIdRoute: typeof PVideoIdRoute
192234
SignInSplatRoute: typeof SignInSplatRoute
@@ -196,7 +238,9 @@ export interface RootRouteChildren {
196238
const rootRouteChildren: RootRouteChildren = {
197239
IndexRoute: IndexRoute,
198240
PricingRoute: PricingRoute,
241+
PrivacyPolicyRoute: PrivacyPolicyRoute,
199242
SuccessRoute: SuccessRoute,
243+
TermsOfServiceRoute: TermsOfServiceRoute,
200244
VideosRoute: VideosRoute,
201245
PVideoIdRoute: PVideoIdRoute,
202246
SignInSplatRoute: SignInSplatRoute,
@@ -215,7 +259,9 @@ export const routeTree = rootRoute
215259
"children": [
216260
"/",
217261
"/pricing",
262+
"/privacy-policy",
218263
"/success",
264+
"/terms-of-service",
219265
"/videos",
220266
"/p/$videoId",
221267
"/sign-in/$",
@@ -228,9 +274,15 @@ export const routeTree = rootRoute
228274
"/pricing": {
229275
"filePath": "pricing.tsx"
230276
},
277+
"/privacy-policy": {
278+
"filePath": "privacy-policy.tsx"
279+
},
231280
"/success": {
232281
"filePath": "success.tsx"
233282
},
283+
"/terms-of-service": {
284+
"filePath": "terms-of-service.tsx"
285+
},
234286
"/videos": {
235287
"filePath": "videos.tsx"
236288
},

app/routes/privacy-policy.tsx

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import { Footer } from "@/components/footer";
2+
import { StyledMarkdown } from "@/components/styled-markdown";
3+
import TopNav from "@/components/top-nav";
4+
import { createFileRoute } from "@tanstack/react-router";
5+
6+
const markdown = `
7+
# Privacy Policy for Slipstream Video
8+
9+
**Last Updated: 03/02/2025**
10+
11+
At Slipstream Video, we are committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website and use our services. Please read this policy carefully. If you do not agree with the terms of this Privacy Policy, please do not access the site.
12+
13+
## 1. Information We Collect
14+
15+
We may collect information about you in a variety of ways, including:
16+
17+
### 1.1 Personal Information
18+
19+
When you create an account, subscribe to our services, or contact us, we may collect personal information that can identify you, such as:
20+
21+
- Name
22+
- Email address
23+
- Payment information (if applicable)
24+
- Any other information you provide to us
25+
26+
### 1.2 Usage Data
27+
28+
We may also collect information about how you access and use our services, including:
29+
30+
- Your IP address
31+
- Browser type
32+
- Operating system
33+
- Pages visited
34+
- Time and date of visits
35+
- Time spent on those pages
36+
- Other diagnostic data
37+
38+
### 1.3 Cookies and Tracking Technologies
39+
40+
We may use cookies, web beacons, and similar tracking technologies to monitor activity on our service and store certain information. You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent. However, if you do not accept cookies, you may not be able to use some portions of our service.
41+
42+
## 2. User-Uploaded Content
43+
44+
When you upload videos or files to Slipstream Video, you acknowledge that any information contained within those files may be accessed by Slipstream Video. This includes metadata, descriptions, and any other information you provide in the uploaded content.
45+
46+
### 2.1 Unlisted and Private Videos
47+
48+
Slipstream Video offers options for users to upload videos as "Unlisted" or "Private."
49+
50+
- **Unlisted Videos**: These videos will not appear in search results or on your profile. However, anyone with the link can view the video. Please be cautious about sharing the link, as it can be accessed by anyone who has it.
51+
52+
- **Private Videos**: These videos are only accessible to you. Private videos will not be visible to the public in any way.
53+
54+
By using these features, you understand that while we take measures to protect your privacy, we cannot guarantee the security of the content you upload.
55+
56+
## 3. How We Use Your Information
57+
58+
We use the information we collect in various ways, including to:
59+
60+
- Provide, operate, and maintain our website and services
61+
- Communicate with you, either directly or through one of our partners, including for customer service, to provide you with updates and other information relating to the website, and for marketing and promotional purposes
62+
- Process your transactions and send you related information, including purchase confirmations and invoices
63+
- Find and prevent fraud
64+
65+
## 4. Disclosure of Your Information
66+
67+
We may share information we have collected about you in certain situations. Your information may be disclosed as follows:
68+
69+
### 4.1 By Law or to Protect Rights
70+
71+
If we believe the release of information about you is necessary to respond to legal process, to investigate or remedy potential violations of our policies, or to protect the rights, property, and safety of others, we may share your information as permitted or required by any applicable law, rule, or regulation.
72+
73+
### 4.2 Third-Party Service Providers
74+
75+
We may share your information with third parties that perform services for us or on our behalf, including payment processing, data analysis, email delivery, hosting services, customer service, and marketing assistance.
76+
77+
### 4.3 Business Transfers
78+
79+
We may share or transfer your information in connection with, or during negotiations of, any merger, sale of company assets, financing, or acquisition of all or a portion of our business to another company.
80+
81+
## 5. Security of Your Information
82+
83+
We use administrative, technical, and physical security measures to help protect your personal information. While we have taken reasonable steps to secure the personal information you provide to us, please be aware that no method of transmission over the Internet or method of electronic storage is 100% secure, and we cannot guarantee its absolute security.
84+
85+
## 6. Your Rights
86+
87+
Depending on your location, you may have the following rights regarding your personal information:
88+
89+
- The right to access - You have the right to request copies of your personal information.
90+
- The right to rectification - You have the right to request that we correct any information you believe is inaccurate or incomplete.
91+
- The right to erasure - You have the right to request that we erase your personal information, under certain conditions.
92+
- The right to restrict processing - You have the right to request that we restrict the processing of your personal information, under certain conditions.
93+
- The right to data portability - You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions.
94+
95+
If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us at [email protected].
96+
97+
## 7. Third-Party Websites
98+
99+
Our website may contain links to third-party websites and applications of interest, including advertisements and external services that are not affiliated with us. Once you have used these links to leave our site, any information you provide to these third parties is not covered by this Privacy Policy, and we cannot guarantee the safety and privacy of your information.
100+
101+
## 8. Changes to This Privacy Policy
102+
103+
We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page. You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
104+
105+
## 9. Contact Us
106+
107+
If you have any questions about this Privacy Policy, please contact us at [email protected].
108+
`;
109+
110+
export const Route = createFileRoute("/privacy-policy")({
111+
component: RouteComponent,
112+
});
113+
114+
function RouteComponent() {
115+
return (
116+
<div className="flex flex-col min-h-screen">
117+
<TopNav />
118+
<div className="flex items-center justify-center w-full mt-12">
119+
<div className="w-[64rem]">
120+
<StyledMarkdown>{markdown}</StyledMarkdown>
121+
</div>
122+
</div>
123+
<Footer />
124+
</div>
125+
);
126+
}

0 commit comments

Comments
 (0)