From bdf4889e17c535270cc60c2a9603d4bf2381faf8 Mon Sep 17 00:00:00 2001 From: Ishan Raj Date: Fri, 20 Feb 2026 14:58:14 +0530 Subject: [PATCH] navbar component --- Frontend/package-lock.json | 152 ++++++++++----- Frontend/package.json | 4 +- Frontend/src/components/Navbar.jsx | 292 ++++++++++++++++++++++++++++ Frontend/src/pages/AboutUs.jsx | 183 +---------------- Frontend/src/pages/Career.jsx | 102 +--------- Frontend/src/pages/ContactUs.jsx | 147 +------------- Frontend/src/pages/CookiePolicy.jsx | 180 +---------------- Frontend/src/pages/FAQ.jsx | 34 +--- Frontend/src/pages/Landing.jsx | 207 +------------------- Frontend/src/pages/PricingPage.jsx | 94 +-------- Frontend/src/pages/Privacy.jsx | 180 +---------------- Frontend/src/pages/Terms.jsx | 180 +---------------- package-lock.json | 30 +++ 13 files changed, 458 insertions(+), 1327 deletions(-) create mode 100644 Frontend/src/components/Navbar.jsx diff --git a/Frontend/package-lock.json b/Frontend/package-lock.json index 58624943..cd9c8c1e 100644 --- a/Frontend/package-lock.json +++ b/Frontend/package-lock.json @@ -23,8 +23,8 @@ "gsap": "^3.13.0", "jwt-decode": "^4.0.0", "lucide-react": "^0.545.0", - "react": "^19.1.1", - "react-dom": "^19.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-dropzone": "^14.3.8", "react-helmet-async": "^2.0.5", "react-hot-toast": "^2.6.0", @@ -1702,7 +1702,7 @@ "version": "19.2.13", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz", "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1724,6 +1724,14 @@ "integrity": "sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==", "license": "MIT" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", @@ -1846,6 +1854,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -2415,6 +2436,16 @@ "dev": true, "license": "MIT" }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "peer": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", @@ -3596,6 +3627,19 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3629,6 +3673,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3663,6 +3720,17 @@ "node": "*" } }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "peer": true, + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, "node_modules/motion-dom": { "version": "12.33.0", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.33.0.tgz", @@ -3876,13 +3944,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -4136,24 +4204,28 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^18.3.1" } }, "node_modules/react-dropzone": { @@ -4351,6 +4423,19 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/recharts": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.7.0.tgz", @@ -4539,10 +4624,13 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/seedrandom": { "version": "3.0.5", @@ -4804,19 +4892,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5022,19 +5097,6 @@ } } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/Frontend/package.json b/Frontend/package.json index 99d172e2..5cb05ac8 100644 --- a/Frontend/package.json +++ b/Frontend/package.json @@ -26,8 +26,8 @@ "gsap": "^3.13.0", "jwt-decode": "^4.0.0", "lucide-react": "^0.545.0", - "react": "^19.1.1", - "react-dom": "^19.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-dropzone": "^14.3.8", "react-helmet-async": "^2.0.5", "react-hot-toast": "^2.6.0", diff --git a/Frontend/src/components/Navbar.jsx b/Frontend/src/components/Navbar.jsx new file mode 100644 index 00000000..0094da05 --- /dev/null +++ b/Frontend/src/components/Navbar.jsx @@ -0,0 +1,292 @@ +import { useEffect, useMemo, useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import { useSelector } from "react-redux"; +import { Menu, X } from "lucide-react"; +import ThemeToggle from "./ThemeToggle"; + +const NAV_TONES = { + landing: { + nav: "fixed top-6 left-1/2 -translate-x-1/2 w-[95%] max-w-7xl bg-black/10 backdrop-blur-xl rounded-full border border-white/20 z-50 text-skin-primary", + link: "text-gray-200 hover:text-emerald-400", + mobileMenu: "bg-white backdrop-blur-md rounded-2xl shadow-xl border border-gray-200", + mobileLink: "text-gray-600 hover:text-gray-900", + menuButton: "text-gray-900 hover:bg-gray-100", + logoPrimary: "text-white-800", + logoSecondary: "text-emerald-500", + activeLink: "text-emerald-400", + activeMobile: "text-emerald-500 bg-emerald-50", + }, + skin: { + nav: "fixed top-6 left-1/2 transform -translate-x-1/2 w-[95%] max-w-7xl bg-skin-primary/95 backdrop-blur-md rounded-full shadow-lg z-50 border border-skin-primary", + link: "text-gray-600 hover:text-skin-primary", + mobileMenu: "bg-white backdrop-blur-md rounded-2xl shadow-xl border border-gray-200", + mobileLink: "text-gray-600 hover:text-skin-primary", + menuButton: "text-skin-primary hover:bg-gray-100", + logoPrimary: "text-skin-primary", + logoSecondary: "text-emerald-500", + activeLink: "text-emerald-500", + activeMobile: "text-emerald-500 bg-emerald-50", + }, + light: { + nav: "fixed top-6 left-1/2 transform -translate-x-1/2 w-[95%] max-w-7xl bg-white/95 backdrop-blur-md rounded-full shadow-lg z-50 border border-gray-200", + link: "text-gray-600 hover:text-gray-900", + mobileMenu: "bg-white backdrop-blur-md rounded-2xl shadow-xl border border-gray-200", + mobileLink: "text-gray-600 hover:text-gray-900", + menuButton: "text-gray-900 hover:bg-gray-100", + logoPrimary: "text-gray-900", + logoSecondary: "text-emerald-500", + activeLink: "text-emerald-500", + activeMobile: "text-emerald-500 bg-emerald-50", + }, +}; + +const buildLinks = (isLanding) => { + const prefix = isLanding ? "" : "/"; + return [ + { key: "features", label: "Features", href: `${prefix}#features`, isSection: true }, + { key: "about", label: "About", to: "/about" }, + { key: "how", label: "How it Works", href: `${prefix}#how-it-works`, isSection: true }, + { key: "pricing", label: "Pricing", href: `${prefix}#pricing`, isSection: true }, + { key: "faq", label: "FAQ", href: `${prefix}#faq`, isSection: true }, + { key: "contact", label: "Contact", to: "/contact" }, + ]; +}; + +export default function Navbar({ + tone = "light", + variant = "pill", + isLanding = false, + activeKey, + showThemeToggle = false, + showAuthButtons = true, + showDashboardButton = true, + onSectionClick, +}) { + const { token } = useSelector((state) => state.auth); + const navigate = useNavigate(); + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + const [scrollY, setScrollY] = useState(0); + const styles = NAV_TONES[tone] || NAV_TONES.light; + const links = useMemo(() => buildLinks(isLanding), [isLanding]); + + useEffect(() => { + if (variant !== "simple") { + return undefined; + } + const handleScroll = () => setScrollY(window.scrollY); + window.addEventListener("scroll", handleScroll); + return () => window.removeEventListener("scroll", handleScroll); + }, [variant]); + + const closeMobileMenu = () => { + setMobileMenuOpen(false); + }; + + const handleSectionClick = (event, sectionId) => { + if (onSectionClick) { + onSectionClick(event, sectionId); + } + closeMobileMenu(); + }; + + if (variant === "simple") { + return ( + + ); + } + + return ( + + ); +} diff --git a/Frontend/src/pages/AboutUs.jsx b/Frontend/src/pages/AboutUs.jsx index fbe32d5d..40e5f3ba 100644 --- a/Frontend/src/pages/AboutUs.jsx +++ b/Frontend/src/pages/AboutUs.jsx @@ -1,6 +1,5 @@ import React, { useEffect, useRef } from "react"; import { Link, useNavigate } from "react-router-dom"; -import { useSelector } from "react-redux"; import { motion, useInView, useAnimation } from "framer-motion"; import { Target, @@ -13,8 +12,6 @@ import { Mail, Linkedin, Github, - Menu, - X, ArrowRight, MessageSquare, BarChart, @@ -23,13 +20,11 @@ import { Star, } from "lucide-react"; import { useState } from "react"; -import ThemeToggle from "../components/ThemeToggle"; +import Navbar from "../components/Navbar"; import Lenis from "@studio-freight/lenis"; export default function AboutUs() { const navigate = useNavigate(); - const { token } = useSelector((state) => state.auth); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const lenisRef = useRef(null); const [contributors, setContributors] = React.useState([]); const [loading, setLoading] = React.useState(true); @@ -63,9 +58,6 @@ export default function AboutUs() { }; }, []); - const closeMobileMenu = () => { - setMobileMenuOpen(false); - }; const itemVariants = { hidden: { y: 0, opacity: 1 }, visible: { @@ -191,178 +183,7 @@ export default function AboutUs() { return (
- {/* Navbar */} - + {/* Hero Section */}
diff --git a/Frontend/src/pages/Career.jsx b/Frontend/src/pages/Career.jsx index 6dcd796f..1551d8f5 100644 --- a/Frontend/src/pages/Career.jsx +++ b/Frontend/src/pages/Career.jsx @@ -1,6 +1,5 @@ import React, { useState, useEffect } from "react"; import { Link, useNavigate } from "react-router-dom"; -import { useSelector } from "react-redux"; import { Briefcase, BookOpen, @@ -14,11 +13,10 @@ import { Target, Users, Sparkles, - Menu, - X } from "lucide-react"; import { apiConnector } from "../services/apiConnector"; import { careerEndpoints } from "../services/apis"; +import Navbar from "../components/Navbar"; const MOCK_JOBS = [ { @@ -69,13 +67,11 @@ const MOCK_RESOURCES = [ export default function Career() { const navigate = useNavigate(); - const { token } = useSelector((state) => state.auth); const [jobs, setJobs] = useState([]); const [resources, setResources] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [activeTab, setActiveTab] = useState("jobs"); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); useEffect(() => { fetchFeaturedContent(); @@ -114,101 +110,7 @@ export default function Career() { return (
- {/* Navbar */} - + {/* Background decoration */}
diff --git a/Frontend/src/pages/ContactUs.jsx b/Frontend/src/pages/ContactUs.jsx index 71870b29..094850ec 100644 --- a/Frontend/src/pages/ContactUs.jsx +++ b/Frontend/src/pages/ContactUs.jsx @@ -1,14 +1,10 @@ import { useEffect, useRef, useState } from "react"; -import { Link, useNavigate } from "react-router-dom"; -import { useSelector } from "react-redux"; -import { Menu, X, Mail, Phone, MapPin, Send } from "lucide-react"; +import { Link } from "react-router-dom"; +import { Mail, Phone, MapPin, Send } from "lucide-react"; import { submitContactForm } from "../services/operations/contactAPI"; -import ThemeToggle from "../components/ThemeToggle"; +import Navbar from "../components/Navbar"; import Lenis from "@studio-freight/lenis"; export default function ContactUs() { - const navigate = useNavigate(); - const { token } = useSelector((state) => state.auth); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [loading, setLoading] = useState(false); const lenisRef = useRef(null); @@ -71,142 +67,7 @@ export default function ContactUs() { return (
- {/* Navbar - Copied from Landing.jsx but slightly modified for links */} - + {/* Hero Section */}
diff --git a/Frontend/src/pages/CookiePolicy.jsx b/Frontend/src/pages/CookiePolicy.jsx index 874a16b2..e2c49b41 100644 --- a/Frontend/src/pages/CookiePolicy.jsx +++ b/Frontend/src/pages/CookiePolicy.jsx @@ -1,186 +1,10 @@ import React from "react"; -import { Link, useNavigate } from "react-router-dom"; -import { Menu, X } from "lucide-react"; -import { useState } from "react"; -import { useSelector } from "react-redux"; +import Navbar from "../components/Navbar"; export default function PrivacyPolicy() { - const token = useSelector((state) => state.auth.token); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); - const navigate = useNavigate(); - - const closeMobileMenu = () => { - setMobileMenuOpen(false); - }; - return ( <> - {/* Navbar */} - +

diff --git a/Frontend/src/pages/FAQ.jsx b/Frontend/src/pages/FAQ.jsx index 5cb4fbce..28ef0ca1 100644 --- a/Frontend/src/pages/FAQ.jsx +++ b/Frontend/src/pages/FAQ.jsx @@ -1,5 +1,5 @@ -import { Link } from "react-router-dom"; -import { useState, useEffect } from "react"; +import { useState } from "react"; +import Navbar from "../components/Navbar"; const faqs = [ { @@ -35,43 +35,15 @@ const faqs = [ ]; export default function FAQ() { - const [scrollY, setScrollY] = useState(0); const [activeIndex, setActiveIndex] = useState(null); - useEffect(() => { - const handleScroll = () => setScrollY(window.scrollY); - window.addEventListener("scroll", handleScroll); - return () => window.removeEventListener("scroll", handleScroll); - }, []); - const toggleFAQ = (index) => { setActiveIndex(activeIndex === index ? null : index); }; return (
- {/* Navbar */} - + {/* FAQ Section */}
diff --git a/Frontend/src/pages/Landing.jsx b/Frontend/src/pages/Landing.jsx index c203a22e..fdc9e4d1 100644 --- a/Frontend/src/pages/Landing.jsx +++ b/Frontend/src/pages/Landing.jsx @@ -1,6 +1,5 @@ import { useState, useEffect, useRef } from "react"; import { Link, useNavigate } from "react-router-dom"; -import { useSelector } from "react-redux"; import { Globe, MessageSquare, @@ -10,17 +9,13 @@ import { Users, Play, ChevronDown, - Menu, - X, } from "lucide-react"; import Lenis from "@studio-freight/lenis"; -import ThemeToggle from "../components/ThemeToggle"; +import Navbar from "../components/Navbar"; export default function LandingPage() { const navigate = useNavigate(); - const { token } = useSelector((state) => state.auth); const [openFaq, setOpenFaq] = useState(null); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const lenisRef = useRef(null); // Initialize Lenis smooth scroll @@ -55,10 +50,6 @@ export default function LandingPage() { setOpenFaq(openFaq === index ? null : index); }; - const closeMobileMenu = () => { - setMobileMenuOpen(false); - }; - const scrollToSection = (e, sectionId) => { e.preventDefault(); const element = document.querySelector(sectionId); @@ -68,200 +59,16 @@ export default function LandingPage() { duration: 1.5, }); } - closeMobileMenu(); }; return (
- {/* Navbar */} - + {/* Hero Section */}
diff --git a/Frontend/src/pages/PricingPage.jsx b/Frontend/src/pages/PricingPage.jsx index 45a91998..01fef9e9 100644 --- a/Frontend/src/pages/PricingPage.jsx +++ b/Frontend/src/pages/PricingPage.jsx @@ -1,13 +1,11 @@ import { useState, useEffect, useRef } from "react"; import { Link, useNavigate } from "react-router-dom"; -import { useSelector } from "react-redux"; -import { Menu, X, Check, Zap, Users, BarChart, Sparkles, Crown, Building2, ChevronDown } from "lucide-react"; +import { Check, Zap, Users, BarChart, Sparkles, Crown, Building2, ChevronDown } from "lucide-react"; import Lenis from "@studio-freight/lenis"; +import Navbar from "../components/Navbar"; export default function PricingPage() { const navigate = useNavigate(); - const { token } = useSelector((state) => state.auth); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [billingCycle, setBillingCycle] = useState("monthly"); const [openFaq, setOpenFaq] = useState(null); const lenisRef = useRef(null); @@ -43,95 +41,9 @@ export default function PricingPage() { setOpenFaq(openFaq === index ? null : index); }; - const closeMobileMenu = () => { - setMobileMenuOpen(false); - }; - return (
- {/* Navbar */} - + {/* Hero Section */}
diff --git a/Frontend/src/pages/Privacy.jsx b/Frontend/src/pages/Privacy.jsx index c5a98459..a500f1ea 100644 --- a/Frontend/src/pages/Privacy.jsx +++ b/Frontend/src/pages/Privacy.jsx @@ -1,186 +1,10 @@ import React from "react"; -import { Link, useNavigate } from "react-router-dom"; -import { Menu, X } from "lucide-react"; -import { useState } from "react"; -import { useSelector } from "react-redux"; +import Navbar from "../components/Navbar"; export default function PrivacyPolicy() { - const token = useSelector((state) => state.auth.token); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); - const navigate = useNavigate(); - - const closeMobileMenu = () => { - setMobileMenuOpen(false); - }; - return ( <> - {/* Navbar */} - +

diff --git a/Frontend/src/pages/Terms.jsx b/Frontend/src/pages/Terms.jsx index 5f336f88..6a5faef9 100644 --- a/Frontend/src/pages/Terms.jsx +++ b/Frontend/src/pages/Terms.jsx @@ -1,186 +1,10 @@ import React from "react"; -import { Link, useNavigate } from "react-router-dom"; -import { Menu, X } from "lucide-react"; -import { useState } from "react"; -import { useSelector } from "react-redux"; +import Navbar from "../components/Navbar"; export default function TermsAndConditions() { - const token = useSelector((state) => state.auth.token); - const [mobileMenuOpen, setMobileMenuOpen] = useState(false); - const navigate = useNavigate(); - - const closeMobileMenu = () => { - setMobileMenuOpen(false); - }; - return ( <> - {/* Navbar */} - +

diff --git a/package-lock.json b/package-lock.json index e6124da5..f7f670e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,6 +79,36 @@ "node": "4.x || >=6.0.0" } }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT", + "peer": true + }, "node_modules/seedrandom": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz",