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() { {'Sign @@ -148,17 +162,24 @@ function Home() { {'Dashboard'} -
+
+ + + + 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. +
+
+ + + {'Sign + +
@@ -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