diff --git a/src/app/page.tsx b/src/app/page.tsx
index f534eb08..de220a06 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,58 +1,103 @@
-"use client";
+import dynamic from "next/dynamic";
+import type { Metadata } from "next";
+// Static imports for above-the-fold components
import { Navbar } from "@/components/landing/Navbar";
import { Hero } from "@/components/landing/Hero";
-import { FourWays } from "@/components/landing/FourWays";
-import { ThreeSteps } from "@/components/landing/ThreeSteps";
-import { Comparison } from "@/components/landing/Comparison";
-import { Pricing } from "@/components/landing/Pricing";
-import { FinalCTA } from "@/components/landing/FinalCTA";
-import { Footer } from "@/components/landing/Footer";
-import { SEO } from "@/components/seo/SEO";
+
+// Dynamic imports for below-the-fold components
+const FourWays = dynamic(
+ () => import("@/components/landing/FourWays").then((mod) => mod.FourWays),
+ { ssr: true }
+);
+
+const ThreeSteps = dynamic(
+ () => import("@/components/landing/ThreeSteps").then((mod) => mod.ThreeSteps),
+ { ssr: true }
+);
+
+const Comparison = dynamic(
+ () => import("@/components/landing/Comparison").then((mod) => mod.Comparison),
+ { ssr: true }
+);
+
+const Pricing = dynamic(
+ () => import("@/components/landing/Pricing").then((mod) => mod.Pricing),
+ { ssr: true }
+);
+
+const FinalCTA = dynamic(
+ () => import("@/components/landing/FinalCTA").then((mod) => mod.FinalCTA),
+ { ssr: true }
+);
+
+const Footer = dynamic(
+ () => import("@/components/landing/Footer").then((mod) => mod.Footer),
+ { ssr: true }
+);
+
+// Next.js Metadata API for SEO (replaces client-side SEO component)
+export const metadata: Metadata = {
+ title: "ThinkEx",
+ description: "Study and work with information effortlessly.",
+ keywords: "AI workspace, productivity, collaboration, artificial intelligence, workspace tools, ThinkEx, AI assistant, creative workspace",
+ authors: [{ name: "ThinkEx" }],
+ openGraph: {
+ title: "ThinkEx",
+ description: "Study and work with information effortlessly.",
+ url: "https://thinkex.app",
+ siteName: "ThinkEx",
+ locale: "en_US",
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "ThinkEx",
+ description: "Study and work with information effortlessly.",
+ },
+ alternates: {
+ canonical: "https://thinkex.app",
+ },
+ robots: {
+ index: true,
+ follow: true,
+ },
+};
export default function LandingPage() {
return (
- <>
-
+
+ {/* Grid Background (static) */}
- {/* Grid Background (static) */}
+ {/* Grid Pattern */}
- {/* Grid Pattern */}
-
-
-
- {/* Content */}
-
+ className="absolute inset-0"
+ style={{
+ backgroundImage: `
+ linear-gradient(to right, rgba(255, 255, 255, 0.08) 1px, transparent 1px),
+ linear-gradient(to bottom, rgba(255, 255, 255, 0.08) 1px, transparent 1px)
+ `,
+ backgroundSize: "50px 50px",
+ }}
+ />
+
+
+ {/* Content */}
+
- >
+
);
}
diff --git a/src/components/landing/BackgroundCard.tsx b/src/components/landing/BackgroundCard.tsx
new file mode 100644
index 00000000..79c8993e
--- /dev/null
+++ b/src/components/landing/BackgroundCard.tsx
@@ -0,0 +1,49 @@
+import type { CardColor } from "@/lib/workspace-state/colors";
+import { getCardColorCSS } from "@/lib/workspace-state/colors";
+
+export interface BackgroundCardData {
+ top: string;
+ left: string;
+ width: string;
+ height: string;
+ color: CardColor;
+ rotation: number;
+}
+
+interface BackgroundCardProps {
+ card: BackgroundCardData;
+ isDesktopOnly?: boolean;
+}
+
+export function BackgroundCard({ card, isDesktopOnly = false }: BackgroundCardProps) {
+ return (
+
+ {/* Card content placeholder */}
+
+
+ );
+}
+
+// Random card colors for background
+export const cardColors: CardColor[] = [
+ "#8B5CF6", "#3B82F6", "#10B981", "#F59E0B", "#EF4444",
+ "#EC4899", "#06B6D4", "#84CC16", "#F97316", "#6366F1",
+];
diff --git a/src/components/landing/FinalCTA.tsx b/src/components/landing/FinalCTA.tsx
index 5929f2cf..64802edc 100644
--- a/src/components/landing/FinalCTA.tsx
+++ b/src/components/landing/FinalCTA.tsx
@@ -2,17 +2,10 @@
import Link from "next/link";
import { Button } from "@/components/ui/button";
-import { getCardColorCSS } from "@/lib/workspace-state/colors";
-import type { CardColor } from "@/lib/workspace-state/colors";
-
-// Random card colors for background
-const cardColors: CardColor[] = [
- "#8B5CF6", "#3B82F6", "#10B981", "#F59E0B", "#EF4444",
- "#EC4899", "#06B6D4", "#84CC16", "#F97316", "#6366F1",
-];
+import { BackgroundCard, cardColors, type BackgroundCardData } from "./BackgroundCard";
// Random card positions and sizes (static - no parallax)
-const backgroundCards = [
+const backgroundCards: BackgroundCardData[] = [
{ top: "15%", left: "10%", width: "180px", height: "140px", color: cardColors[0], rotation: -3 },
{ top: "30%", left: "75%", width: "200px", height: "160px", color: cardColors[1], rotation: 2 },
{ top: "60%", left: "15%", width: "160px", height: "120px", color: cardColors[2], rotation: -2 },
@@ -20,38 +13,6 @@ const backgroundCards = [
{ top: "20%", left: "50%", width: "170px", height: "130px", color: cardColors[4], rotation: 1 },
];
-interface BackgroundCardProps {
- card: typeof backgroundCards[0];
- isMobileOnly?: boolean;
-}
-
-function BackgroundCard({ card, isMobileOnly = false }: BackgroundCardProps) {
- return (
-
- {/* Card content placeholder */}
-
-
- );
-}
-
export function FinalCTA() {
return (
{/* Static Background Cards */}
{backgroundCards.map((card, index) => {
- const isMobileOnly = index >= 3;
+ const isDesktopOnly = index >= 3;
return (
);
})}
@@ -101,14 +62,15 @@ export function FinalCTA() {
-
-
+
+
Get Started
-
-
+
+
diff --git a/src/components/landing/Footer.tsx b/src/components/landing/Footer.tsx
index 6d9f8f07..a7b6607b 100644
--- a/src/components/landing/Footer.tsx
+++ b/src/components/landing/Footer.tsx
@@ -17,8 +17,8 @@ export function Footer() {
alt="ThinkEx Logo"
width={24}
height={24}
+ loading="lazy"
className="object-contain"
- priority
/>
ThinkEx
diff --git a/src/components/landing/FourWays.tsx b/src/components/landing/FourWays.tsx
index 0a291a13..b9db7edf 100644
--- a/src/components/landing/FourWays.tsx
+++ b/src/components/landing/FourWays.tsx
@@ -95,14 +95,9 @@ export function FourWays() {
className={`space-y-4 md:space-y-6 ${way.imageSide === "left" ? "md:col-start-2" : ""
}`}
>
-
-
- {index + 1}
-
-
- {way.title}
-
-
+
+ {way.title}
+