diff --git a/app/(marketing)/page.tsx b/app/(marketing)/page.tsx
index 22b6646..2298a1e 100644
--- a/app/(marketing)/page.tsx
+++ b/app/(marketing)/page.tsx
@@ -11,6 +11,7 @@ import Team from "@/components/Team";
import Pricing from "@/components/Pricing";
import Newsletter from "@/components/Newsletter";
import FAQ from "@/components/FAQ";
+import OpenSource from "@/components/OpenSource";
import Footer from "@/components/Footer";
import ScrollToTop from "@/components/ScrollToTop";
@@ -30,6 +31,7 @@ export default function Home() {
+
>
diff --git a/app/globals.css b/app/globals.css
index 52a8d2d..31dfb8c 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,76 +1,128 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
-
+
@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 0 0% 3.9%;
+ html {
+ scroll-behavior: smooth !important;
+ }
+}
- --card: 0 0% 100%;
- --card-foreground: 0 0% 3.9%;
-
- --popover: 0 0% 100%;
- --popover-foreground: 0 0% 3.9%;
-
- --primary: 0 0% 9%;
- --primary-foreground: 0 0% 98%;
-
- --secondary: 0 0% 96.1%;
- --secondary-foreground: 0 0% 9%;
-
- --muted: 0 0% 96.1%;
- --muted-foreground: 0 0% 45.1%;
-
- --accent: 0 0% 96.1%;
- --accent-foreground: 0 0% 9%;
-
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 0 0% 98%;
+/* *=========== Orange theme =========== */
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 240 10% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 3.9%;
+ --primary: 20.5 100% 62%;
+ --primary-foreground: 355.7 100% 97.3%;
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
+ --accent: 240 4.8% 95.9%;
+ --accent-foreground: 240 5.9% 10%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+ --ring: 20.5 100% 62%;
+ --radius: 0.5rem;
+ }
- --border: 0 0% 89.8%;
- --input: 0 0% 89.8%;
- --ring: 0 0% 3.9%;
-
- --radius: 0.5rem;
- }
-
- .dark {
- --background: 0 0% 3.9%;
- --foreground: 0 0% 98%;
-
- --card: 0 0% 3.9%;
- --card-foreground: 0 0% 98%;
-
- --popover: 0 0% 3.9%;
- --popover-foreground: 0 0% 98%;
-
- --primary: 0 0% 98%;
- --primary-foreground: 0 0% 9%;
-
- --secondary: 0 0% 14.9%;
- --secondary-foreground: 0 0% 98%;
-
- --muted: 0 0% 14.9%;
- --muted-foreground: 0 0% 63.9%;
-
- --accent: 0 0% 14.9%;
- --accent-foreground: 0 0% 98%;
-
- --destructive: 0 62.8% 30.6%;
- --destructive-foreground: 0 0% 98%;
-
- --border: 0 0% 14.9%;
- --input: 0 0% 14.9%;
- --ring: 0 0% 83.1%;
- }
+ .dark {
+ --background: 20 14.3% 4.1%;
+ --foreground: 0 0% 95%;
+ --card: 24 9.8% 10%;
+ --card-foreground: 0 0% 95%;
+ --popover: 0 0% 9%;
+ --popover-foreground: 0 0% 95%;
+ --primary: 20.5 96.9% 57.5%;
+ --primary-foreground: 144.9 80.4% 10%;
+ --secondary: 240 3.7% 15.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 15%;
+ --muted-foreground: 240 5% 64.9%;
+ --accent: 12 6.5% 15.1%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 85.7% 97.3%;
+ --border: 240 3.7% 15.9%;
+ --input: 240 3.7% 15.9%;
+ --ring: 20.5 96.9% 57.5%;
+ }
}
-
+
@layer base {
- * {
- @apply border-border;
- }
- body {
- @apply bg-background text-foreground;
- }
-}
\ No newline at end of file
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+/* HeroCards background shadow */
+.shadow {
+ position: absolute;
+ background: hsl(var(--primary) / 0%);
+ border-radius: 24px;
+ rotate: 35deg;
+
+ width: 260px;
+ top: 200px;
+ height: 400px;
+ filter: blur(150px);
+ animation: shadow-slide infinite 4s linear alternate;
+}
+
+@keyframes shadow-slide {
+ from {
+ background: hsl(var(--primary) / 20%);
+ right: 460px;
+ }
+ to {
+ background: hsl(var(--primary) / 80%);
+ right: 160px;
+ }
+}
+
+@media (max-width: 1024px) {
+ .shadow {
+ top: 70px;
+ }
+
+ @keyframes shadow-slide {
+ from {
+ background: hsl(var(--primary) / 20%);
+ right: 460px;
+ }
+ to {
+ background: hsl(var(--primary) / 50%);
+ right: 160px;
+ }
+ }
+}
+
+@media (max-width: 768px) {
+ .shadow {
+ top: 70px;
+ width: 100px;
+ height: 350px;
+ filter: blur(60px);
+ }
+
+ @keyframes shadow-slide {
+ from {
+ background: hsl(var(--primary) / 20%);
+ right: 280px;
+ }
+ to {
+ background: hsl(var(--primary) / 30%);
+ right: 100px;
+ }
+ }
+}
diff --git a/app/layout.tsx b/app/layout.tsx
index 7eb5c8f..f29aed6 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,6 +1,7 @@
import type { Metadata } from "next";
import { DM_Sans } from "next/font/google";
import "./globals.css";
+import { ThemeProvider } from "@/components/theme-provider";
const dmsans = DM_Sans({ subsets: ["latin"] });
@@ -11,12 +12,20 @@ export const metadata: Metadata = {
export default function RootLayout({
children,
-}: Readonly<{
+}: {
children: React.ReactNode;
-}>) {
+}) {
return (
-
-
{children}
+
+
+
+ {children}
+
+
);
}
diff --git a/components/About.tsx b/components/About.tsx
index b26ae9a..5013432 100644
--- a/components/About.tsx
+++ b/components/About.tsx
@@ -1,7 +1,40 @@
-import React from "react";
+import Statistics from "./Statistics";
const About = () => {
- return About
;
+ return (
+
+
+
+
+
+
+
+
+ About{" "}
+
+ Company
+
+
+ Lorem ipsum dolor sit amet, consectetur
+ adipiscing elit, sed do eiusmod tempor
+ incididunt ut labore et dolore magna aliqua. Ut
+ enim ad minim veniam, quis nostrud exercitation
+ ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Lorem ipsum dolor sit amet,
+ consectetur adipiscing elit.
+
+
+
+
+
+
+
+
+ );
};
export default About;
diff --git a/components/CTA.tsx b/components/CTA.tsx
index acaaa13..f31ce6f 100644
--- a/components/CTA.tsx
+++ b/components/CTA.tsx
@@ -1,7 +1,36 @@
-import React from "react";
+import { Button } from "./ui/button";
const CTA = () => {
- return CTA
;
+ return (
+
+
+
+
+ All Your
+
+ {" "}
+ Ideas & Concepts{" "}
+
+ In One Interface
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit.
+ Eaque, beatae. Ipsa tempore ipsum iste quibusdam illum
+ ducimus eos. Quasi, sed!
+
+
+
+
+
+ Request a Demo
+
+
+ View all features
+
+
+
+
+ );
};
export default CTA;
diff --git a/components/FAQ.tsx b/components/FAQ.tsx
index b3e769c..068c858 100644
--- a/components/FAQ.tsx
+++ b/components/FAQ.tsx
@@ -1,7 +1,83 @@
-import React from "react";
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+
+interface FAQProps {
+ question: string;
+ answer: string;
+ value: string;
+}
+
+const FAQList: FAQProps[] = [
+ {
+ question: "Is this template free?",
+ answer: "Yes. It is a free ChadcnUI template.",
+ value: "item-1",
+ },
+ {
+ question: "Lorem ipsum dolor sit amet consectetur adipisicing elit?",
+ answer: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint labore quidem quam? Consectetur sapiente iste rerum reiciendis animi nihil nostrum sit quo, modi quod.",
+ value: "item-2",
+ },
+ {
+ question:
+ "Lorem ipsum dolor sit amet Consectetur natus dolores minus quibusdam?",
+ answer: "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Labore qui nostrum reiciendis veritatis necessitatibus maxime quis ipsa vitae cumque quo?",
+ value: "item-3",
+ },
+ {
+ question: "Lorem ipsum dolor sit amet, consectetur adipisicing elit?",
+ answer: "Lorem ipsum dolor sit amet consectetur, adipisicing elit.",
+ value: "item-4",
+ },
+ {
+ question:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur natus?",
+ answer: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint labore quidem quam? Consectetur sapiente iste rerum reiciendis animi nihil nostrum sit quo, modi quod.",
+ value: "item-5",
+ },
+];
const FAQ = () => {
- return FAQ
;
+ return (
+
+
+ Frequently Asked{" "}
+
+ Questions
+
+
+
+
+ {FAQList.map(({ question, answer, value }: FAQProps) => (
+
+
+ {question}
+
+
+ {answer}
+
+ ))}
+
+
+
+ Still have questions?{" "}
+
+ Contact us
+
+
+
+ );
};
export default FAQ;
diff --git a/components/Features.tsx b/components/Features.tsx
index 36e9364..ea3e19f 100644
--- a/components/Features.tsx
+++ b/components/Features.tsx
@@ -1,7 +1,92 @@
-import React from "react";
+import { Badge } from "./ui/badge";
+import {
+ Card,
+ CardContent,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+
+interface FeatureProps {
+ title: string;
+ description: string;
+ image: string;
+}
+
+const features: FeatureProps[] = [
+ {
+ title: "Responsive Design",
+ description:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.",
+ image: "./growth.png",
+ },
+ {
+ title: "Intuitive user interface",
+ description:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.",
+ image: "./reflecting.png",
+ },
+ {
+ title: "AI-Powered insights",
+ description:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.",
+ image: "./looking-ahead.png",
+ },
+];
+
+const featureList: string[] = [
+ "Dark/Light theme",
+ "Reviews",
+ "Features",
+ "Pricing",
+ "Contact form",
+ "Our team",
+ "Responsive design",
+ "Newsletter",
+ "Minimalist",
+];
const Features = () => {
- return Features
;
+ return (
+
+
+ Many{" "}
+
+ Great Features
+
+
+
+
+ {featureList.map((feature: string) => (
+
+
+ {feature}
+
+
+ ))}
+
+
+
+ {features.map(({ title, description, image }: FeatureProps) => (
+
+
+ {title}
+
+
+ {description}
+
+
+
+
+
+ ))}
+
+
+ );
};
export default Features;
diff --git a/components/Footer.tsx b/components/Footer.tsx
index 0bfd7da..c1be5e5 100644
--- a/components/Footer.tsx
+++ b/components/Footer.tsx
@@ -1,7 +1,116 @@
-import React from "react";
+import { Logo } from "./Logo";
const Footer = () => {
- return Footer
;
+ return (
+
+ );
};
export default Footer;
diff --git a/components/Hero.tsx b/components/Hero.tsx
index 8656c61..ce8e420 100644
--- a/components/Hero.tsx
+++ b/components/Hero.tsx
@@ -1,7 +1,59 @@
-import React from "react";
+import { Button } from "./ui/button";
+import { buttonVariants } from "./ui/button";
+import { HeroCards } from "./HeroCards";
+import { Icons } from "@/components/Icons";
+import Link from "next/link";
const Hero = () => {
- return Hero
;
+ return (
+
+
+
+
+
+ Marketing
+ {" "}
+ template
+ {" "}
+ for{" "}
+
+
+ SaaS
+ {" "}
+ ideas.
+
+
+
+
+ A production-ready and easy to customize template, making it
+ the perfect starting point for your own project.
+
+
+
+ Get Started
+
+
+ Github
+
+
+
+
+
+ {/* Hero cards sections */}
+
+
+
+
+ {/* Shadow effect */}
+
+
+ );
};
export default Hero;
diff --git a/components/HeroCards.tsx b/components/HeroCards.tsx
index 775c6dc..536bcfb 100644
--- a/components/HeroCards.tsx
+++ b/components/HeroCards.tsx
@@ -1,7 +1,162 @@
-import React from "react";
+"use client";
-const HeroCards = () => {
- return HeroCards
;
-};
+import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar";
+import { Badge } from "./ui/badge";
+import { Button, buttonVariants } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+ CardFooter,
+} from "@/components/ui/card";
+import { Icons } from "@/components/Icons";
+import Link from "next/link";
+
+export const HeroCards = () => {
+ return (
+
+ {/* Testimonial */}
+
+
+
+
+ JD
+
+
+
+ John Doe
+ @john_doe
+
+
+
+ This landing page is phenomenal!
+
+
+ {/* Team */}
+
+
+
+ chrisstef
+
+ Frontend Developer
+
+
+
+
+
+ I enjoy transforming ideas into functional software that
+ exceeds expectations.
+
+
+
+
+
+
+ Linkedin icon
+
+
+
+ Github icon
+
+
+
+ X icon
+
+
+
+
+
-export default HeroCards;
+ {/* Pricing */}
+
+
+
+ Free
+
+ Most popular
+
+
+
+ $0
+ /month
+
+
+
+ Lorem ipsum dolor sit, amet ipsum consectetur
+ adipisicing elit.
+
+
+
+
+ Start Free Trial
+
+
+
+
+
+
+ {[
+ "4 Team members",
+ "4 GB Storage",
+ "Up to 6 pages",
+ ].map((benefit: string) => (
+
+
+
{benefit}
+
+ ))}
+
+
+
+
+ {/* Service */}
+
+
+
+
+
+
+ Light & dark mode
+
+ Lorem ipsum dolor sit amet consect adipisicing elit.
+ Consectetur natusm.
+
+
+
+
+
+ );
+};
diff --git a/components/HowWorks.tsx b/components/HowWorks.tsx
index 8d59afb..26fb198 100644
--- a/components/HowWorks.tsx
+++ b/components/HowWorks.tsx
@@ -1,7 +1,72 @@
-import React from "react";
+import { Icons } from "./Icons";
+import { Card, CardContent, CardHeader, CardTitle } from "./ui/card";
+
+interface FeatureProps {
+ icon: JSX.Element;
+ title: string;
+ description: string;
+}
+
+const features: FeatureProps[] = [
+ {
+ icon: ,
+ title: "Accesibility",
+ description:
+ "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum",
+ },
+ {
+ icon: ,
+ title: "Community",
+ description:
+ "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum",
+ },
+ {
+ icon: ,
+ title: "Scalability",
+ description:
+ "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum",
+ },
+ {
+ icon: ,
+ title: "Gamification",
+ description:
+ "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum quas provident cum",
+ },
+];
const HowWorks = () => {
- return HowWorks
;
+ return (
+
+
+ How It{" "}
+
+ Works{" "}
+
+ Step-by-Step Guide
+
+
+ Lorem ipsum dolor sit amet consectetur, adipisicing elit.
+ Veritatis dolor pariatur sit!
+
+
+
+ {features.map(({ icon, title, description }: FeatureProps) => (
+
+
+
+ {icon}
+ {title}
+
+
+ {description}
+
+ ))}
+
+
+ );
};
export default HowWorks;
diff --git a/components/Icons.tsx b/components/Icons.tsx
index 6f6be4e..cc55399 100644
--- a/components/Icons.tsx
+++ b/components/Icons.tsx
@@ -2,29 +2,27 @@ import {
AiFillGithub,
AiFillGoogleCircle,
AiOutlineClose,
- AiOutlineEllipsis,
- AiOutlinePlus,
- AiOutlineWarning,
- AiOutlineDollarCircle,
- AiOutlineBank,
- AiOutlineDashboard,
} from "react-icons/ai";
-import { BiCalendar, BiHistory } from "react-icons/bi";
+import { BiCalendar } from "react-icons/bi";
import {
- BsActivity,
- BsCheck2,
BsChevronDown,
BsChevronLeft,
BsChevronRight,
BsChevronUp,
BsFire,
} from "react-icons/bs";
-import { FaRegStar, FaSort, FaUserAlt } from "react-icons/fa";
-import { ImSpinner8, ImStatsBars } from "react-icons/im";
+import {
+ FaRegStar,
+ FaRegLightbulb,
+ FaCheck,
+ FaCode,
+ FaProjectDiagram,
+} from "react-icons/fa";
import { LuSettings } from "react-icons/lu";
-import { MdDeleteForever, MdOutlineLogout } from "react-icons/md";
-import { RxDashboard, RxMixerHorizontal } from "react-icons/rx";
-import { IoCopy } from "react-icons/io5";
+import { RxDashboard } from "react-icons/rx";
+import { IoAccessibility, IoGameControllerOutline } from "react-icons/io5";
+import { FaXTwitter, FaLinkedin, FaPeopleGroup } from "react-icons/fa6";
+import { LuRadar, LuBarChartHorizontalBig } from "react-icons/lu";
export type IconKeys = keyof typeof icons;
@@ -36,11 +34,12 @@ const icons = {
// Providers
google: AiFillGoogleCircle,
github: AiFillGithub,
+ linkedin: FaLinkedin,
+ twitter: FaXTwitter,
// Sections Icons
dashboard: RxDashboard,
settings: LuSettings,
- holdings: AiOutlineDashboard,
// Navigation
back: BsChevronLeft,
@@ -50,25 +49,18 @@ const icons = {
close: AiOutlineClose,
// Common
- trash: MdDeleteForever,
- spinner: ImSpinner8,
- userAlt: FaUserAlt,
- ellipsis: AiOutlineEllipsis,
- warning: AiOutlineWarning,
- add: AiOutlinePlus,
- history: BiHistory,
- signout: MdOutlineLogout,
calendar: BiCalendar,
- sort: FaSort,
fire: BsFire,
- statsBar: ImStatsBars,
- mixer: RxMixerHorizontal,
- check: BsCheck2,
star: FaRegStar,
- copy: IoCopy,
- dollar: AiOutlineDollarCircle,
- bank: AiOutlineBank,
- activity: BsActivity,
+ bulb: FaRegLightbulb,
+ check: FaCheck,
+ radar: LuRadar,
+ accessibility: IoAccessibility,
+ people: FaPeopleGroup,
+ scale: LuBarChartHorizontalBig,
+ gamification: IoGameControllerOutline,
+ code: FaCode,
+ project: FaProjectDiagram,
};
export const Icons: IconsType = icons;
diff --git a/components/Logo.tsx b/components/Logo.tsx
new file mode 100644
index 0000000..d7b43f0
--- /dev/null
+++ b/components/Logo.tsx
@@ -0,0 +1,10 @@
+import Image from "next/image";
+
+export const Logo = () => {
+ return (
+
+ );
+};
diff --git a/components/ModeToggle.tsx b/components/ModeToggle.tsx
index 370b0b0..6d53aec 100644
--- a/components/ModeToggle.tsx
+++ b/components/ModeToggle.tsx
@@ -1,7 +1,47 @@
-import React from "react";
+"use client";
-const ModeToggle = () => {
- return ModeToggle
;
-};
+import { Button } from "@/components/ui/button";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import { useTheme } from "next-themes";
+import { Moon, Sun } from "lucide-react";
-export default ModeToggle;
+export function ModeToggle() {
+ const { setTheme } = useTheme();
+
+ return (
+
+
+
+
+
+ Toggle theme
+
+
+
+ setTheme("light")}
+ >
+ Light
+
+ setTheme("dark")}
+ >
+ Dark
+
+ setTheme("system")}
+ >
+ System
+
+
+
+ );
+}
diff --git a/components/Navbar.tsx b/components/Navbar.tsx
index e218494..3bb415e 100644
--- a/components/Navbar.tsx
+++ b/components/Navbar.tsx
@@ -1,7 +1,163 @@
-import React from "react";
+"use client";
+
+import { useState } from "react";
+import {
+ NavigationMenu,
+ NavigationMenuItem,
+ NavigationMenuList,
+} from "@/components/ui/navigation-menu";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/components/ui/sheet";
+
+import { buttonVariants } from "./ui/button";
+import { Menu } from "lucide-react";
+import { ModeToggle } from "./ModeToggle";
+import { Icons } from "@/components/Icons";
+import Link from "next/link";
+import { Logo } from "./Logo";
+
+interface RouteProps {
+ href: string;
+ label: string;
+}
+
+const routeList: RouteProps[] = [
+ {
+ href: "#features",
+ label: "Features",
+ },
+ {
+ href: "#testimonials",
+ label: "Testimonials",
+ },
+ {
+ href: "#pricing",
+ label: "Pricing",
+ },
+ {
+ href: "#faq",
+ label: "FAQ",
+ },
+];
const Navbar = () => {
- return Navbar
;
+ const [isOpen, setIsOpen] = useState(false);
+ return (
+
+
+
+
+
+
+
+
+
+ {/* mobile */}
+
+
+
+
+ setIsOpen(true)}
+ >
+
+
+
+
+
+ SaaS Marketing
+
+
+
+
+ {routeList.map(
+ ({ href, label }: RouteProps) => (
+
+
+ setIsOpen(false)
+ }
+ className={buttonVariants(
+ {
+ variant:
+ "ghost",
+ }
+ )}
+ >
+ {label}
+
+
+ )
+ )}
+
+
+
+ Github
+
+
+
+
+
+
+ {/* desktop */}
+
+
+ {routeList.map((route: RouteProps, i) => (
+
+
+ {route.label}
+
+
+ ))}
+
+
+
+
+
+
+
+
+ Github
+
+
+
+
+
+
+
+
+
+
+ );
};
export default Navbar;
diff --git a/components/Newsletter.tsx b/components/Newsletter.tsx
index e0c4381..6781ac3 100644
--- a/components/Newsletter.tsx
+++ b/components/Newsletter.tsx
@@ -1,7 +1,47 @@
-import React from "react";
+"use client";
+
+import { Button } from "./ui/button";
+import { Input } from "./ui/input";
const Newsletter = () => {
- return Newsletter
;
+ const handleSubmit = (e: any) => {
+ e.preventDefault();
+ console.log("Subscribed!");
+ };
+
+ return (
+
+
+
+
+
+ Join Our Daily{" "}
+
+ Newsletter
+
+
+
+ Lorem ipsum dolor sit amet consectetur.
+
+
+
+
+
+
+
+ );
};
export default Newsletter;
diff --git a/components/OpenSource.tsx b/components/OpenSource.tsx
new file mode 100644
index 0000000..c05bfea
--- /dev/null
+++ b/components/OpenSource.tsx
@@ -0,0 +1,41 @@
+import Link from "next/link";
+import { cn } from "@/lib/utils";
+import { buttonVariants } from "@/components/ui/button";
+import { Icons } from "./Icons";
+
+const OpenSource = async () => {
+ const { stargazers_count: stars } = await fetch(
+ "https://api.github.com/repos/chrisstef/saas-marketing-template",
+ {
+ next: { revalidate: 60 },
+ }
+ )
+ .then((res) => res.json())
+ .catch((e) => console.error(e));
+
+ return (
+
+
+
+ Fully
+
+ {" "}
+ Open Source{" "}
+
+
+
+
+ {stars} on Github
+
+
+
+ );
+};
+
+export default OpenSource;
diff --git a/components/Pricing.tsx b/components/Pricing.tsx
index eb94f43..ad2a6a4 100644
--- a/components/Pricing.tsx
+++ b/components/Pricing.tsx
@@ -1,7 +1,152 @@
-import React from "react";
+import { Badge } from "@/components/ui/badge";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Check } from "lucide-react";
+
+enum PopularPlanType {
+ NO = 0,
+ YES = 1,
+}
+
+interface PricingProps {
+ title: string;
+ popular: PopularPlanType;
+ price: number;
+ description: string;
+ buttonText: string;
+ benefitList: string[];
+}
+
+const pricingList: PricingProps[] = [
+ {
+ title: "Free",
+ popular: 0,
+ price: 0,
+ description:
+ "Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit.",
+ buttonText: "Get Started",
+ benefitList: [
+ "1 Team member",
+ "2 GB Storage",
+ "Up to 4 pages",
+ "Community support",
+ "lorem ipsum dolor",
+ ],
+ },
+ {
+ title: "Premium",
+ popular: 1,
+ price: 5,
+ description:
+ "Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit.",
+ buttonText: "Start Free Trial",
+ benefitList: [
+ "4 Team members",
+ "4 GB Storage",
+ "Up to 6 pages",
+ "Priority support",
+ "lorem ipsum dolor",
+ ],
+ },
+ {
+ title: "Enterprise",
+ popular: 0,
+ price: 40,
+ description:
+ "Lorem ipsum dolor sit, amet ipsum consectetur adipisicing elit.",
+ buttonText: "Contact Us",
+ benefitList: [
+ "10 Team members",
+ "8 GB Storage",
+ "Up to 10 pages",
+ "Priority support",
+ "lorem ipsum dolor",
+ ],
+ },
+];
const Pricing = () => {
- return Pricing
;
+ return (
+
+
+ Get
+
+ {" "}
+ Unlimited{" "}
+
+ Access
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Alias
+ reiciendis.
+
+
+ {pricingList.map((pricing: PricingProps) => (
+
+
+
+ {pricing.title}
+ {pricing.popular === PopularPlanType.YES ? (
+
+ Most popular
+
+ ) : null}
+
+
+
+ ${pricing.price}
+
+
+ {" "}
+ /month
+
+
+
+
+ {pricing.description}
+
+
+
+
+
+ {pricing.buttonText}
+
+
+
+
+
+
+
+ {pricing.benefitList.map((benefit: string) => (
+
+ {" "}
+ {benefit}
+
+ ))}
+
+
+
+ ))}
+
+
+ );
};
export default Pricing;
diff --git a/components/ScrollToTop.tsx b/components/ScrollToTop.tsx
index 2fb9811..5a773ee 100644
--- a/components/ScrollToTop.tsx
+++ b/components/ScrollToTop.tsx
@@ -1,7 +1,42 @@
-import React from "react";
+"use client";
+
+import { useState, useEffect } from "react";
+import { Button } from "./ui/button";
+import { ArrowUpToLine } from "lucide-react";
const ScrollToTop = () => {
- return ScrollToTop
;
+ const [showTopBtn, setShowTopBtn] = useState(false);
+
+ useEffect(() => {
+ window.addEventListener("scroll", () => {
+ if (window.scrollY > 400) {
+ setShowTopBtn(true);
+ } else {
+ setShowTopBtn(false);
+ }
+ });
+ }, []);
+
+ const goToTop = () => {
+ window.scroll({
+ top: 0,
+ left: 0,
+ });
+ };
+
+ return (
+ <>
+ {showTopBtn && (
+
+
+
+ )}
+ >
+ );
};
export default ScrollToTop;
diff --git a/components/Services.tsx b/components/Services.tsx
index 0b927aa..e1a19e3 100644
--- a/components/Services.tsx
+++ b/components/Services.tsx
@@ -1,7 +1,79 @@
-import React from "react";
+import { Card, CardDescription, CardHeader, CardTitle } from "./ui/card";
+import { Icons } from "./Icons";
+
+interface ServiceProps {
+ title: string;
+ description: string;
+ icon: JSX.Element;
+}
+
+const serviceList: ServiceProps[] = [
+ {
+ title: "Code Collaboration",
+ description:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.",
+ icon: ,
+ },
+ {
+ title: "Project Management",
+ description:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.",
+ icon: ,
+ },
+ {
+ title: "Task Automation",
+ description:
+ "Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi nesciunt est nostrum omnis ab sapiente.",
+ icon: ,
+ },
+];
const Services = () => {
- return Services
;
+ return (
+
+
+
+
+
+ Client-Centric{" "}
+
+ Services
+
+
+
+ Lorem ipsum dolor sit amet consectetur, adipisicing
+ elit. Veritatis dolor.
+
+
+
+ {serviceList.map(
+ ({ icon, title, description }: ServiceProps) => (
+
+
+
+ {icon}
+
+
+ {title}
+
+ {description}
+
+
+
+
+ )
+ )}
+
+
+
+
+
+
+ );
};
export default Services;
diff --git a/components/Sponsors.tsx b/components/Sponsors.tsx
index a4f5bfb..cc4fe90 100644
--- a/components/Sponsors.tsx
+++ b/components/Sponsors.tsx
@@ -1,7 +1,57 @@
-import React from "react";
+import { Icons } from "@/components/Icons";
+
+interface SponsorProps {
+ icon: JSX.Element;
+ name: string;
+}
+
+const sponsors: SponsorProps[] = [
+ {
+ icon: ,
+ name: "Sponsor 1",
+ },
+ {
+ icon: ,
+ name: "Sponsor 2",
+ },
+ {
+ icon: ,
+ name: "Sponsor 3",
+ },
+ {
+ icon: ,
+ name: "Sponsor 4",
+ },
+ {
+ icon: ,
+ name: "Sponsor 5",
+ },
+ {
+ icon: ,
+ name: "Sponsor 6",
+ },
+];
const Sponsors = () => {
- return Sponsors
;
+ return (
+
+ );
};
export default Sponsors;
diff --git a/components/Statistics.tsx b/components/Statistics.tsx
index 4e487f7..0cbe7fa 100644
--- a/components/Statistics.tsx
+++ b/components/Statistics.tsx
@@ -1,7 +1,46 @@
import React from "react";
const Statistics = () => {
- return Statistics
;
+ interface statsProps {
+ quantity: string;
+ description: string;
+ }
+
+ const stats: statsProps[] = [
+ {
+ quantity: "1.7K+",
+ description: "Users",
+ },
+ {
+ quantity: "1.2K+",
+ description: "Subscribers",
+ },
+ {
+ quantity: "300",
+ description: "Downloads",
+ },
+ {
+ quantity: "4",
+ description: "Products",
+ },
+ ];
+
+ return (
+
+
+ {stats.map(({ quantity, description }: statsProps) => (
+
+
+ {quantity}
+
+
+ {description}
+
+
+ ))}
+
+
+ );
};
export default Statistics;
diff --git a/components/Team.tsx b/components/Team.tsx
index 4f7a8f3..f02a7ca 100644
--- a/components/Team.tsx
+++ b/components/Team.tsx
@@ -1,7 +1,174 @@
-import React from "react";
+import { buttonVariants } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Icons } from "./Icons";
+
+interface TeamProps {
+ imageUrl: string;
+ name: string;
+ position: string;
+ socialNetworks: SociaNetworkslProps[];
+}
+
+interface SociaNetworkslProps {
+ name: string;
+ url: string;
+}
+
+const teamList: TeamProps[] = [
+ {
+ imageUrl: "https://i.pravatar.cc/150?img=35",
+ name: "Emma Smith",
+ position: "Product manager",
+ socialNetworks: [
+ { name: "Linkedin", url: "https://linkedin.com" },
+ {
+ name: "Github",
+ url: "https://github.com/",
+ },
+ {
+ name: "Twitter",
+ url: "https://x.com/",
+ },
+ ],
+ },
+ {
+ imageUrl: "https://i.pravatar.cc/150?img=60",
+ name: "John Doe",
+ position: "Tech Lead",
+ socialNetworks: [
+ { name: "Linkedin", url: "https://linkedin.com" },
+ {
+ name: "Github",
+ url: "https://github.com/",
+ },
+ {
+ name: "Twitter",
+ url: "https://x.com/",
+ },
+ ],
+ },
+ {
+ imageUrl: "https://i.pravatar.cc/150?img=36",
+ name: "Ashley Ross",
+ position: "Frontend Developer",
+ socialNetworks: [
+ { name: "Linkedin", url: "https://linkedin.com" },
+
+ {
+ name: "Twitter",
+ url: "https://x.com/",
+ },
+ ],
+ },
+ {
+ imageUrl: "https://i.pravatar.cc/150?img=17",
+ name: "Bruce Rogers",
+ position: "Backend Developer",
+ socialNetworks: [
+ { name: "Linkedin", url: "https://linkedin.com" },
+ {
+ name: "Github",
+ url: "https://github.com/",
+ },
+ ],
+ },
+];
const Team = () => {
- return Team
;
+ const socialIcon = (iconName: string) => {
+ switch (iconName) {
+ case "Linkedin":
+ return ;
+
+ case "Github":
+ return ;
+
+ case "Twitter":
+ return ;
+ }
+ };
+
+ return (
+
+
+
+ Our Dedicated{" "}
+
+ Crew
+
+
+
+ Lorem ipsum dolor sit amet consectetur, adipisicing elit.
+ Veritatis dolor pariatur sit!
+
+
+
+ {teamList.map(
+ ({
+ imageUrl,
+ name,
+ position,
+ socialNetworks,
+ }: TeamProps) => (
+
+
+
+
+ {name}
+
+
+ {position}
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur
+ adipisicing elit.
+
+
+
+
+ {socialNetworks.map(
+ ({ name, url }: SociaNetworkslProps) => (
+
+ )
+ )}
+
+
+ )
+ )}
+
+
+ );
};
export default Team;
diff --git a/components/Testimonials.tsx b/components/Testimonials.tsx
index 377cd02..155b95e 100644
--- a/components/Testimonials.tsx
+++ b/components/Testimonials.tsx
@@ -1,7 +1,111 @@
-import React from "react";
+import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+
+interface TestimonialProps {
+ image: string;
+ name: string;
+ userName: string;
+ comment: string;
+}
+
+const testimonials: TestimonialProps[] = [
+ {
+ image: "https://github.com/shadcn.png",
+ name: "John Doe",
+ userName: "@john_Doe",
+ comment: "This landing page is awesome!",
+ },
+ {
+ image: "https://github.com/shadcn.png",
+ name: "John Doe 1",
+ userName: "@john_Doe1",
+ comment:
+ "Lorem ipsum dolor sit amet,empor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.",
+ },
+
+ {
+ image: "https://github.com/shadcn.png",
+ name: "John Doe 2",
+ userName: "@john_Doe2",
+ comment:
+ "Lorem ipsum dolor sit amet,exercitation. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident.",
+ },
+ {
+ image: "https://github.com/shadcn.png",
+ name: "John Doe 3",
+ userName: "@john_Doe3",
+ comment:
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.",
+ },
+ {
+ image: "https://github.com/shadcn.png",
+ name: "John Doe 4",
+ userName: "@john_Doe4",
+ comment:
+ "Lorem ipsum dolor sit amet, tempor incididunt aliqua. Ut enim ad minim veniam, quis nostrud.",
+ },
+ {
+ image: "https://github.com/shadcn.png",
+ name: "John Doe 5",
+ userName: "@john_Doe5",
+ comment:
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ },
+];
const Testimonials = () => {
- return Testimonials
;
+ return (
+
+
+ Discover Why
+
+ {" "}
+ People Love{" "}
+
+ This Landing Page
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non
+ unde error facere hic reiciendis illo
+
+
+
+ {testimonials.map(
+ ({ image, name, userName, comment }: TestimonialProps) => (
+
+
+
+
+ JD
+
+
+
+
+ {name}
+
+
+ {userName}
+
+
+
+
+ {comment}
+
+ )
+ )}
+
+
+ );
};
export default Testimonials;
diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx
index 248d7b5..6b5fce1 100644
--- a/components/theme-provider.tsx
+++ b/components/theme-provider.tsx
@@ -1,7 +1,9 @@
-import React from "react";
+"use client";
-const ThemeProvider = () => {
- return ThemeProvider
;
-};
+import * as React from "react";
+import { ThemeProvider as NextThemesProvider } from "next-themes";
+import { type ThemeProviderProps } from "next-themes/dist/types";
-export default ThemeProvider;
+export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
+ return {children} ;
+}
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
index 0ba4277..cd7d5b9 100644
--- a/components/ui/button.tsx
+++ b/components/ui/button.tsx
@@ -1,56 +1,57 @@
-import * as React from "react"
-import { Slot } from "@radix-ui/react-slot"
-import { cva, type VariantProps } from "class-variance-authority"
+import * as React from "react";
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
-import { cn } from "@/lib/utils"
+import { cn } from "@/lib/utils";
const buttonVariants = cva(
- "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-10 px-4 py-2",
- sm: "h-9 rounded-md px-3",
- lg: "h-11 rounded-md px-8",
- icon: "h-10 w-10",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-)
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-10 px-4 py-2",
+ sm: "h-9 rounded-md px-3",
+ lg: "h-11 rounded-md px-8",
+ icon: "h-10 w-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+);
export interface ButtonProps
- extends React.ButtonHTMLAttributes,
- VariantProps {
- asChild?: boolean
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean;
}
const Button = React.forwardRef(
- ({ className, variant, size, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button"
- return (
-
- )
- }
-)
-Button.displayName = "Button"
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button";
+ return (
+
+ );
+ }
+);
+Button.displayName = "Button";
-export { Button, buttonVariants }
+export { Button, buttonVariants };
diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx
index a37f17b..e0172f4 100644
--- a/components/ui/sheet.tsx
+++ b/components/ui/sheet.tsx
@@ -1,140 +1,136 @@
-"use client"
+import * as React from "react";
+import * as SheetPrimitive from "@radix-ui/react-dialog";
+import { cva, type VariantProps } from "class-variance-authority";
+import { X } from "lucide-react";
-import * as React from "react"
-import * as SheetPrimitive from "@radix-ui/react-dialog"
-import { cva, type VariantProps } from "class-variance-authority"
-import { X } from "lucide-react"
+import { cn } from "@/lib/utils";
-import { cn } from "@/lib/utils"
+const Sheet = SheetPrimitive.Root;
-const Sheet = SheetPrimitive.Root
+const SheetTrigger = SheetPrimitive.Trigger;
-const SheetTrigger = SheetPrimitive.Trigger
+const SheetClose = SheetPrimitive.Close;
-const SheetClose = SheetPrimitive.Close
-
-const SheetPortal = SheetPrimitive.Portal
+const SheetPortal = SheetPrimitive.Portal;
const SheetOverlay = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
>(({ className, ...props }, ref) => (
-
-))
-SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
+
+));
+SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
const sheetVariants = cva(
- "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
- {
- variants: {
- side: {
- top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
- bottom:
- "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
- left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
- right:
- "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
- },
- },
- defaultVariants: {
- side: "right",
- },
- }
-)
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
+ {
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+ },
+ },
+ defaultVariants: {
+ side: "right",
+ },
+ }
+);
interface SheetContentProps
- extends React.ComponentPropsWithoutRef,
- VariantProps {}
+ extends React.ComponentPropsWithoutRef,
+ VariantProps {}
const SheetContent = React.forwardRef<
- React.ElementRef,
- SheetContentProps
+ React.ElementRef,
+ SheetContentProps
>(({ side = "right", className, children, ...props }, ref) => (
-
-
-
- {children}
-
-
- Close
-
-
-
-))
-SheetContent.displayName = SheetPrimitive.Content.displayName
+
+
+
+ {children}
+
+
+ Close
+
+
+
+));
+SheetContent.displayName = SheetPrimitive.Content.displayName;
const SheetHeader = ({
- className,
- ...props
+ className,
+ ...props
}: React.HTMLAttributes) => (
-
-)
-SheetHeader.displayName = "SheetHeader"
+
+);
+SheetHeader.displayName = "SheetHeader";
const SheetFooter = ({
- className,
- ...props
+ className,
+ ...props
}: React.HTMLAttributes) => (
-
-)
-SheetFooter.displayName = "SheetFooter"
+
+);
+SheetFooter.displayName = "SheetFooter";
const SheetTitle = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
>(({ className, ...props }, ref) => (
-
-))
-SheetTitle.displayName = SheetPrimitive.Title.displayName
+
+));
+SheetTitle.displayName = SheetPrimitive.Title.displayName;
const SheetDescription = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
>(({ className, ...props }, ref) => (
-
-))
-SheetDescription.displayName = SheetPrimitive.Description.displayName
+
+));
+SheetDescription.displayName = SheetPrimitive.Description.displayName;
export {
- Sheet,
- SheetPortal,
- SheetOverlay,
- SheetTrigger,
- SheetClose,
- SheetContent,
- SheetHeader,
- SheetFooter,
- SheetTitle,
- SheetDescription,
-}
+ Sheet,
+ SheetPortal,
+ SheetOverlay,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+};
diff --git a/package.json b/package.json
index 30fc6f1..b7b399b 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"clsx": "^2.1.0",
"lucide-react": "^0.321.0",
"next": "14.1.0",
+ "next-themes": "^0.2.1",
"react": "^18",
"react-dom": "^18",
"react-icons": "^5.0.1",
diff --git a/public/cube-leg.png b/public/cube-leg.png
new file mode 100644
index 0000000..388ba8c
Binary files /dev/null and b/public/cube-leg.png differ
diff --git a/public/growth.png b/public/growth.png
new file mode 100644
index 0000000..2a04fca
Binary files /dev/null and b/public/growth.png differ
diff --git a/public/logo.svg b/public/logo.svg
new file mode 100644
index 0000000..fff049f
--- /dev/null
+++ b/public/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/looking-ahead.png b/public/looking-ahead.png
new file mode 100644
index 0000000..fc8cf55
Binary files /dev/null and b/public/looking-ahead.png differ
diff --git a/public/pilot.png b/public/pilot.png
new file mode 100644
index 0000000..e190bb2
Binary files /dev/null and b/public/pilot.png differ
diff --git a/public/reflecting.png b/public/reflecting.png
new file mode 100644
index 0000000..60101e8
Binary files /dev/null and b/public/reflecting.png differ
diff --git a/yarn.lock b/yarn.lock
index 8d696b1..7fd2591 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2162,6 +2162,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+next-themes@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45"
+ integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==
+
next@14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69"