├── src
├── components
│ └── .gitkeep
├── app
│ ├── favicon.ico
│ ├── layout.tsx
│ ├── page.tsx
│ └── globals.css
├── assets
│ ├── cog.png
│ ├── star.png
│ ├── tube.png
│ ├── noodle.png
│ ├── spring.png
│ ├── avatar-1.png
│ ├── avatar-2.png
│ ├── avatar-3.png
│ ├── avatar-4.png
│ ├── avatar-5.png
│ ├── avatar-6.png
│ ├── avatar-7.png
│ ├── avatar-8.png
│ ├── avatar-9.png
│ ├── cylinder.png
│ ├── logo-acme.png
│ ├── logo-apex.png
│ ├── logo-echo.png
│ ├── logosaas.png
│ ├── pyramid.png
│ ├── logo-pulse.png
│ ├── logo-celestial.png
│ ├── logo-quantum.png
│ ├── product-image.png
│ ├── social-x.svg
│ ├── social-linkedin.svg
│ ├── arrow-right.svg
│ ├── check.svg
│ ├── social-pin.svg
│ ├── menu.svg
│ ├── social-youtube.svg
│ └── social-insta.svg
└── sections
│ ├── Footer.tsx
│ ├── Header.tsx
│ ├── CallToAction.tsx
│ ├── LogoTicker.tsx
│ ├── ProductShowcase.tsx
│ ├── Hero.tsx
│ ├── Pricing.tsx
│ └── Testimonials.tsx
├── .eslintrc.json
├── postcss.config.mjs
├── .gitignore
├── tailwind.config.ts
├── tsconfig.json
├── package.json
├── next.config.mjs
└── README.md
/src/components/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/app/favicon.ico
--------------------------------------------------------------------------------
/src/assets/cog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/cog.png
--------------------------------------------------------------------------------
/src/assets/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/star.png
--------------------------------------------------------------------------------
/src/assets/tube.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/tube.png
--------------------------------------------------------------------------------
/src/assets/noodle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/noodle.png
--------------------------------------------------------------------------------
/src/assets/spring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/spring.png
--------------------------------------------------------------------------------
/src/assets/avatar-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-1.png
--------------------------------------------------------------------------------
/src/assets/avatar-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-2.png
--------------------------------------------------------------------------------
/src/assets/avatar-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-3.png
--------------------------------------------------------------------------------
/src/assets/avatar-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-4.png
--------------------------------------------------------------------------------
/src/assets/avatar-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-5.png
--------------------------------------------------------------------------------
/src/assets/avatar-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-6.png
--------------------------------------------------------------------------------
/src/assets/avatar-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-7.png
--------------------------------------------------------------------------------
/src/assets/avatar-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-8.png
--------------------------------------------------------------------------------
/src/assets/avatar-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/avatar-9.png
--------------------------------------------------------------------------------
/src/assets/cylinder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/cylinder.png
--------------------------------------------------------------------------------
/src/assets/logo-acme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logo-acme.png
--------------------------------------------------------------------------------
/src/assets/logo-apex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logo-apex.png
--------------------------------------------------------------------------------
/src/assets/logo-echo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logo-echo.png
--------------------------------------------------------------------------------
/src/assets/logosaas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logosaas.png
--------------------------------------------------------------------------------
/src/assets/pyramid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/pyramid.png
--------------------------------------------------------------------------------
/src/assets/logo-pulse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logo-pulse.png
--------------------------------------------------------------------------------
/src/assets/logo-celestial.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logo-celestial.png
--------------------------------------------------------------------------------
/src/assets/logo-quantum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/logo-quantum.png
--------------------------------------------------------------------------------
/src/assets/product-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/harshxraj/saas-landing-nextjs/HEAD/src/assets/product-image.png
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/src/assets/social-x.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss";
2 |
3 | const config: Config = {
4 | content: [
5 | "./src/sections/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
7 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
8 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
9 | ],
10 | theme: {
11 | screens: {
12 | sm: "375px",
13 | md: "768px",
14 | lg: "1200px",
15 | },
16 | extend: {
17 | container: {
18 | center: true,
19 | padding: {
20 | DEFAULT: "20px",
21 | lg: "80px",
22 | },
23 | },
24 | },
25 | },
26 | plugins: [],
27 | };
28 |
29 | export default config;
30 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["dom", "dom.iterable", "esnext"],
4 | "allowJs": true,
5 | "skipLibCheck": true,
6 | "strict": true,
7 | "noEmit": true,
8 | "esModuleInterop": true,
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "jsx": "preserve",
14 | "incremental": true,
15 | "plugins": [
16 | {
17 | "name": "next"
18 | }
19 | ],
20 | "paths": {
21 | "@/*": ["./src/*"]
22 | }
23 | },
24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
25 | "exclude": ["node_modules"]
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { DM_Sans } from "next/font/google";
3 | import "./globals.css";
4 | import { twMerge } from "tailwind-merge";
5 |
6 | const dmSans = DM_Sans({ subsets: ["latin"] });
7 |
8 | export const metadata: Metadata = {
9 | title: "Saas Landing Page",
10 | description: "SaaS Landing Page with React, Next.js, TailwindCSS & Framer Motion",
11 | };
12 |
13 | export default function RootLayout({
14 | children,
15 | }: Readonly<{
16 | children: React.ReactNode;
17 | }>) {
18 | return (
19 |
20 |
{children}
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import { CallToAction } from "@/sections/CallToAction";
2 | import { Footer } from "@/sections/Footer";
3 | import { Header } from "@/sections/Header";
4 | import { Hero } from "@/sections/Hero";
5 | import { LogoTicker } from "@/sections/LogoTicker";
6 | import { Pricing } from "@/sections/Pricing";
7 | import { ProductShowcase } from "@/sections/ProductShowcase";
8 | import { Testimonials } from "@/sections/Testimonials";
9 |
10 | export default function Home() {
11 | return (
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "light-saas-landing-page",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "framer-motion": "^11.2.14",
13 | "next": "14.2.4",
14 | "react": "^18",
15 | "react-dom": "^18"
16 | },
17 | "devDependencies": {
18 | "@svgr/webpack": "^8.1.0",
19 | "@types/node": "^20",
20 | "@types/react": "^18",
21 | "@types/react-dom": "^18",
22 | "eslint": "^8",
23 | "eslint-config-next": "14.2.4",
24 | "postcss": "^8",
25 | "tailwind-merge": "^2.4.0",
26 | "tailwindcss": "^3.4.1",
27 | "typescript": "^5"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/assets/social-linkedin.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/assets/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/assets/check.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | webpack(config) {
4 | // Grab the existing rule that handles SVG imports
5 | const fileLoaderRule = config.module.rules.find((rule) =>
6 | rule.test?.test?.(".svg")
7 | );
8 |
9 | config.module.rules.push(
10 | // Reapply the existing rule, but only for svg imports ending in ?url
11 | {
12 | ...fileLoaderRule,
13 | test: /\.svg$/i,
14 | resourceQuery: /url/, // *.svg?url
15 | },
16 | // Convert all other *.svg imports to React components
17 | {
18 | test: /\.svg$/i,
19 | issuer: fileLoaderRule.issuer,
20 | resourceQuery: { not: [...fileLoaderRule.resourceQuery.not, /url/] }, // exclude if *.svg?url
21 | use: ["@svgr/webpack"],
22 | }
23 | );
24 |
25 | // Modify the file loader rule to ignore *.svg, since we have it handled now.
26 | fileLoaderRule.exclude = /\.svg$/i;
27 |
28 | return config;
29 | },
30 |
31 | // ...other config
32 | };
33 |
34 | export default nextConfig;
35 |
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @layer components {
6 | .btn {
7 | @apply px-4 py-2 rounded-lg font-medium inline-flex items-center justify-center tracking-tight;
8 | }
9 |
10 | .btn-primary {
11 | @apply bg-black text-white;
12 | }
13 |
14 | .btn-text {
15 | @apply text-black bg-transparent;
16 | }
17 |
18 | .logo-ticker-image {
19 | @apply h-8 w-auto;
20 | }
21 |
22 | .tag {
23 | @apply text-sm inline-flex border border-[#222]/10 px-3 py-1 rounded-lg tracking-tight;
24 | }
25 |
26 | .section-title {
27 | @apply text-center text-3xl md:text-[54px] md:leading-[60px] font-bold tracking-tighter bg-gradient-to-b from-black to-[#001E80] text-transparent bg-clip-text;
28 | }
29 |
30 | .section-des {
31 | @apply text-center text-[22px] leading-[30px] tracking-tight text-[#010D3E];
32 | }
33 |
34 | .section-heading {
35 | @apply max-w-[540px] mx-auto;
36 | }
37 |
38 | .card {
39 | @apply p-10 rounded-3xl border border-[#F1F1F1] shadow-[0_7px_14px_#EAEAEA] max-w-xs w-full;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/assets/social-pin.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/assets/menu.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/assets/social-youtube.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/sections/Footer.tsx:
--------------------------------------------------------------------------------
1 | import logo from "@/assets/logosaas.png";
2 | import SocialX from "@/assets/social-x.svg";
3 | import SocialInsta from "@/assets/social-insta.svg";
4 | import SocialLinkedin from "@/assets/social-linkedin.svg";
5 | import SocialPin from "@/assets/social-pin.svg";
6 | import SocialYoutube from "@/assets/social-youtube.svg";
7 | import Image from "next/image";
8 |
9 | export const Footer = () => {
10 | return (
11 |
35 | );
36 | };
37 |
--------------------------------------------------------------------------------
/src/sections/Header.tsx:
--------------------------------------------------------------------------------
1 | import ArrowRight from "@/assets/arrow-right.svg";
2 | import Logo from "@/assets/logosaas.png";
3 | import Image from "next/image";
4 | import MenuIcon from "@/assets/menu.svg";
5 |
6 | export const Header = () => {
7 | return (
8 |
36 | );
37 | };
38 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SaaS Landing Page
2 |
3 | Welcome to the Stunning SaaS Landing Page project! This project is built with React, Next.js, TailwindCSS, and Framer Motion. It aims to provide a visually appealing and highly performant landing page for SaaS products.
4 |
5 | ## Table of Contents
6 |
7 | - [Demo](#demo)
8 | - [Features](#features)
9 | - [Technologies Used](#technologies-used)
10 | - [Installation](#installation)
11 | - [Usage](#usage)
12 | - [Preview](#preview)
13 |
14 | ## Demo
15 | Check out the live demo of the project [here](https://saas-landing-nextjs.vercel.app/).
16 |
17 | ## Features
18 | - Responsive design
19 | - Smooth animations with Framer Motion
20 | - Modern UI with TailwindCSS
21 | - Server-side rendering with Next.js
22 | - Easy to customize
23 |
24 | ## Technologies Used
25 | - **React**: A JavaScript library for building user interfaces
26 | - **Next.js**: A React framework with server-side rendering capabilities
27 | - **TailwindCSS**: A utility-first CSS framework for rapid UI development
28 | - **Framer Motion**: A library for creating animations in React
29 |
30 | ## Installation
31 | To get started with this project, clone the repository and install the dependencies:
32 |
33 | ```bash
34 | git clone https://github.com/harshxraj/saas-landing-nextjs.git
35 | cd saas-landing-nextjs
36 | npm install
37 | ```
38 |
39 | ## Usage
40 | To start the development server, run:
41 |
42 | ```bash
43 | npm run dev
44 | ```
45 |
46 | Open [http://localhost:3000](http://localhost:3000) in your browser to see the project.
47 |
48 | ## Preview
49 | 
50 |
51 |
52 |
--------------------------------------------------------------------------------
/src/assets/social-insta.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/sections/CallToAction.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import ArrowRight from "@/assets/arrow-right.svg";
3 | import starImage from "@/assets/star.png";
4 | import springImage from "@/assets/spring.png";
5 | import { motion, useScroll, useTransform } from "framer-motion";
6 | import { useRef } from "react";
7 |
8 | export const CallToAction = () => {
9 | const sectionRef = useRef(null);
10 | const { scrollYProgress } = useScroll({
11 | target: sectionRef,
12 | offset: ["start end", "end start"],
13 | });
14 |
15 | const translateY = useTransform(scrollYProgress, [0, 1], [150, -150]);
16 |
17 | return (
18 |
19 |
20 |
21 |
Sign up for free today
22 |
23 | Celebrate the joy of accomplishment with an app designed to track your progress and motivate your
24 | efforts.
25 |
26 |
27 |
36 |
45 |
46 |
47 |
48 |
49 |
53 |
54 |
55 |
56 | );
57 | };
58 |
--------------------------------------------------------------------------------
/src/sections/LogoTicker.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import acmeLogo from "@/assets/logo-acme.png";
3 | import quantamLogo from "@/assets/logo-quantum.png";
4 | import echoLogo from "@/assets/logo-echo.png";
5 | import celestialLogo from "@/assets/logo-celestial.png";
6 | import pulseLogo from "@/assets/logo-pulse.png";
7 | import apexLogo from "@/assets/logo-apex.png";
8 | import { motion } from "framer-motion";
9 | import Image from "next/image";
10 |
11 | export const LogoTicker = () => {
12 | return (
13 |
14 |
15 |
19 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | );
49 | };
50 |
--------------------------------------------------------------------------------
/src/sections/ProductShowcase.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import productImage from "@/assets/product-image.png";
3 | import pyramidImage from "@/assets/pyramid.png";
4 | import tubeImage from "@/assets/tube.png";
5 | import Image from "next/image";
6 | import { motion, useScroll, useTransform } from "framer-motion";
7 | import { useRef } from "react";
8 |
9 | export const ProductShowcase = () => {
10 | const sectionRef = useRef(null);
11 | const { scrollYProgress } = useScroll({
12 | target: sectionRef,
13 | offset: ["start end", "end start"],
14 | });
15 |
16 | const translateY = useTransform(scrollYProgress, [0, 1], [150, -150]);
17 |
18 | return (
19 |
20 |
21 |
22 |
23 |
Boost your productivity
24 |
25 |
26 |
27 | A more effective way to track progress
28 |
29 |
30 | Effortlessly turn your ideas into a fully functional, responsive, SaaS website in just minutes
31 | with this template.
32 |
33 |
34 |
35 |
36 |
37 |
47 |
57 |
58 |
59 |
60 | );
61 | };
62 |
--------------------------------------------------------------------------------
/src/sections/Hero.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import ArrowIcon from "@/assets/arrow-right.svg";
3 | import cogImage from "@/assets/cog.png";
4 | import cylinderImage from "@/assets/cylinder.png";
5 | import noodleImage from "@/assets/noodle.png";
6 | import { motion, useScroll, useTransform, useMotionValueEvent } from "framer-motion";
7 | import Image from "next/image";
8 | import { useRef } from "react";
9 |
10 | export const Hero = () => {
11 | const heroRef = useRef(null);
12 | const { scrollYProgress } = useScroll({
13 | target: heroRef,
14 | offset: ["start end", "end start"],
15 | });
16 |
17 | const translateY = useTransform(scrollYProgress, [0, 1], [150, -150]);
18 |
19 | return (
20 |
25 |
26 |
27 |
28 |
29 | Version 2.0 is here
30 |
31 |
32 | Pathway to productivity
33 |
34 |
35 | Celebrate the joy of accomplishment with an app designed to track your progress, motivate your
36 | efforts, and celebrate your success.
37 |
38 |
39 |
40 |
44 |
45 |
46 |
47 |
61 |
71 |
81 |
82 |
83 |
84 |
85 | );
86 | };
87 |
--------------------------------------------------------------------------------
/src/sections/Pricing.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import CheckIcon from "@/assets/check.svg";
3 | import { twMerge } from "tailwind-merge";
4 | import { motion } from "framer-motion";
5 |
6 | const pricingTiers = [
7 | {
8 | title: "Free",
9 | monthlyPrice: 0,
10 | buttonText: "Get started for free",
11 | popular: false,
12 | inverse: false,
13 | features: [
14 | "Up to 5 project members",
15 | "Unlimited tasks and projects",
16 | "2GB storage",
17 | "Integrations",
18 | "Basic support",
19 | ],
20 | },
21 | {
22 | title: "Pro",
23 | monthlyPrice: 9,
24 | buttonText: "Sign up now",
25 | popular: true,
26 | inverse: true,
27 | features: [
28 | "Up to 50 project members",
29 | "Unlimited tasks and projects",
30 | "50GB storage",
31 | "Integrations",
32 | "Priority support",
33 | "Advanced support",
34 | "Export support",
35 | ],
36 | },
37 | {
38 | title: "Business",
39 | monthlyPrice: 19,
40 | buttonText: "Sign up now",
41 | popular: false,
42 | inverse: false,
43 | features: [
44 | "Up to 5 project members",
45 | "Unlimited tasks and projects",
46 | "200GB storage",
47 | "Integrations",
48 | "Dedicated account manager",
49 | "Custom fields",
50 | "Advanced analytics",
51 | "Export capabilities",
52 | "API access",
53 | "Advanced security features",
54 | ],
55 | },
56 | ];
57 |
58 | export const Pricing = () => {
59 | return (
60 |
61 |
62 |
63 |
Pricing
64 |
65 | Free forever. Upgrade for unlimited tasks, better security, and exclusive features.
66 |
67 |
68 |
69 |
70 | {pricingTiers.map(({ title, monthlyPrice, buttonText, popular, features, inverse }) => (
71 |
78 |
79 |
80 | {title}
81 |
82 | {popular && (
83 |
84 |
96 | Popular
97 |
98 |
99 | )}
100 |
101 |
102 | ${monthlyPrice}
103 | /month
104 |
105 |
110 |
111 | {features.map((feature) => (
112 | -
113 |
114 | {feature}
115 |
116 | ))}
117 |
118 |
119 | ))}
120 |
121 |
122 |
123 | );
124 | };
125 |
--------------------------------------------------------------------------------
/src/sections/Testimonials.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import avatar1 from "@/assets/avatar-1.png";
3 | import avatar2 from "@/assets/avatar-2.png";
4 | import avatar3 from "@/assets/avatar-3.png";
5 | import avatar4 from "@/assets/avatar-4.png";
6 | import avatar5 from "@/assets/avatar-5.png";
7 | import avatar6 from "@/assets/avatar-6.png";
8 | import avatar7 from "@/assets/avatar-7.png";
9 | import avatar8 from "@/assets/avatar-8.png";
10 | import avatar9 from "@/assets/avatar-9.png";
11 | import Image from "next/image";
12 | import React, { use } from "react";
13 | import { twMerge } from "tailwind-merge";
14 | import { motion } from "framer-motion";
15 |
16 | const testimonials = [
17 | {
18 | text: "As a seasoned designer always on the lookout for innovative tools, Framer.com instantly grabbed my attention.",
19 | imageSrc: avatar1.src,
20 | name: "Jamie Rivera",
21 | username: "@jamietechguru00",
22 | },
23 | {
24 | text: "Our team's productivity has skyrocketed since we started using this tool. ",
25 | imageSrc: avatar2.src,
26 | name: "Josh Smith",
27 | username: "@jjsmith",
28 | },
29 | {
30 | text: "This app has completely transformed how I manage my projects and deadlines.",
31 | imageSrc: avatar3.src,
32 | name: "Morgan Lee",
33 | username: "@morganleewhiz",
34 | },
35 | {
36 | text: "I was amazed at how quickly we were able to integrate this app into our workflow.",
37 | imageSrc: avatar4.src,
38 | name: "Casey Jordan",
39 | username: "@caseyj",
40 | },
41 | {
42 | text: "Planning and executing events has never been easier. This app helps me keep track of all the moving parts, ensuring nothing slips through the cracks.",
43 | imageSrc: avatar5.src,
44 | name: "Taylor Kim",
45 | username: "@taylorkimm",
46 | },
47 | {
48 | text: "The customizability and integration capabilities of this app are top-notch.",
49 | imageSrc: avatar6.src,
50 | name: "Riley Smith",
51 | username: "@rileysmith1",
52 | },
53 | {
54 | text: "Adopting this app for our team has streamlined our project management and improved communication across the board.",
55 | imageSrc: avatar7.src,
56 | name: "Jordan Patels",
57 | username: "@jpatelsdesign",
58 | },
59 | {
60 | text: "With this app, we can easily assign tasks, track progress, and manage documents all in one place.",
61 | imageSrc: avatar8.src,
62 | name: "Sam Dawson",
63 | username: "@dawsontechtips",
64 | },
65 | {
66 | text: "Its user-friendly interface and robust features support our diverse needs.",
67 | imageSrc: avatar9.src,
68 | name: "Casey Harper",
69 | username: "@casey09",
70 | },
71 | ];
72 |
73 | const firstColumn = testimonials.slice(0, 3);
74 | const secondColumn = testimonials.slice(3, 6);
75 | const thirdColumn = testimonials.slice(6, 9);
76 |
77 | const TestimonialsColumn = (props: {
78 | className?: string;
79 | testimonials: typeof testimonials;
80 | duration?: number;
81 | }) => {
82 | return (
83 |
84 |
96 | {[
97 | ...new Array(2).fill(0).map((_, index) => (
98 |
99 | {props.testimonials.map(({ text, imageSrc, name, username }) => (
100 |
101 |
{text}
102 |
103 |
110 |
111 |
{name}
112 |
{username}
113 |
114 |
115 |
116 | ))}
117 |
118 | )),
119 | ]}
120 |
121 |
122 | );
123 | };
124 |
125 | export const Testimonials = () => {
126 | return (
127 |
128 |
129 |
130 |
133 |
134 |
What our users say
135 |
136 | From intuitive design to powerful features, out app has become an essential tool for users around
137 | the world.
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 | );
149 | };
150 |
--------------------------------------------------------------------------------