Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/frontend/src/pages/LandingPage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -528,10 +528,13 @@ export default function Landing(): JSX.Element {
<div className="text-sm font-semibold">Legal & Company</div>
<ul className="mt-3 space-y-2 text-sm text-white/70">
<li>
<a href="#privacy">Privacy Policy</a>
<a href="/privacy-policy">Privacy Policy</a>
</li>
<li>
<a href="#terms">Terms of Service</a>
<a href="/terms-of-service">Terms of Service</a>
</li>
<li>
<a href="/refund-policy">Refund Policy</a>
</li>
<li>
<a href="#careers">Careers</a>
Expand All @@ -545,4 +548,4 @@ export default function Landing(): JSX.Element {
</footer>
</div>
);
}
}
42 changes: 42 additions & 0 deletions src/frontend/src/pages/PrivacyPolicyPage/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { Link } from "react-router-dom";

export default function PrivacyPolicyPage() {
return (
<div className="min-h-screen bg-white text-gray-900">
<main className="mx-auto flex w-full max-w-3xl flex-col gap-6 px-6 py-12">
<div className="flex flex-col gap-2">
<Link to="/" className="text-sm font-medium text-blue-600">
← Back to home
</Link>
<h1 className="text-3xl font-semibold">Privacy Policy</h1>
<p className="text-sm text-gray-500">Last updated: March 2025</p>
</div>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Information we collect</h2>
<p>
We collect information you provide when creating an account,
subscribing, or contacting support. We also collect usage data to
operate and improve the platform.
</p>
</section>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Payment processing</h2>
<p>
Subscription payments are processed by Paddle. We do not store your
full payment card details on our servers.
</p>
</section>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Service delivery</h2>
<p>
The platform is delivered through automated systems. There are no
human-driven services involved in fulfilling the service.
</p>
</section>
</main>
</div>
);
}
38 changes: 38 additions & 0 deletions src/frontend/src/pages/RefundPolicyPage/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Link } from "react-router-dom";

export default function RefundPolicyPage() {
return (
<div className="min-h-screen bg-white text-gray-900">
<main className="mx-auto flex w-full max-w-3xl flex-col gap-6 px-6 py-12">
<div className="flex flex-col gap-2">
<Link to="/" className="text-sm font-medium text-blue-600">
← Back to home
</Link>
<h1 className="text-3xl font-semibold">Refund Policy</h1>
<p className="text-sm text-gray-500">Last updated: March 2025</p>
</div>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Monthly subscriptions</h2>
<p>
Subscriptions are billed on a monthly recurring basis. Once a
payment is made, your subscription remains active until the end of
that billing month.
</p>
<p>
If you cancel, your subscription will stay active until the month
ends and will not renew for the following month.
</p>
</section>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">No refunds</h2>
<p>
All payments are final. We do not provide refunds after a payment is
made.
</p>
</section>
</main>
</div>
);
}
44 changes: 44 additions & 0 deletions src/frontend/src/pages/TermsOfServicePage/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { Link } from "react-router-dom";

export default function TermsOfServicePage() {
return (
<div className="min-h-screen bg-white text-gray-900">
<main className="mx-auto flex w-full max-w-3xl flex-col gap-6 px-6 py-12">
<div className="flex flex-col gap-2">
<Link to="/" className="text-sm font-medium text-blue-600">
← Back to home
</Link>
<h1 className="text-3xl font-semibold">Terms of Service</h1>
<p className="text-sm text-gray-500">Last updated: March 2025</p>
</div>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Service overview</h2>
<p>
Drag &amp; Drop AI Agent Builder provides an automated software
platform. There are no human-driven services involved in this
offering.
</p>
</section>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Subscriptions and billing</h2>
<p>
Plans are billed as monthly recurring subscriptions. Once a
subscription payment is made, access is active for the remainder of
that billing month.
</p>
<p>
If you cancel your subscription, it remains active until the end of
the current billing month and will not renew.
</p>
</section>

<section className="flex flex-col gap-3">
<h2 className="text-xl font-semibold">Refunds</h2>
<p>All payments are final. We do not offer refunds.</p>
</section>
</main>
</div>
);
}
31 changes: 30 additions & 1 deletion src/frontend/src/routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ const LoginAdminPage = lazy(() =>
const AdminPage = lazy(() => import("./pages/AdminPage"));
const DeleteAccountPage = lazy(() => import("./pages/DeleteAccountPage"));
const PlaygroundPage = lazy(() => import("./pages/Playground"));
const TermsOfServicePage = lazy(() => import("./pages/TermsOfServicePage"));
const PrivacyPolicyPage = lazy(() => import("./pages/PrivacyPolicyPage"));
const RefundPolicyPage = lazy(() => import("./pages/RefundPolicyPage"));

// ---- Router ----
const router = createBrowserRouter(
Expand Down Expand Up @@ -372,6 +375,32 @@ const router = createBrowserRouter(
</Route>
</Route>

{/* Public policy routes */}
<Route
path="terms-of-service"
element={
<Suspense fallback={<LoadingPage />}>
<TermsOfServicePage />
</Suspense>
}
/>
<Route
path="privacy-policy"
element={
<Suspense fallback={<LoadingPage />}>
<PrivacyPolicyPage />
</Suspense>
}
/>
<Route
path="refund-policy"
element={
<Suspense fallback={<LoadingPage />}>
<RefundPolicyPage />
</Suspense>
}
/>

{/* Auth routes */}
<Route
path="login"
Expand Down Expand Up @@ -420,4 +449,4 @@ const router = createBrowserRouter(
{ basename: BASENAME || undefined },
);

export default router;
export default router;
Loading