Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,21 @@
"lint": "next lint"
},
"dependencies": {
"framer-motion": "^12.23.24",
"lucide-react": "^0.552.0",
"next": "15.2.4",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"next": "15.2.4"
"react-dom": "^19.0.0"
},
"devDependencies": {
"typescript": "^5",
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4.1.16",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"@tailwindcss/postcss": "^4",
"tailwindcss": "^4",
"eslint": "^9",
"eslint-config-next": "15.2.4",
"@eslint/eslintrc": "^3"
"tailwindcss": "^4.1.16",
"typescript": "^5"
}
}
5 changes: 5 additions & 0 deletions frontend/postcss.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
plugins: {
'@tailwindcss/postcss': {},
},
};
5 changes: 0 additions & 5 deletions frontend/postcss.config.mjs

This file was deleted.

Binary file added frontend/public/hero-image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 12 additions & 16 deletions frontend/src/app/globals.css
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
@import "tailwindcss";

:root {
--background: #ffffff;
--foreground: #171717;
--accent-green: #39ff14;
--accent-blue: #00e0ff;
--color-bg: #0b0f19;
--color-fg: #eaeaea;
}

@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);

body {
@apply bg-[var(--color-bg)] text-[var(--color-fg)] font-sans antialiased;
}

@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
@keyframes float-slow {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-15px); }
}

body {
background: var(--background);
color: var(--foreground);
font-family: Arial, Helvetica, sans-serif;
.animate-float-slow {
animation: float-slow 6s ease-in-out infinite;
}
51 changes: 34 additions & 17 deletions frontend/src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,33 +1,50 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import Nav from "../components/nav";
import Footer from "../components/footer";
import { Inter } from "next/font/google";

const geistSans = Geist({
variable: "--font-geist-sans",
const inter = Inter({
subsets: ["latin"],
display: "swap",
});

const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});

export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
export const metadata = {
title: "Finfly — Smarter Personal Finance",
description: "Track spending, reach goals, and grow wealth with Finfly.",
icons: {
icon: "./favicon.ico",
},
openGraph: {
title: "Finfly — Smarter Personal Finance",
description: "Track spending, reach goals, and grow wealth with Finfly.",
url: "www.IfYouAreReadingThis-ThisIsNotAIMade.com",
siteName: "Finfly",
images: [
{
url: "/og-image.png",
width: 1200,
height: 630,
alt: "Finfly dashboard preview",
},
],
locale: "en_US",
type: "website",
},
};

export default function RootLayout({
children,
}: Readonly<{
}: {
children: React.ReactNode;
}>) {
}) {
return (
<html lang="en">
<html lang="en" className="scroll-smooth">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
className={`${inter.className} bg-[var(--bg-dark)] text-white antialiased selection:bg-[var(--accent-green)]/30 selection:text-[var(--accent-green)]`}
>
{children}
<Nav />
<main className="pt-24">{children}</main>
<Footer />
</body>
</html>
);
Expand Down
104 changes: 7 additions & 97 deletions frontend/src/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,103 +1,13 @@
import Image from "next/image";
import Hero from "../components/hero";
import Features from "../components/features";
import Testimonials from "../components/Testimonials";

export default function Home() {
return (
<div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
<main className="flex flex-col gap-[32px] row-start-2 items-center sm:items-start">
<Image
className="dark:invert"
src="/next.svg"
alt="Next.js logo"
width={180}
height={38}
priority
/>
<ol className="list-inside list-decimal text-sm/6 text-center sm:text-left font-[family-name:var(--font-geist-mono)]">
<li className="mb-2 tracking-[-.01em]">
Get started by editing{" "}
<code className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-[family-name:var(--font-geist-mono)] font-semibold">
src/app/page.tsx
</code>
.
</li>
<li className="tracking-[-.01em]">
Save and see your changes instantly.
</li>
</ol>

<div className="flex gap-4 items-center flex-col sm:flex-row">
<a
className="rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:w-auto"
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
className="dark:invert"
src="/vercel.svg"
alt="Vercel logomark"
width={20}
height={20}
/>
Deploy now
</a>
<a
className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 w-full sm:w-auto md:w-[158px]"
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Read our docs
</a>
</div>
</main>
<footer className="row-start-3 flex gap-[24px] flex-wrap items-center justify-center">
<a
className="flex items-center gap-2 hover:underline hover:underline-offset-4"
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
aria-hidden
src="/file.svg"
alt="File icon"
width={16}
height={16}
/>
Learn
</a>
<a
className="flex items-center gap-2 hover:underline hover:underline-offset-4"
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
aria-hidden
src="/window.svg"
alt="Window icon"
width={16}
height={16}
/>
Examples
</a>
<a
className="flex items-center gap-2 hover:underline hover:underline-offset-4"
href="https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
aria-hidden
src="/globe.svg"
alt="Globe icon"
width={16}
height={16}
/>
Go to nextjs.org →
</a>
</footer>
<div className="flex flex-col gap-40">
<Hero />
<Features />
<Testimonials />
</div>
);
}
84 changes: 84 additions & 0 deletions frontend/src/components/Testimonials.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"use client";
import { motion } from "framer-motion";

const testimonials = [
{
name: "Emily R., Freelancer",
role: "Independent Consultant",
quote:
"Finfly transformed how I track and save money — the real-time dashboard helped me save 30% more this quarter than ever before.",
},
{
name: "Carlos M., Startup Founder",
role: "CEO & Co-Founder - TechStart",
quote:
"We switched to Finfly and our team uses it daily. The transparency and insights gave us clarity and control we never had.",
},
{
name: "Priya S., Creative Director",
role: "Agency Lead - BrightIdeas",
quote:
"As a busy creative professional, I needed finance tools that are simple yet powerful. Finfly delivers elegant design and serious impact.",
},
];

export default function Testimonials() {
return (
<section
id="testimonials"
className="relative py-32 px-6 md:px-12 lg:px-24 bg-[#0b0f19] overflow-hidden"
>
<div className="max-w-6xl mx-auto text-center mb-16">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="text-4xl md:text-5xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-[var(--accent-green)] to-[var(--accent-blue)]"
>
What customers are saying
</motion.h2>
<motion.p
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, delay: 0.2 }}
className="text-gray-400 text-lg max-w-2xl mx-auto mt-4"
>
Real stories from people using Finfly to take control of their finances.
</motion.p>
</div>

<div className="grid grid-cols-1 md:grid-cols-3 gap-10">
{testimonials.map((t, i) => (
<motion.div
key={i}
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.7, delay: i * 0.2 }}
className="group relative bg-gradient-to-b from-[#0f1522] to-[#131c2d] rounded-3xl p-8 border border-white/10 shadow-[0_0_30px_rgba(57,255,20,0.05)] hover:shadow-[0_0_40px_rgba(57,255,20,0.1)] transition"
>
<div className="mb-6">
<svg
xmlns="http://www.w3.org/2000/svg"
className="w-10 h-10 text-[var(--accent-green)] mx-auto"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth={2}
>
<path strokeLinecap="round" strokeLinejoin="round" d="M7 16V8m0-4a4 4 0 014 4h6m0 8v-8m0 4a4 4 0 01-4 4H7" />
</svg>
</div>
<blockquote className="text-gray-300 italic mb-6">
“{t.quote}”
</blockquote>
<p className="text-white font-semibold">{t.name}</p>
<p className="text-gray-500 text-sm">{t.role}</p>
</motion.div>
))}
</div>
</section>
);
}
Loading