├── .env.example
├── .eslintrc.json
├── .gitignore
├── README.md
├── next.config.mjs
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── public
└── images
│ ├── hero-chart.webp
│ ├── hero-mockup.webp
│ ├── hero-transactions.webp
│ ├── mockup-1.webp
│ ├── mockup-2.webp
│ ├── testimonial-1.webp
│ ├── testimonial-2.webp
│ └── testimonial-3.webp
├── src
├── app
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.tsx
│ └── page.tsx
├── components
│ ├── AppStoreButton.tsx
│ ├── Benefits
│ │ ├── BenefitBullet.tsx
│ │ ├── BenefitSection.tsx
│ │ └── Benefits.tsx
│ ├── CTA.tsx
│ ├── Container.tsx
│ ├── FAQ.tsx
│ ├── Footer.tsx
│ ├── Header.tsx
│ ├── Hero.tsx
│ ├── Logos.tsx
│ ├── PlayStoreButton.tsx
│ ├── Pricing
│ │ ├── Pricing.tsx
│ │ └── PricingColumn.tsx
│ ├── Section.tsx
│ ├── SectionTitle.tsx
│ ├── Stats.tsx
│ └── Testimonials.tsx
├── data
│ ├── benefits.tsx
│ ├── cta.ts
│ ├── faq.ts
│ ├── footer.ts
│ ├── hero.ts
│ ├── menuItems.ts
│ ├── pricing.ts
│ ├── siteDetails.ts
│ ├── stats.tsx
│ └── testimonials.ts
├── types.ts
└── utils.tsx
├── tailwind.config.ts
└── tsconfig.json
/.env.example:
--------------------------------------------------------------------------------
1 | # Retrieve your GA ID from your GA dashboard
2 | GOOGLE_ANALYTICS_ID=G-XXXXXXX
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["next/core-web-vitals", "next/typescript"]
3 | }
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnexi-launch%2Ffinwise-landing-page)
2 |
3 | # Finwise - Next.js + Tailwind Landing Page Template
4 |
5 | Finwise is a lightweight, easily configurable, and customizable **Next.js** and **Tailwind CSS** landing page template. It’s built to be adaptable, performant, and perfect for any product launch, portfolio, or promotional site.
6 |
7 | Try out the demo here: [https://finwise-omega.vercel.app](https://finwise-omega.vercel.app).
8 |
9 | Please check out the documentation below to get started.
10 |
11 | ---
12 |
13 | ## Features
14 |
15 | - **Next.js** app router with **TypeScript**
16 | - **Tailwind CSS** v3 for flexible styling customization
17 | - Smooth transitions powered by **Framer Motion**
18 | - Built-in **font optimization** with [next/font](https://nextjs.org/docs/app/api-reference/components/font)
19 | - Automatic **image optimization** via [next/image](https://nextjs.org/docs/app/building-your-application/optimizing/images)
20 | - Access to **31+ icon packs** via [React Icons](https://react-icons.github.io/react-icons/)
21 | - Near-perfect **Lighthouse score**
22 | - Modular, responsive, and **scalable components**
23 | - **Free lifetime updates**
24 |
25 | ---
26 |
27 | ## Sections
28 |
29 | - Hero
30 | - Partners or Clients Logos
31 | - Features
32 | - Pricing
33 | - Testimonials
34 | - FAQ
35 | - Statistics
36 | - CTA
37 | - Footer
38 |
39 | ---
40 |
41 | ## Getting Started
42 |
43 | ### Prerequisites
44 |
45 | Before starting, make sure you have the following installed:
46 |
47 | - **Node.js**: Version 18 or later
48 | - **npm**: Version 8 or later (bundled with Node.js)
49 | - **Code editor**: [VS Code](https://code.visualstudio.com/) is recommended.
50 |
51 | ### Steps
52 |
53 | 1. **Install dependencies**: Run `npm install`
54 | 2. **Run the development server**: `npm run dev`
55 | 3. **View your project**: Open [localhost:3000](http://localhost:3000)
56 |
57 | ---
58 |
59 | ## Customization
60 |
61 | 1. **Edit colors**: Update `globals.css` for primary, secondary, background, and accent colors.
62 | 2. **Update site details**: Customize `siteDetails.ts` in `/src/data` to reflect your brand and site info.
63 | 3. **Modify content**: Files in `/src/data` handle data for navigation, features, pricing, testimonials, and more.
64 | 4. **Replace favicon**: Add your icon to `/src/app/favicon.ico`.
65 | 5. **Add images**: Update `public/images` for Open Graph metadata (e.g., `og-image.jpg`, `twitter-image.jpg`).
66 |
67 | ---
68 |
69 | ## Deploying on Vercel
70 |
71 | The fastest way to deploy Finwise is on [Vercel](https://vercel.com/). Simply click the "Deploy with Vercel" button at the top of this README, or check the [Next.js deployment docs](https://vercel.com/docs/deployments/deployment-methods) for other deployment options.
72 |
73 | ---
74 |
75 | ## Contributing
76 |
77 | Finwise is an open-source project, and we welcome contributions from the community! If you have ideas for new components, designs, layouts, or optimizations, please join us in making Finwise even better.
78 |
79 | ### How to Contribute
80 |
81 | 1. **Fork the Repository**: Clone it locally.
82 | 2. **Create a New Branch**: For example, `feature/new-section` or `fix/style-issue`.
83 | 3. **Develop and Test**: Make sure your changes work and don't break existing functionality.
84 | 4. **Submit a Pull Request**: Open a pull request with a clear description of your changes, and we'll review it.
85 |
86 | ### Ideas for Contributions
87 |
88 | - New component sections (team introductions, comparison table, case studies, etc.)
89 | - Additional page variants (e.g., agency, eCommerce, portfolio layouts)
90 | - Additional themes
91 | - Documentation updates, tutorials, or guides
92 |
93 | ---
94 |
95 | ## Community and Support
96 |
97 | Join our community discussions on GitHub to share ideas, ask questions, or suggest improvements. Let’s build something amazing together!
98 |
99 |
100 | ---
101 |
102 | ## License
103 |
104 | This project is open-source and available under the MIT License. Feel free to use, modify, and distribute it for personal or commercial projects.
105 |
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | export default nextConfig;
5 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "finwise",
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 | "@headlessui/react": "^2.1.8",
13 | "@next/third-parties": "^14.2.13",
14 | "clsx": "^2.1.1",
15 | "framer-motion": "^11.11.9",
16 | "next": "^14.2.13",
17 | "react": "^18",
18 | "react-dom": "^18",
19 | "react-icons": "^5.3.0"
20 | },
21 | "devDependencies": {
22 | "@types/node": "^20",
23 | "@types/react": "^18",
24 | "@types/react-dom": "^18",
25 | "eslint": "^8",
26 | "eslint-config-next": "14.2.13",
27 | "postcss": "^8",
28 | "tailwindcss": "^3.4.1",
29 | "typescript": "^5"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/public/images/hero-chart.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/hero-chart.webp
--------------------------------------------------------------------------------
/public/images/hero-mockup.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/hero-mockup.webp
--------------------------------------------------------------------------------
/public/images/hero-transactions.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/hero-transactions.webp
--------------------------------------------------------------------------------
/public/images/mockup-1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/mockup-1.webp
--------------------------------------------------------------------------------
/public/images/mockup-2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/mockup-2.webp
--------------------------------------------------------------------------------
/public/images/testimonial-1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/testimonial-1.webp
--------------------------------------------------------------------------------
/public/images/testimonial-2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/testimonial-2.webp
--------------------------------------------------------------------------------
/public/images/testimonial-3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/public/images/testimonial-3.webp
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nexi-launch/finwise-landing-page/dbe5dd5375db1f64628cd9ced9c325687a42fafa/src/app/favicon.ico
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | --background: #ffffff;
7 | --foreground: #171717;
8 | --primary: #FED835;
9 | --secondary: #304fff;
10 |
11 | --primary-accent: #e5c230;
12 | --foreground-accent: #454545;
13 | --hero-background: #F3F3F5;
14 | }
15 |
16 | html {
17 | @apply scroll-smooth;
18 | }
19 |
20 | body {
21 | @apply text-lg;
22 |
23 | color: var(--foreground);
24 | background: var(--background);
25 | font-family: "Source Sans 3", sans-serif;
26 | font-optical-sizing: auto;
27 | font-style: normal;
28 | }
29 |
30 | @layer utilities {
31 | .text-balance {
32 | text-wrap: balance;
33 | }
34 | }
35 |
36 | .manrope {
37 | font-family: "Manrope", sans-serif;
38 | font-optical-sizing: auto;
39 | font-style: normal;
40 | }
41 |
42 | h1, h2, h3, h4, h5, h6 {
43 | font-family: "Manrope", sans-serif;
44 | font-optical-sizing: auto;
45 | font-style: normal;
46 | }
47 |
48 | #logos svg {
49 | @apply w-fit h-10 sm:h-12;
50 | }
51 |
52 | .benefit-section:last-of-type > div {
53 | @apply mb-10;
54 | }
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { GoogleAnalytics } from '@next/third-parties/google';
3 | import { Source_Sans_3, Manrope } from "next/font/google";
4 |
5 | import Header from "@/components/Header";
6 | import Footer from "@/components/Footer";
7 | import { siteDetails } from '@/data/siteDetails';
8 |
9 | import "./globals.css";
10 |
11 | const manrope = Manrope({ subsets: ['latin'] });
12 | const sourceSans = Source_Sans_3({ subsets: ['latin'] });
13 |
14 | export const metadata: Metadata = {
15 | title: siteDetails.metadata.title,
16 | description: siteDetails.metadata.description,
17 | openGraph: {
18 | title: siteDetails.metadata.title,
19 | description: siteDetails.metadata.description,
20 | url: siteDetails.siteUrl,
21 | type: 'website',
22 | images: [
23 | {
24 | url: '/images/og-image.jpg',
25 | width: 1200,
26 | height: 675,
27 | alt: siteDetails.siteName,
28 | },
29 | ],
30 | },
31 | twitter: {
32 | card: 'summary_large_image',
33 | title: siteDetails.metadata.title,
34 | description: siteDetails.metadata.description,
35 | images: ['/images/twitter-image.jpg'],
36 | },
37 | };
38 |
39 | export default function RootLayout({
40 | children,
41 | }: Readonly<{
42 | children: React.ReactNode;
43 | }>) {
44 | return (
45 |
46 |
49 | {siteDetails.googleAnalyticsId && }
50 |
51 |
52 | {children}
53 |
54 |
55 |
56 |
57 | );
58 | }
59 |
--------------------------------------------------------------------------------
/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import Hero from "@/components/Hero";
2 | import Testimonials from "@/components/Testimonials";
3 | import Pricing from "@/components/Pricing/Pricing";
4 | import FAQ from "@/components/FAQ";
5 | import Logos from "@/components/Logos";
6 | import Benefits from "@/components/Benefits/Benefits";
7 | import Container from "@/components/Container";
8 | import Section from "@/components/Section";
9 | import Stats from "@/components/Stats";
10 | import CTA from "@/components/CTA";
11 |
12 | const HomePage: React.FC = () => {
13 | return (
14 | <>
15 |
16 |
17 |
18 |
19 |
20 |
27 |
28 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | >
43 | );
44 | };
45 |
46 | export default HomePage;
47 |
--------------------------------------------------------------------------------
/src/components/AppStoreButton.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import clsx from 'clsx'
3 |
4 | import { ctaDetails } from '@/data/cta'
5 |
6 | const AppStoreButton = ({ dark }: { dark?: boolean }) => {
7 | return (
8 |
9 |
28 |
29 | )
30 | }
31 |
32 | export default AppStoreButton
--------------------------------------------------------------------------------
/src/components/Benefits/BenefitBullet.tsx:
--------------------------------------------------------------------------------
1 | import { motion } from "framer-motion"
2 |
3 | import { IBenefitBullet } from "@/types"
4 | import { childVariants } from "./BenefitSection"
5 |
6 | const BenefitBullet: React.FC = ({ title, description, icon }: IBenefitBullet) => {
7 | return (
8 |
12 |
13 | {icon}
14 |
15 |
16 |
17 | {title}
18 |
19 |
20 | {description}
21 |
22 |
23 |
24 | )
25 | }
26 |
27 | export default BenefitBullet
--------------------------------------------------------------------------------
/src/components/Benefits/BenefitSection.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import Image from "next/image";
3 | import clsx from "clsx";
4 | import { motion, Variants } from "framer-motion"
5 |
6 | import BenefitBullet from "./BenefitBullet";
7 | import SectionTitle from "../SectionTitle";
8 | import { IBenefit } from "@/types";
9 |
10 | interface Props {
11 | benefit: IBenefit;
12 | imageAtRight?: boolean;
13 | }
14 |
15 | const containerVariants: Variants = {
16 | offscreen: {
17 | opacity: 0,
18 | y: 100
19 | },
20 | onscreen: {
21 | opacity: 1,
22 | y: 0,
23 | transition: {
24 | type: "spring",
25 | bounce: 0.2,
26 | duration: 0.9,
27 | delayChildren: 0.2,
28 | staggerChildren: 0.1,
29 | }
30 | }
31 | };
32 |
33 | export const childVariants = {
34 | offscreen: {
35 | opacity: 0,
36 | x: -50,
37 | },
38 | onscreen: {
39 | opacity: 1,
40 | x: 0,
41 | transition: {
42 | type: "spring",
43 | bounce: 0.2,
44 | duration: 1,
45 | }
46 | },
47 | };
48 |
49 | const BenefitSection: React.FC = ({ benefit, imageAtRight }: Props) => {
50 | const { title, description, imageSrc, bullets } = benefit;
51 |
52 | return (
53 |
54 |
61 |
65 |
66 |
70 |
71 |
72 | {title}
73 |
74 |
75 |
76 |
77 | {description}
78 |
79 |
80 |
81 |
82 | {bullets.map((item, index) => (
83 |
84 | ))}
85 |
86 |
87 |
88 |
89 |
94 |
95 |
96 | );
97 | }
98 |
99 | export default BenefitSection
--------------------------------------------------------------------------------
/src/components/Benefits/Benefits.tsx:
--------------------------------------------------------------------------------
1 | import BenefitSection from "./BenefitSection"
2 |
3 | import { benefits } from "@/data/benefits"
4 |
5 | const Benefits: React.FC = () => {
6 | return (
7 |
8 |
Features
9 | {benefits.map((item, index) => {
10 | return
11 | })}
12 |
13 | )
14 | }
15 |
16 | export default Benefits
--------------------------------------------------------------------------------
/src/components/CTA.tsx:
--------------------------------------------------------------------------------
1 | import { ctaDetails } from "@/data/cta"
2 |
3 | import AppStoreButton from "./AppStoreButton"
4 | import PlayStoreButton from "./PlayStoreButton"
5 |
6 | const CTA: React.FC = () => {
7 | return (
8 |
9 |
10 |
11 |
14 |
15 |
16 |
{ctaDetails.heading}
17 |
18 |
{ctaDetails.subheading}
19 |
20 |
24 |
25 |
26 |
27 |
28 | )
29 | }
30 |
31 | export default CTA
--------------------------------------------------------------------------------
/src/components/Container.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | interface Props {
4 | className?: string;
5 | }
6 |
7 | const Container: React.FC> =({ children, className }: React.PropsWithChildren) => {
8 | return (
9 | {children}
10 | )
11 | }
12 |
13 | export default Container
--------------------------------------------------------------------------------
/src/components/FAQ.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 | import { Disclosure, DisclosureButton, DisclosurePanel } from "@headlessui/react";
3 | import { BiMinus, BiPlus } from "react-icons/bi";
4 |
5 | import SectionTitle from "./SectionTitle";
6 | import { faqs } from "@/data/faq";
7 |
8 | const FAQ: React.FC = () => {
9 | return (
10 |
11 |
12 |
13 |
FAQ'S
14 |
15 | Frequently Asked Questions
16 |
17 |
18 | Ask us anything!
19 |
20 |
help@finwise.com
21 |
22 |
23 |
24 | {faqs.map((faq, index) => (
25 |
26 |
27 | {({ open }) => (
28 | <>
29 |
30 | {faq.question}
31 | {open ? : }
32 |
33 |
34 | {faq.answer}
35 |
36 | >
37 | )}
38 |
39 |
40 | ))}
41 |
42 |
43 |
44 | );
45 | };
46 |
47 | export default FAQ;
--------------------------------------------------------------------------------
/src/components/Footer.tsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 | import React from 'react';
3 | import { FaFingerprint } from 'react-icons/fa';
4 |
5 | import { siteDetails } from '@/data/siteDetails';
6 | import { footerDetails } from '@/data/footer';
7 | import { getPlatformIconByName } from '@/utils';
8 |
9 | const Footer: React.FC = () => {
10 | return (
11 |
66 | );
67 | };
68 |
69 | export default Footer;
70 |
--------------------------------------------------------------------------------
/src/components/Header.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import Link from 'next/link';
4 | import React, { useState } from 'react';
5 | import { Transition } from '@headlessui/react';
6 | import { HiOutlineXMark, HiBars3 } from 'react-icons/hi2';
7 | import { FaFingerprint } from 'react-icons/fa';
8 |
9 | import Container from './Container';
10 | import { siteDetails } from '@/data/siteDetails';
11 | import { menuItems } from '@/data/menuItems';
12 |
13 | const Header: React.FC = () => {
14 | const [isOpen, setIsOpen] = useState(false);
15 |
16 | const toggleMenu = () => {
17 | setIsOpen(!isOpen);
18 | };
19 |
20 | return (
21 |
22 |
23 |
66 |
67 |
68 | {/* Mobile Menu with Transition */}
69 |
78 |
94 |
95 |
96 | );
97 | };
98 |
99 | export default Header;
100 |
--------------------------------------------------------------------------------
/src/components/Hero.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Image from 'next/image';
3 |
4 | import AppStoreButton from './AppStoreButton';
5 | import PlayStoreButton from './PlayStoreButton';
6 |
7 | import { heroDetails } from '@/data/hero';
8 |
9 | const Hero: React.FC = () => {
10 | return (
11 |
15 |
19 |
20 |
21 |
22 |
23 |
24 |
{heroDetails.heading}
25 |
{heroDetails.subheading}
26 |
30 |
41 |
42 |
43 | );
44 | };
45 |
46 | export default Hero;
47 |
--------------------------------------------------------------------------------
/src/components/Logos.tsx:
--------------------------------------------------------------------------------
1 | const Logos: React.FC = () => {
2 | return (
3 |
4 | Trusted by 2000+ customers worldwide
5 |
6 | {/* Notion */}
7 |
11 |
12 | {/* Stripe */}
13 |
22 |
23 | {/* Dropbox */}
24 |
28 |
29 | {/* Shopify */}
30 |
42 |
43 | {/* Slack */}
44 |
58 |
59 |
60 | )
61 | }
62 |
63 | export default Logos
--------------------------------------------------------------------------------
/src/components/PlayStoreButton.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import clsx from 'clsx'
3 |
4 | import { ctaDetails } from '@/data/cta'
5 |
6 | const PlayStoreButton = ({ dark }: { dark?: boolean }) => {
7 | return (
8 |
9 |
34 |
35 | )
36 | }
37 |
38 | export default PlayStoreButton
--------------------------------------------------------------------------------
/src/components/Pricing/Pricing.tsx:
--------------------------------------------------------------------------------
1 | import PricingColumn from "./PricingColumn";
2 |
3 | import { tiers } from "@/data/pricing";
4 |
5 | const Pricing: React.FC = () => {
6 | return (
7 |
8 | {tiers.map((tier, index) => (
9 |
10 | ))}
11 |
12 | )
13 | }
14 |
15 | export default Pricing
--------------------------------------------------------------------------------
/src/components/Pricing/PricingColumn.tsx:
--------------------------------------------------------------------------------
1 | import clsx from "clsx";
2 | import { BsFillCheckCircleFill } from "react-icons/bs";
3 |
4 | import { IPricing } from "@/types";
5 |
6 | interface Props {
7 | tier: IPricing;
8 | highlight?: boolean;
9 | }
10 |
11 | const PricingColumn: React.FC = ({ tier, highlight }: Props) => {
12 | const { name, price, features } = tier;
13 |
14 | return (
15 |
16 |
17 |
{name}
18 |
19 |
20 | {typeof price === 'number' ? `$${price}` : price}
21 |
22 | {typeof price === 'number' && /mo}
23 |
24 |
27 |
28 |
29 |
FEATURES
30 |
Everything in basic, plus...
31 |
32 | {features.map((feature, index) => (
33 | -
34 |
35 | {feature}
36 |
37 | ))}
38 |
39 |
40 |
41 | )
42 | }
43 |
44 | export default PricingColumn
--------------------------------------------------------------------------------
/src/components/Section.tsx:
--------------------------------------------------------------------------------
1 | import SectionTitle from "./SectionTitle";
2 |
3 | interface Props {
4 | id: string;
5 | title: string;
6 | description: string;
7 | }
8 |
9 | const Section: React.FC> = ({ id, title, description, children }: React.PropsWithChildren) => {
10 | return (
11 |
12 |
13 | {title}
14 |
15 | {description}
16 | {children}
17 |
18 | )
19 | }
20 |
21 | export default Section
--------------------------------------------------------------------------------
/src/components/SectionTitle.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | interface SectionTitleProps {
4 | children: React.ReactElement;
5 | }
6 |
7 | const SectionTitle: React.FC = ({ children }) => {
8 | return React.cloneElement(children, {
9 | className: children.props.className + " text-3xl lg:text-5xl lg:leading-tight font-bold"
10 | });
11 | };
12 |
13 | export default SectionTitle;
--------------------------------------------------------------------------------
/src/components/Stats.tsx:
--------------------------------------------------------------------------------
1 | import { stats } from "@/data/stats"
2 |
3 | const Stats: React.FC = () => {
4 | return (
5 |
6 |
7 | {stats.map(stat => (
8 |
9 |
10 | {stat.icon}
11 | {stat.title}
12 |
13 |
{stat.description}
14 |
15 | ))}
16 |
17 |
18 | )
19 | }
20 |
21 | export default Stats
--------------------------------------------------------------------------------
/src/components/Testimonials.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Image from 'next/image';
3 | import { testimonials } from '@/data/testimonials';
4 |
5 | const Testimonials: React.FC = () => {
6 | return (
7 |
8 | {testimonials.map((testimonial, index) => (
9 |
13 |
14 |
21 |
22 |
{testimonial.name}
23 |
{testimonial.role}
24 |
25 |
26 |
"{testimonial.message}"
27 |
28 | ))}
29 |
30 | );
31 | };
32 |
33 | export default Testimonials;
34 |
--------------------------------------------------------------------------------
/src/data/benefits.tsx:
--------------------------------------------------------------------------------
1 | import { FiBarChart2, FiBriefcase, FiDollarSign, FiLock, FiPieChart, FiShield, FiTarget, FiTrendingUp, FiUser } from "react-icons/fi";
2 |
3 | import { IBenefit } from "@/types"
4 |
5 | export const benefits: IBenefit[] = [
6 | {
7 | title: "Smart Budgeting",
8 | description: "Take the guesswork out of managing your money. Our AI-powered budgeting tool adapts to your lifestyle and helps you stay on track.",
9 | bullets: [
10 | {
11 | title: "Intelligent Categorization",
12 | description: "Automatically sorts your transactions for crystal-clear insights.",
13 | icon:
14 | },
15 | {
16 | title: "Customizable Goals",
17 | description: "Set and track financial objectives that matter to you.",
18 | icon:
19 | },
20 | {
21 | title: "Predictive Analysis",
22 | description: "Get ahead of your finances with spending forecasts and alerts.",
23 | icon:
24 | }
25 | ],
26 | imageSrc: "/images/mockup-1.webp"
27 | },
28 | {
29 | title: "Seamless Investing",
30 | description: "Start building wealth today, no financial degree required. Finwise makes investing accessible and straightforward.",
31 | bullets: [
32 | {
33 | title: "Micro-Investing",
34 | description: "Begin with as little as $1 and watch your money grow.",
35 | icon:
36 | },
37 | {
38 | title: "Expert Portfolios",
39 | description: "Choose from investment strategies tailored to your risk tolerance.",
40 | icon:
41 | },
42 | {
43 | title: "Real-Time Performance",
44 | description: "Track your investments with easy-to-understand metrics and visuals.",
45 | icon:
46 | }
47 | ],
48 | imageSrc: "/images/mockup-2.webp"
49 | },
50 | {
51 | title: "Bank-Grade Security",
52 | description: "Your financial data deserves the best protection. Rest easy knowing Finwise employs cutting-edge security measures.",
53 | bullets: [
54 | {
55 | title: "Military-Grade Encryption",
56 | description: "Your information is safeguarded with the highest level of encryption.",
57 | icon:
58 | },
59 | {
60 | title: "Biometric Authentication",
61 | description: "Access your account securely with fingerprint or facial recognition.",
62 | icon:
63 | },
64 | {
65 | title: "Real-Time Fraud Detection",
66 | description: "Our system constantly monitors for suspicious activity to keep your money safe.",
67 | icon:
68 | }
69 | ],
70 | imageSrc: "/images/mockup-1.webp"
71 | },
72 | ]
--------------------------------------------------------------------------------
/src/data/cta.ts:
--------------------------------------------------------------------------------
1 | export const ctaDetails = {
2 | heading: 'Join Over 1 Million Users To Transform Your Finances',
3 | subheading: 'Your journey to financial freedom starts here. Download Finwise today and take the first step towards a brighter financial future!',
4 | appStoreUrl: '#',
5 | googlePlayUrl: '#'
6 | }
--------------------------------------------------------------------------------
/src/data/faq.ts:
--------------------------------------------------------------------------------
1 | import { IFAQ } from "@/types";
2 | import { siteDetails } from "./siteDetails";
3 |
4 | export const faqs: IFAQ[] = [
5 | {
6 | question: `Is ${siteDetails.siteName} secure?`,
7 | answer: 'Absolutely. We use bank-level encryption to protect your data and never store your login information. Plus, our biometric authentication adds an extra layer of security.',
8 | },
9 | {
10 | question: `Can I use ${siteDetails.siteName} on multiple devices?`,
11 | answer: 'Absolutely! Your Finwise account syncs seamlessly across all your devices - smartphone, tablet, and computer.',
12 | },
13 | {
14 | question: 'Can I connect all my bank accounts?',
15 | answer: `Yes! ${siteDetails.siteName} supports connections with over 10,000 financial institutions worldwide. Simply log in through our secure portal to link your accounts.`
16 | },
17 | {
18 | question: 'Do I need any financial expertise to use the investing features?',
19 | answer: 'Not at all! Our expert-curated portfolios and educational resources make investing accessible to everyone, regardless of experience level.',
20 | },
21 | {
22 | question: 'What if I need help using the app?',
23 | answer: 'Our dedicated support team is available 24/7 via chat or email. Plus, we offer extensive in-app tutorials and a comprehensive knowledge base to help you make the most of Finwise.'
24 | }
25 | ];
--------------------------------------------------------------------------------
/src/data/footer.ts:
--------------------------------------------------------------------------------
1 | import { IMenuItem, ISocials } from "@/types";
2 |
3 | export const footerDetails: {
4 | subheading: string;
5 | quickLinks: IMenuItem[];
6 | email: string;
7 | telephone: string;
8 | socials: ISocials;
9 | } = {
10 | subheading: "Empowering businesses with cutting-edge financial technology solutions.",
11 | quickLinks: [
12 | {
13 | text: "Features",
14 | url: "#features"
15 | },
16 | {
17 | text: "Pricing",
18 | url: "#pricing"
19 | },
20 | {
21 | text: "Testimonials",
22 | url: "#testimonials"
23 | }
24 | ],
25 | email: 'address@yoursite.com',
26 | telephone: '+1 (123) 456-7890',
27 | socials: {
28 | // github: 'https://github.com',
29 | // x: 'https://twitter.com/x',
30 | twitter: 'https://twitter.com/Twitter',
31 | facebook: 'https://facebook.com',
32 | // youtube: 'https://youtube.com',
33 | linkedin: 'https://www.linkedin.com',
34 | // threads: 'https://www.threads.net',
35 | instagram: 'https://www.instagram.com',
36 | }
37 | }
--------------------------------------------------------------------------------
/src/data/hero.ts:
--------------------------------------------------------------------------------
1 | export const heroDetails = {
2 | heading: 'Smart, Secure, Simple Financial Management',
3 | subheading: 'From effortless budgeting to real-time investment insights, Finwise puts you in control of your money like never before',
4 | centerImageSrc: '/images/hero-mockup.webp',
5 | }
--------------------------------------------------------------------------------
/src/data/menuItems.ts:
--------------------------------------------------------------------------------
1 | import { IMenuItem } from "@/types";
2 |
3 | export const menuItems: IMenuItem[] = [
4 | {
5 | text: "Features",
6 | url: "#features"
7 | },
8 | {
9 | text: "Pricing",
10 | url: "#pricing"
11 | },
12 | {
13 | text: "Testimonials",
14 | url: "#testimonials"
15 | }
16 | ];
--------------------------------------------------------------------------------
/src/data/pricing.ts:
--------------------------------------------------------------------------------
1 | import { IPricing } from "@/types";
2 |
3 | export const tiers: IPricing[] = [
4 | {
5 | name: 'Starter',
6 | price: 29,
7 | features: [
8 | 'Basic cloud integration',
9 | 'Up to 5 team members',
10 | '20GB storage',
11 | 'Email support',
12 | ],
13 | },
14 | {
15 | name: 'Pro',
16 | price: 99,
17 | features: [
18 | 'Advanced cloud integration',
19 | 'Up to 20 team members',
20 | '100GB storage',
21 | 'Priority email & phone support',
22 | 'Advanced analytics',
23 | ],
24 | },
25 | {
26 | name: 'Enterprise',
27 | price: 'Custom',
28 | features: [
29 | 'Full cloud integration',
30 | 'Unlimited team members',
31 | 'Unlimited storage',
32 | '24/7 dedicated support',
33 | 'Custom solutions',
34 | 'On-site training',
35 | ],
36 | },
37 | ]
--------------------------------------------------------------------------------
/src/data/siteDetails.ts:
--------------------------------------------------------------------------------
1 | export const siteDetails = {
2 | siteName: 'Finwise',
3 | siteUrl: 'https://finwise-omega.vercel.app/',
4 | metadata: {
5 | title: 'Finwise - Next.js and Tailwind CSS Landing Page Template',
6 | description: 'Finwise empowers businesses with cutting-edge technology solutions to drive success and efficiency.',
7 | },
8 | language: 'en-us',
9 | locale: 'en-US',
10 | siteLogo: `${process.env.BASE_PATH || ''}/images/logo.png`, // or use a string for the logo e.g. "TechStartup"
11 | googleAnalyticsId: '', // e.g. G-XXXXXXX,
12 | }
--------------------------------------------------------------------------------
/src/data/stats.tsx:
--------------------------------------------------------------------------------
1 | import { BsBarChartFill, BsFillStarFill } from "react-icons/bs";
2 | import { PiGlobeFill } from "react-icons/pi";
3 |
4 | import { IStats } from "@/types";
5 |
6 | export const stats: IStats[] = [
7 | {
8 | title: "20M+",
9 | icon: ,
10 | description: "Transactions processed securely every day, providing real-time insights."
11 | },
12 | {
13 | title: "5.0",
14 | icon: ,
15 | description: "Star rating, consistently maintained across app stores."
16 | },
17 | {
18 | title: "200+ ",
19 | icon: ,
20 | description: "Financial Institutions, seamlessly integrated, so you can manage all accounts."
21 | }
22 | ];
--------------------------------------------------------------------------------
/src/data/testimonials.ts:
--------------------------------------------------------------------------------
1 | import { ITestimonial } from "@/types";
2 | import { siteDetails } from "./siteDetails";
3 |
4 | export const testimonials: ITestimonial[] = [
5 | {
6 | name: 'John Smith',
7 | role: 'CEO at Company',
8 | message: `${siteDetails.siteName}'s AI-driven insights have transformed how we approach financial planning for our clients. It's an invaluable resource in the modern financial landscape.`,
9 | avatar: '/images/testimonial-1.webp',
10 | },
11 | {
12 | name: 'Jane Doe',
13 | role: 'CTO at Startup',
14 | message: `As a CTO, I'm impressed by ${siteDetails.siteName}'s robust security measures and seamless integrations. It's rare to find an app that balances user-friendliness with such advanced technology.`,
15 | avatar: '/images/testimonial-2.webp',
16 | },
17 | {
18 | name: 'Emily Johnson',
19 | role: 'Product Manager',
20 | message: `${siteDetails.siteName} is revolutionizing personal finance management. Its intuitive design and powerful features make it an indispensable tool for anyone serious about financial growth.`,
21 | avatar: '/images/testimonial-3.webp',
22 | },
23 | ];
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | export interface IMenuItem {
2 | text: string;
3 | url: string;
4 | }
5 |
6 | export interface IBenefit {
7 | title: string;
8 | description: string;
9 | imageSrc: string;
10 | bullets: IBenefitBullet[]
11 | }
12 |
13 | export interface IBenefitBullet {
14 | title: string;
15 | description: string;
16 | icon: JSX.Element;
17 | }
18 |
19 | export interface IPricing {
20 | name: string;
21 | price: number | string;
22 | features: string[];
23 | }
24 |
25 | export interface IFAQ {
26 | question: string;
27 | answer: string;
28 | }
29 |
30 | export interface ITestimonial {
31 | name: string;
32 | role: string;
33 | message: string;
34 | avatar: string;
35 | }
36 |
37 | export interface IStats {
38 | title: string;
39 | icon: JSX.Element;
40 | description: string;
41 | }
42 |
43 | export interface ISocials {
44 | facebook?: string;
45 | github?: string;
46 | instagram?: string;
47 | linkedin?: string;
48 | threads?: string;
49 | twitter?: string;
50 | youtube?: string;
51 | x?: string;
52 | [key: string]: string | undefined;
53 | }
--------------------------------------------------------------------------------
/src/utils.tsx:
--------------------------------------------------------------------------------
1 | import { FaFacebook, FaGithub, FaInstagram, FaLinkedin, FaThreads, FaTwitter, FaXTwitter, FaYoutube } from "react-icons/fa6";
2 |
3 | export const getPlatformIconByName = (platformName: string): JSX.Element | null => {
4 | switch (platformName) {
5 | case 'facebook': {
6 | return ;
7 | }
8 | case 'github': {
9 | return ;
10 | }
11 | case 'instagram': {
12 | return ;
13 | }
14 | case 'linkedin': {
15 | return ;
16 | }
17 | case 'threads': {
18 | return ;
19 | }
20 | case 'twitter': {
21 | return ;
22 | }
23 | case 'youtube': {
24 | return ;
25 | }
26 | case 'x': {
27 | return ;
28 | }
29 | default:
30 | console.log('Platform name not supported, no icon is returned:', platformName);
31 | return null;
32 | }
33 | }
--------------------------------------------------------------------------------
/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss";
2 |
3 | const config: Config = {
4 | content: [
5 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
7 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
8 | ],
9 | theme: {
10 | extend: {
11 | colors: {
12 | background: "var(--background)",
13 | foreground: "var(--foreground)",
14 | primary: "var(--primary)",
15 | secondary: "var(--secondary)",
16 |
17 | "primary-accent": "var(--primary-accent)",
18 | "foreground-accent": "var(--foreground-accent)",
19 | "hero-background": "var(--hero-background)",
20 | },
21 | },
22 | },
23 | plugins: [],
24 | };
25 | export default config;
26 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------