diff --git a/apps/web/app/(marketing)/page.tsx b/apps/web/app/(marketing)/page.tsx
index 5ab32a095..241392cad 100644
--- a/apps/web/app/(marketing)/page.tsx
+++ b/apps/web/app/(marketing)/page.tsx
@@ -1,11 +1,18 @@
import Image from 'next/image';
import Link from 'next/link';
-import { ChevronRight, Sparkle } from 'lucide-react';
+import {
+ ChevronRight,
+ CreditCard,
+ LayoutDashboard,
+ Lock,
+ Sparkle,
+} from 'lucide-react';
import { PricingTable } from '@kit/billing-gateway/components';
import { Button } from '@kit/ui/button';
import { Heading } from '@kit/ui/heading';
+import { cn } from '@kit/ui/utils';
import billingConfig from '~/config/billing.config';
import pathsConfig from '~/config/paths.config';
@@ -115,10 +122,17 @@ function Home() {
-
+
+
+
+
+
Authentication
-
+
Secure and Easy-to-Use Authentication for Your SaaS Website
and API
@@ -136,8 +150,8 @@ function Home() {
@@ -148,17 +162,24 @@ function Home() {
-
+
+
+
+
+
Dashboard
-
+
A fantastic dashboard to manage your SaaS business
@@ -170,6 +191,41 @@ function Home() {
+
+
+
+
+
+
+
+
+ Billing
+
+
+ A powerful billing system for your SaaS business
+
+
+
+
+ Powerful billing system that supports multiple payment gateways
+ such as Stripe, Lemon Squeezy and Paddle. Fully customizable and
+ easy to use.
+
+
+
+
+
+
+
@@ -180,16 +236,17 @@ function Home() {
}
>
-
- Get started for free. No credit card required. Cancel anytime.
-
+
Get started for free. No credit card required.
- Ready to take your SaaS business to the next level?
+ Fair pricing for all types of SaaS businesses
-
+
Get started on our free plan and upgrade when you are ready.
@@ -281,3 +338,22 @@ function MainCallToActionButton() {
);
}
+
+function IconContainer(
+ props: React.PropsWithChildren<{
+ className?: string;
+ }>,
+) {
+ return (
+
+
+ {props.children}
+
+
+ );
+}
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx
index 1d7bb548f..cdfad4b52 100644
--- a/apps/web/app/layout.tsx
+++ b/apps/web/app/layout.tsx
@@ -24,22 +24,23 @@ export default async function RootLayout({
children: React.ReactNode;
}) {
const { language } = await createI18nServerInstance();
+ const theme = getTheme();
return (
-
+
- {children}
+
+ {children}
+
);
}
-function getClassName() {
- const themeCookie = cookies().get('theme')?.value;
- const theme = themeCookie ?? appConfig.theme;
+function getClassName(theme?: string) {
const dark = theme === 'dark';
return cn(
@@ -51,6 +52,10 @@ function getClassName() {
);
}
+function getTheme() {
+ return cookies().get('theme')?.value;
+}
+
export const metadata = {
title: appConfig.name,
description: appConfig.description,
diff --git a/apps/web/components/root-providers.tsx b/apps/web/components/root-providers.tsx
index 41f6d1f99..ad69e9c27 100644
--- a/apps/web/components/root-providers.tsx
+++ b/apps/web/components/root-providers.tsx
@@ -33,9 +33,11 @@ const CaptchaTokenSetter = dynamic(async () => {
export function RootProviders({
lang,
+ theme = appConfig.theme,
children,
}: React.PropsWithChildren<{
lang: string;
+ theme?: string;
}>) {
const i18nSettings = getI18nSettings(lang);
@@ -51,7 +53,7 @@ export function RootProviders({
attribute="class"
enableSystem
disableTransitionOnChange
- defaultTheme={appConfig.theme}
+ defaultTheme={theme}
>
{children}
diff --git a/apps/web/public/images/billing.webp b/apps/web/public/images/billing.webp
new file mode 100644
index 000000000..1211f4f68
Binary files /dev/null and b/apps/web/public/images/billing.webp differ
diff --git a/apps/web/public/images/dashboard.webp b/apps/web/public/images/dashboard.webp
index 5011f4e47..2bae78770 100644
Binary files a/apps/web/public/images/dashboard.webp and b/apps/web/public/images/dashboard.webp differ
diff --git a/apps/web/public/images/sign-in.webp b/apps/web/public/images/sign-in.webp
index 4f288ae50..7fe8bee28 100644
Binary files a/apps/web/public/images/sign-in.webp and b/apps/web/public/images/sign-in.webp differ