- {/* Connector Line (Desktop Only) */}
-
+ {/* Steps Layout - Timeline style */}
+
+ {/* Connecting Line (Desktop Only) */}
+
- {STEPS.map((step) => (
-
- {/* Step number watermark */}
-
- {step.num}
+
+ {STEPS.map((step) => (
+
+ {/* Icon Container with watermark number */}
+
+
+
+ {step.num}
+
+
+
+
+ {step.title}
+
+
+ {step.desc}
+
-
- {/* Step Circle with Icon */}
-
-
-
-
- {/* Title & Description */}
-
- {step.title}
-
-
- {step.desc}
-
-
- ))}
+ ))}
+
);
}
+
+
diff --git a/src/components/home/HyperlocalFeatures.tsx b/src/components/home/HyperlocalFeatures.tsx
index 47a1188..1150507 100644
--- a/src/components/home/HyperlocalFeatures.tsx
+++ b/src/components/home/HyperlocalFeatures.tsx
@@ -6,61 +6,64 @@ const FEATURES = [
{
title: "Trusted Nearby Stores",
icon: "store",
- desc: "Connect directly with the local merchants you know and shop from regularly.",
+ desc: "Connect directly with the local merchants you already know.",
},
{
- title: "Short-Distance Local Delivery",
+ title: "Short-Distance Delivery",
icon: "local_shipping",
- desc: "Delivered quickly from shops in your immediate area to keep food hot and groceries fresh.",
+ desc: "Delivered quickly from nearby shops to keep items fresh.",
},
{
title: "Easy Reorders",
icon: "replay",
- desc: "Save your favourite stores and reorder your weekly essentials in seconds.",
+ desc: "Save your favourite stores and reorder in seconds.",
},
{
title: "Support Local Businesses",
icon: "favorite",
- desc: "Help neighbourhood stores thrive and remain competitive in a digital world.",
+ desc: "Help local neighbourhood stores thrive digitally.",
},
];
export function HyperlocalFeatures() {
return (
-
+
{/* Scoped CSS styles for precise layout enforcement */}
+ @media (min-width: 901px) {
+ .custom-care-grid {
+ grid-template-columns: minmax(500px, 1fr) minmax(560px, 1.1fr) !important;
+ gap: 64px !important;
+ width: min(1360px, 100%) !important;
+ }
+ .custom-care-visual {
+ max-width: 530px !important;
+ height: 580px !important;
+ }
+ .custom-care-card {
+ min-height: 580px !important;
+ padding: 60px !important;
+ display: flex !important;
+ flex-direction: column !important;
+ justify-content: center !important;
+ }
+ }
+ @media (max-width: 900px) {
+ .custom-care-grid {
+ grid-template-columns: 1fr !important;
+ gap: 32px !important;
+ width: 100% !important;
+ }
+ .custom-care-visual {
+ max-width: 420px !important;
+ height: 460px !important;
+ }
+ .custom-care-card {
+ min-height: auto !important;
+ padding: 36px 24px !important;
+ }
+ }
+ `}
{/* Subtle background radial glows */}
@@ -130,7 +133,7 @@ export function HyperlocalFeatures() {
Community & Trust
-
+
Built Around Your
Neighbourhood
@@ -158,7 +161,7 @@ export function HyperlocalFeatures() {
-
+
{item.title}
@@ -200,3 +203,4 @@ export function HyperlocalFeatures() {
);
}
+
diff --git a/src/components/home/ServiceCategories.tsx b/src/components/home/ServiceCategories.tsx
index 203ef6a..ea96838 100644
--- a/src/components/home/ServiceCategories.tsx
+++ b/src/components/home/ServiceCategories.tsx
@@ -32,7 +32,7 @@ const CATEGORIES = [
image: "/images/cat-daily-essentials.png",
tag: "Local Store",
tagStyle: "bg-secondary text-white",
- desc: "Farm-fresh fruits and vegetables delivered from trusted local vendors.",
+ desc: "Farm-fresh fruits and vegetables from trusted local vendors.",
cta: "Browse Fresh",
},
{
@@ -40,7 +40,7 @@ const CATEGORIES = [
image: "/images/cat-pet-essentials.png",
tag: "Available Near You",
tagStyle: "bg-orange-500 text-white",
- desc: "Kitchen supplies, household cleaners, and other daily utility items.",
+ desc: "Kitchen supplies, household cleaners, and daily utilities.",
cta: "Shop Needs",
},
{
@@ -55,24 +55,24 @@ const CATEGORIES = [
export function ServiceCategories() {
return (
-
+
{/* Header Section */}
-
+
-
+
Neighbourhood Offerings
-
+
Explore Stores Near You
-
+
Groceries, medicines, food, and everyday essentials from nearby local shops.
View All Categories
@@ -139,3 +139,4 @@ export function ServiceCategories() {
);
}
+
diff --git a/src/components/home/StoreQRSection.tsx b/src/components/home/StoreQRSection.tsx
index e7d6cb5..7f91c4d 100644
--- a/src/components/home/StoreQRSection.tsx
+++ b/src/components/home/StoreQRSection.tsx
@@ -1,5 +1,4 @@
import Image from "next/image";
-import Link from "next/link";
import { MaterialIcon } from "@/components/ui/MaterialIcon";
const FLOW_STEPS = [
@@ -10,77 +9,249 @@ const FLOW_STEPS = [
export function StoreQRSection() {
return (
-
-
-
- {/* Left Column: Visual representation of QR Sticker/Counter */}
-
-
- {/* Decorative radial shine */}
-
-
- {/* Header inside QR Sticker */}
-
-
Order Online
-
Nearle Store QR
-
Nearle Partner Store
-
+
+ {/* Background ambient glowing details */}
+
+
- {/* Decorative QR Pattern */}
-
-
-
-
- {/* Footer label on QR Sticker */}
-
-
-
- Scan to Shop
-
-
-
-
-
- {/* Right Column: Copywriting and Steps */}
-
-
- Instant Connections
+
+
+ {/* ─── DESKTOP LAYOUT (lg and above) ─── */}
+
+
+ {/* Left Column: Heading, flow steps, download buttons */}
+
+
+ Instant Connections & App
-
- Your Favourite Store Is Now Just One Scan Away.
+
+ Scan to Shop,
+ Order in Your Pocket.
-
- See Nearle at a nearby store? Scan the QR code once, save the store, and order from it anytime.
+
+ Find Nearle QRs at nearby stores. Scan once to save it, then order groceries, food, or medicines from your favourite local merchant anytime.
- {/* Visual Steps Row */}
-
- {FLOW_STEPS.map((step) => (
-
-
-
+ {/* QR Steps row with arrows */}
+
+ {FLOW_STEPS.map((step, idx) => (
+
+
-
- {step.label}
-
+ {idx < FLOW_STEPS.length - 1 && (
+
+ )}
))}
-
- Find Stores Near You
-
+ {/* App Store Badges (Prominent White Buttons) */}
+
+
+
+ {/* Right Column: Visual components (QR Sticker & Phone Mockup) */}
+
+ {/* Small supporting visual: QR Sticker (Secondary) */}
+
+
+
Order Online
+
Store QR
+
+
+
+
+
+
+
+
+ Scan to Shop
+
+
+
+ {/* Primary large visual: Phone Mockup (Significantly Larger) */}
+
+
+
+
+ {/* Overlapping Confirmation Bubble */}
+
+
+
+
+
+
Order Confirmed
+
Your order is preparing
+
+
+
+ {/* ─── MOBILE & TABLET LAYOUT (below lg) ─── */}
+
+ {/* 1. Heading and description */}
+
+
+ Instant Connections & App
+
+
+ Scan to Shop,
Order in Pocket.
+
+
+ Scan Nearle QRs to instantly save local stores, and order from them anytime in one convenient app.
+
+
+
+ {/* 2. QR Sticker */}
+
+
+
Order Online
+
Store QR
+
+
+
+
+
+
+
+
+ Scan to Shop
+
+
+
+ {/* 3. Scan → Save → Order steps */}
+
+ {FLOW_STEPS.map((step, idx) => (
+
+
+
+
+
+
+ {step.label}
+
+
+ {idx < FLOW_STEPS.length - 1 && (
+
+ )}
+
+ ))}
+
+
+ {/* 4. Phone Mockup */}
+
+
+
+
+ {/* 5. App store buttons */}
+
+
+
);
diff --git a/src/components/home/WhyNearle.tsx b/src/components/home/WhyNearle.tsx
index 34233dc..0823462 100644
--- a/src/components/home/WhyNearle.tsx
+++ b/src/components/home/WhyNearle.tsx
@@ -9,19 +9,19 @@ const CARDS = [
},
{
title: "Better Local Value",
- desc: "Discover local offers and everyday essentials from nearby shops.",
+ desc: "Discover local offers and daily savings nearby.",
icon: "local_offer",
color: "bg-secondary/5 text-secondary border-secondary/10",
},
{
title: "Easy Reordering",
- desc: "Save your favourite stores and reorder quickly when you need something.",
+ desc: "Save your favourite stores for quick reordering.",
icon: "history",
color: "bg-[#de96f9]/10 text-primary border-[#de96f9]/20",
},
{
title: "Support Local Business",
- desc: "Every order helps nearby businesses grow digitally.",
+ desc: "Every order directly supports nearby shopkeepers.",
icon: "favorite",
color: "bg-rose-500/5 text-rose-700 border-rose-100",
},
@@ -29,29 +29,29 @@ const CARDS = [
export function WhyNearle() {
return (
-
+
{/* Header Section */}
-
+
Our Philosophy
-
+
Why Nearle Feels Different
-
+
Nearle brings the convenience of an app to the stores you already know and trust.
{/* Cards Grid */}
-
+
{CARDS.map((card) => (
-
+
@@ -67,3 +67,5 @@ export function WhyNearle() {
);
}
+
+
diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx
index d5dce10..d2218d1 100644
--- a/src/components/layout/Footer.tsx
+++ b/src/components/layout/Footer.tsx
@@ -43,7 +43,7 @@ type FooterFormErrors = {
export function Footer() {
const pathname = usePathname();
- const isContactPage = pathname === "/contact";
+ const isContactPage = pathname?.startsWith("/contact");
// Form states
const [formData, setFormData] = useState({
@@ -121,229 +121,273 @@ export function Footer() {
}, 5000);
};
- return (
-