From f9f029445c6e29fc9369f936514f46b3d43e87e3 Mon Sep 17 00:00:00 2001
From: RENU KUMARI PRAJAPATI <152794326+Renu-code123@users.noreply.github.com>
Date: Sun, 21 Sep 2025 18:29:33 +0530
Subject: [PATCH 1/4] Update Footer.jsx
---
frontend/src/components/Footer/Footer.jsx | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/frontend/src/components/Footer/Footer.jsx b/frontend/src/components/Footer/Footer.jsx
index 6984d8c..fa45bf5 100644
--- a/frontend/src/components/Footer/Footer.jsx
+++ b/frontend/src/components/Footer/Footer.jsx
@@ -14,6 +14,7 @@ import TwitterIcon from '../Icons/TwitterIcon';
import LinkedInIcon from '../Icons/LinkedInIcon';
import GithubIcon from '../Icons/GithubIcon';
import FooterLogo from './FooterLogo';
+import NewsletterSubscription from '../Newsletter/NewsletterSubscription';
const Footer = () => {
return (
@@ -59,6 +60,10 @@ const Footer = () => {
Contact@foodie.com
+ {/* Newsletter Subscription */}
+
+
+
From 2ad59918285090f63252fbf250f71d622e0a7b20 Mon Sep 17 00:00:00 2001
From: RENU KUMARI PRAJAPATI <152794326+Renu-code123@users.noreply.github.com>
Date: Sun, 21 Sep 2025 18:37:08 +0530
Subject: [PATCH 2/4] Update Footer.css
---
frontend/src/components/Footer/Footer.css | 31 ++++++++++++++++++-----
1 file changed, 24 insertions(+), 7 deletions(-)
diff --git a/frontend/src/components/Footer/Footer.css b/frontend/src/components/Footer/Footer.css
index 2e3be09..2283c65 100644
--- a/frontend/src/components/Footer/Footer.css
+++ b/frontend/src/components/Footer/Footer.css
@@ -15,11 +15,10 @@
.footer-content{
width: 100%;
display: grid;
- grid-template-columns: 2fr 1fr 1fr;
- gap: 80px;
+ grid-template-columns: 2fr 1fr 1fr 1.5fr;
+ gap: 60px;
}
-
-.footer-content-left, .footer-content-right, .footer-content-center{
+ .footer-content-left, .footer-content-right, .footer-content-center, .footer-content-newsletter{
display: flex;
flex-direction: column;
align-items: start;
@@ -27,7 +26,7 @@
color: rgb(233, 207, 207);
}
-.footer-content-left li, .footer-content-right li, .footer-content-center li{
+ .footer-content-left li, .footer-content-right li, .footer-content-center li, .footer-content-newsletter li{
list-style-type: none;
margin-bottom: 10px;
cursor: pointer;
@@ -117,7 +116,21 @@
.footer p {
color: rgb(233, 207, 207);
}
-
+/* Tablet Layout */
+@media (max-width: 1024px) and (min-width: 751px) {
+ .footer-content {
+ grid-template-columns: 1.5fr 1fr 1fr;
+ gap: 40px;
+ }
+ .footer-content-newsletter {
+ grid-column: 1 / -1;
+ align-items: center;
+ text-align: center;
+ margin-top: 20px;
+ padding-top: 20px;
+ border-top: 1px solid #444;
+ }
+}
@media (max-width:750px){
.footer-content{
display: flex;
@@ -127,6 +140,10 @@
.footer-copyright{
text-align: center;
}
+ .footer-content-newsletter {
+ align-items: center;
+ text-align: center;
+ }
}
.nav-link {
@@ -148,4 +165,4 @@
.logo-text {
fill: rgb(243, 113, 38);
-}
\ No newline at end of file
+}
From abea31c235e50c409f0fb256f427c9d66fe0d38b Mon Sep 17 00:00:00 2001
From: RENU KUMARI PRAJAPATI <152794326+Renu-code123@users.noreply.github.com>
Date: Sun, 21 Sep 2025 18:42:04 +0530
Subject: [PATCH 3/4] Create NewsletterSubscription.css
---
.../Newsletter/NewsletterSubscription.css | 237 ++++++++++++++++++
1 file changed, 237 insertions(+)
create mode 100644 frontend/src/components/Newsletter/NewsletterSubscription.css
diff --git a/frontend/src/components/Newsletter/NewsletterSubscription.css b/frontend/src/components/Newsletter/NewsletterSubscription.css
new file mode 100644
index 0000000..bf85f5e
--- /dev/null
+++ b/frontend/src/components/Newsletter/NewsletterSubscription.css
@@ -0,0 +1,237 @@
+.newsletter-section {
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ gap: 20px;
+ color: rgb(233, 207, 207);
+}
+
+.newsletter-title {
+ position: relative;
+ display: inline-block;
+ color: white;
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+
+.newsletter-title::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ bottom: -5px;
+ width: 100%;
+ height: 3px;
+ background-color: rgb(243, 113, 38);
+ transform: scaleX(0);
+ transform-origin: left;
+ transition: transform 0.5s ease;
+}
+
+.newsletter-title:hover::after {
+ transform: scaleX(1);
+}
+
+.newsletter-title:hover {
+ -webkit-text-fill-color: rgb(243, 113, 38);
+}
+
+.newsletter-description {
+ color: rgb(233, 207, 207);
+ font-size: 0.9rem;
+ line-height: 1.5;
+ margin-bottom: 10px;
+}
+
+.newsletter-form {
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+ width: 100%;
+ max-width: 280px;
+}
+
+.newsletter-input-container {
+ position: relative;
+ display: flex;
+ align-items: center;
+}
+
+.newsletter-input-icon {
+ position: absolute;
+ left: 12px;
+ color: #888;
+ font-size: 1.1rem;
+ z-index: 1;
+}
+
+.newsletter-input {
+ width: 100%;
+ padding: 12px 15px 12px 40px;
+ border: 2px solid #444;
+ border-radius: 25px;
+ background-color: #2a2a2a;
+ color: white;
+ font-size: 0.9rem;
+ outline: none;
+ transition: all 0.3s ease;
+}
+
+.newsletter-input::placeholder {
+ color: #888;
+}
+
+.newsletter-input:focus {
+ border-color: rgb(243, 113, 38);
+ box-shadow: 0 0 10px rgba(243, 113, 38, 0.3);
+ background-color: #333;
+}
+
+.newsletter-input:focus ~ .newsletter-input-icon,
+.newsletter-input:focus + .newsletter-input-icon {
+ color: rgb(243, 113, 38);
+}
+
+.newsletter-input.error {
+ border-color: #ff4444;
+ box-shadow: 0 0 10px rgba(255, 68, 68, 0.3);
+}
+
+.newsletter-input:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+
+.newsletter-button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ padding: 12px 20px;
+ background: linear-gradient(135deg, rgb(243, 113, 38), rgb(255, 140, 60));
+ color: white;
+ border: none;
+ border-radius: 25px;
+ font-size: 0.9rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+}
+
+.newsletter-button:hover {
+ background: linear-gradient(135deg, rgb(220, 100, 35), rgb(243, 113, 38));
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(243, 113, 38, 0.4);
+}
+
+.newsletter-button:active {
+ transform: translateY(0);
+}
+
+.newsletter-button:disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+ transform: none;
+}
+
+.newsletter-button-icon {
+ font-size: 1.1rem;
+}
+
+.loading-spinner {
+ width: 16px;
+ height: 16px;
+ border: 2px solid transparent;
+ border-top: 2px solid white;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.newsletter-message {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 10px 15px;
+ border-radius: 8px;
+ font-size: 0.85rem;
+ font-weight: 500;
+ animation: slideIn 0.3s ease-out;
+}
+
+.newsletter-message.success {
+ background-color: rgba(34, 197, 94, 0.15);
+ border: 1px solid rgba(34, 197, 94, 0.3);
+ color: #22c55e;
+}
+
+.newsletter-message.error {
+ background-color: rgba(239, 68, 68, 0.15);
+ border: 1px solid rgba(239, 68, 68, 0.3);
+ color: #ef4444;
+}
+
+.message-icon {
+ font-size: 1rem;
+ flex-shrink: 0;
+}
+
+@keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.newsletter-privacy {
+ color: #888;
+ font-size: 0.75rem;
+ margin-top: 5px;
+}
+
+/* Responsive Design */
+@media (max-width: 750px) {
+ .newsletter-section {
+ align-items: center;
+ text-align: center;
+ }
+
+ .newsletter-form {
+ max-width: 100%;
+ width: 100%;
+ }
+
+ .newsletter-title {
+ font-size: 1.3rem;
+ }
+
+ .newsletter-description {
+ font-size: 0.85rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .newsletter-input {
+ font-size: 0.85rem;
+ padding: 10px 12px 10px 35px;
+ }
+
+ .newsletter-button {
+ font-size: 0.85rem;
+ padding: 10px 16px;
+ }
+
+ .newsletter-input-icon {
+ font-size: 1rem;
+ left: 10px;
+ }
+}
From cc78c08e9f7a5d1eea9817be5dfef3294234db07 Mon Sep 17 00:00:00 2001
From: RENU KUMARI PRAJAPATI <152794326+Renu-code123@users.noreply.github.com>
Date: Sun, 21 Sep 2025 18:42:58 +0530
Subject: [PATCH 4/4] Create NewsletterSubscription.jsx
---
.../Newsletter/NewsletterSubscription.jsx | 115 ++++++++++++++++++
1 file changed, 115 insertions(+)
create mode 100644 frontend/src/components/Newsletter/NewsletterSubscription.jsx
diff --git a/frontend/src/components/Newsletter/NewsletterSubscription.jsx b/frontend/src/components/Newsletter/NewsletterSubscription.jsx
new file mode 100644
index 0000000..9005de0
--- /dev/null
+++ b/frontend/src/components/Newsletter/NewsletterSubscription.jsx
@@ -0,0 +1,115 @@
+import React, { useState } from 'react';
+import { IoIosMail } from "react-icons/io";
+import { BiMailSend } from "react-icons/bi";
+import { FaCheck } from "react-icons/fa";
+import { MdError } from "react-icons/md";
+import './NewsletterSubscription.css';
+
+const NewsletterSubscription = () => {
+ const [email, setEmail] = useState('');
+ const [isLoading, setIsLoading] = useState(false);
+ const [status, setStatus] = useState(''); // 'success', 'error', ''
+ const [message, setMessage] = useState('');
+
+ const validateEmail = (email) => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ return emailRegex.test(email);
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ if (!email.trim()) {
+ setStatus('error');
+ setMessage('Please enter your email address');
+ return;
+ }
+
+ if (!validateEmail(email)) {
+ setStatus('error');
+ setMessage('Please enter a valid email address');
+ return;
+ }
+
+ setIsLoading(true);
+ setStatus('');
+ setMessage('');
+
+ try {
+ // Simulate API call - replace with actual backend endpoint
+ await new Promise(resolve => setTimeout(resolve, 1500));
+
+ // For now, just show success message
+ setStatus('success');
+ setMessage('Thank you for subscribing! Check your email for confirmation.');
+ setEmail('');
+
+ // Hide success message after 5 seconds
+ setTimeout(() => {
+ setStatus('');
+ setMessage('');
+ }, 5000);
+ } catch (error) {
+ setStatus('error');
+ setMessage('Something went wrong. Please try again later.');
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+
Stay Updated
+
+ Subscribe to our newsletter and get the latest updates, exclusive offers, and delicious deals delivered to your inbox!
+
+
+
+
+ {/* Status Messages */}
+ {message && (
+
+ {status === 'success' ? (
+
+ ) : (
+
+ )}
+ {message}
+
+ )}
+
+
+ We respect your privacy. Unsubscribe at any time.
+
+
+ );
+};
+
+export default NewsletterSubscription;