diff --git a/package-lock.json b/package-lock.json index e65b56e..4c293f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@testing-library/user-event": "^13.5.0", "dotenv": "^17.2.3", "firebase": "^12.4.0", + "flowbite": "^3.1.2", "lucide-react": "^0.540.0", "react": "^19.1.0", "react-dom": "^19.1.0", @@ -3772,6 +3773,16 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -9040,6 +9051,109 @@ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "license": "ISC" }, + "node_modules/flowbite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-3.1.2.tgz", + "integrity": "sha512-MkwSgbbybCYgMC+go6Da5idEKUFfMqc/AmSjm/2ZbdmvoKf5frLPq/eIhXc9P+rC8t9boZtUXzHDgt5whZ6A/Q==", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.3", + "flowbite-datepicker": "^1.3.1", + "mini-svg-data-uri": "^1.4.3", + "postcss": "^8.5.1" + } + }, + "node_modules/flowbite-datepicker": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/flowbite-datepicker/-/flowbite-datepicker-1.3.2.tgz", + "integrity": "sha512-6Nfm0MCVX3mpaR7YSCjmEO2GO8CDt6CX8ZpQnGdeu03WUCWtEPQ/uy0PUiNtIJjJZWnX0Cm3H55MOhbD1g+E/g==", + "license": "MIT", + "dependencies": { + "@rollup/plugin-node-resolve": "^15.2.3", + "flowbite": "^2.0.0" + } + }, + "node_modules/flowbite-datepicker/node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/flowbite-datepicker/node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/flowbite-datepicker/node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/flowbite-datepicker/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/flowbite-datepicker/node_modules/flowbite": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.5.2.tgz", + "integrity": "sha512-kwFD3n8/YW4EG8GlY3Od9IoKND97kitO+/ejISHSqpn3vw2i5K/+ZI8Jm2V+KC4fGdnfi0XZ+TzYqQb4Q1LshA==", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.3", + "flowbite-datepicker": "^1.3.0", + "mini-svg-data-uri": "^1.4.3" + } + }, + "node_modules/flowbite-datepicker/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -12312,6 +12426,15 @@ "webpack": "^5.0.0" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", diff --git a/package.json b/package.json index 0d7f6d3..7aecfc9 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@testing-library/user-event": "^13.5.0", "dotenv": "^17.2.3", "firebase": "^12.4.0", + "flowbite": "^3.1.2", "lucide-react": "^0.540.0", "react": "^19.1.0", "react-dom": "^19.1.0", diff --git a/src/components/Body.js b/src/components/Body.js index 77eeb0f..8579696 100644 --- a/src/components/Body.js +++ b/src/components/Body.js @@ -16,8 +16,12 @@ import { addUser, removeUser } from '../utils/userSlice'; import Header from './header'; import ProtectedRoute from './ProtectedRoute'; import Header from './header'; + +import Faq from './Faq'; + import Footer from './Footer'; + const Body = () => { const dispatch = useDispatch(); const user = useSelector(store => store.user.name); @@ -51,6 +55,7 @@ const Body = () => {
+
); } diff --git a/src/components/Faq.js b/src/components/Faq.js new file mode 100644 index 0000000..ca4c71d --- /dev/null +++ b/src/components/Faq.js @@ -0,0 +1,107 @@ +import React, { useState } from "react"; + +function Faq() { + const [openIndex, setOpenIndex] = useState(null); + + const toggle = (index) => { + setOpenIndex((prev) => (prev === index ? null : index)); + }; + + const faqs = [ + { + question: "What is NEXUS?", + answer: ( + <> +

+ NEXUS is a movie streaming platform where you can watch movies online for free. +

+ + ), + }, + { + question: "Is Nexus free?", + answer: ( + <> +

+ Yes! NEXUS is free for everyone. +

+ + ), + }, + { + question: "Does Nexus support 4K streaming?", + answer: ( + <> +

+ Yes! Nexus fully supports 4K Ultra HD streaming to give you a + sharp, cinematic viewing experience. Whether you're watching movies + or bingeing series, you'll enjoy crystal-clear visuals with vibrant + colors and smooth playback — as long as your device and internet + connection support it. +

+ + ), + }, + { + question: "Is Nexus available on multiple devices?", + answer: ( + <> +

+ Absolutely! You can access Nexus on smart TVs, mobile phones, tablets, + and web browsers. Your watch history and preferences sync + automatically, so you can start a show on one device and continue on + another seamlessly. +

+ + ), + }, + ]; + + return ( +
+
+ {faqs.map((item, index) => ( +
+ + {openIndex === index && ( +
+ {item.answer} +
+ )} +
+ ))} +
+
+
+
+ © 2025 NEXUS • Premium Streaming +
+
+
+
+ ); +} + +export default Faq; diff --git a/src/components/Login.js b/src/components/Login.js index 8a63879..7c3bb69 100644 --- a/src/components/Login.js +++ b/src/components/Login.js @@ -500,13 +500,7 @@ const Login = () => { {/* Ultra Responsive Bottom Footer */} -
-
-
- © 2025 NEXUS • Premium Streaming -
-
-
+ ); }; diff --git a/src/components/NeuralChat.js b/src/components/NeuralChat.js index 1dac3c5..11a701e 100644 --- a/src/components/NeuralChat.js +++ b/src/components/NeuralChat.js @@ -339,7 +339,11 @@ Give them amazing movie suggestions that match what they want!`; const handleQuickPrompt = (prompt) => { setInput(prompt); - + + if (window.innerWidth < 1024) { + setIsToggle(false); + } + setTimeout(() => { handleSendMessage(); }, 100); diff --git a/src/components/header.js b/src/components/header.js index 428f3d0..3f453e6 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -396,6 +396,9 @@ const Header = () => { )} + + + {/* Custom Mobile Animation Styles */}