diff --git a/Apple download.svg b/Apple download.svg deleted file mode 100644 index dc84313..0000000 --- a/Apple download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/package.json b/package.json index 9c21845..d549cae 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "NODE_OPTIONS=--max-old-space-size=6144 next dev", "build": "next build", "start": "next start", "lint": "eslint" diff --git a/platfrom.png b/platfrom.png deleted file mode 100644 index d4b5e31..0000000 Binary files a/platfrom.png and /dev/null differ diff --git a/public/Food.svg b/public/Food.svg deleted file mode 100644 index 1849a6e..0000000 --- a/public/Food.svg +++ /dev/null @@ -1 +0,0 @@ -MonTueWedNearleMonTueWedNearle \ No newline at end of file diff --git a/public/apple-download.svg b/public/icons/apple-download.svg similarity index 100% rename from public/apple-download.svg rename to public/icons/apple-download.svg diff --git a/public/apple-icon.png b/public/icons/apple-icon.png similarity index 100% rename from public/apple-icon.png rename to public/icons/apple-icon.png diff --git a/public/play-download.svg b/public/icons/play-download.svg similarity index 100% rename from public/play-download.svg rename to public/icons/play-download.svg diff --git a/play 1.svg b/public/icons/play.svg similarity index 100% rename from play 1.svg rename to public/icons/play.svg diff --git a/public/about.webp b/public/images/hero/about.webp similarity index 100% rename from public/about.webp rename to public/images/hero/about.webp diff --git a/public/images/business1.webp b/public/images/hero/business1.webp similarity index 100% rename from public/images/business1.webp rename to public/images/hero/business1.webp diff --git a/public/contact-page1.webp b/public/images/hero/contact-page1.webp similarity index 100% rename from public/contact-page1.webp rename to public/images/hero/contact-page1.webp diff --git a/public/images/home1.webp b/public/images/hero/home1.webp similarity index 100% rename from public/images/home1.webp rename to public/images/hero/home1.webp diff --git a/public/images/hero/iphone-chrome.svg b/public/images/hero/iphone-chrome.svg new file mode 100644 index 0000000..a5d9087 --- /dev/null +++ b/public/images/hero/iphone-chrome.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/hero/iphone-frame.svg b/public/images/hero/iphone-frame.svg new file mode 100644 index 0000000..70b767f --- /dev/null +++ b/public/images/hero/iphone-frame.svg @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/nearle-people.webp b/public/images/hero/nearle-people.webp similarity index 100% rename from public/nearle-people.webp rename to public/images/hero/nearle-people.webp diff --git a/public/images/people1.webp b/public/images/hero/people1.webp similarity index 100% rename from public/images/people1.webp rename to public/images/hero/people1.webp diff --git a/public/images/nearle-redesign/better-local-value.webp b/public/images/illustrations/better-local-value.webp similarity index 100% rename from public/images/nearle-redesign/better-local-value.webp rename to public/images/illustrations/better-local-value.webp diff --git a/public/brand part.png b/public/images/illustrations/brand-part.png similarity index 100% rename from public/brand part.png rename to public/images/illustrations/brand-part.png diff --git a/public/convenience.svg b/public/images/illustrations/convenience.svg similarity index 100% rename from public/convenience.svg rename to public/images/illustrations/convenience.svg diff --git a/customer.svg b/public/images/illustrations/customer.svg similarity index 100% rename from customer.svg rename to public/images/illustrations/customer.svg diff --git a/public/customers.svg b/public/images/illustrations/customers.svg similarity index 100% rename from public/customers.svg rename to public/images/illustrations/customers.svg diff --git a/public/d2c bg1.png b/public/images/illustrations/d2c-bg1.png similarity index 100% rename from public/d2c bg1.png rename to public/images/illustrations/d2c-bg1.png diff --git a/public/images/nearle-redesign/delivery-doorstep.webp b/public/images/illustrations/delivery-doorstep.webp similarity index 100% rename from public/images/nearle-redesign/delivery-doorstep.webp rename to public/images/illustrations/delivery-doorstep.webp diff --git a/public/images/nearle-redesign/easy-reordering.webp b/public/images/illustrations/easy-reordering.webp similarity index 100% rename from public/images/nearle-redesign/easy-reordering.webp rename to public/images/illustrations/easy-reordering.webp diff --git a/Food.svg b/public/images/illustrations/food.svg similarity index 100% rename from Food.svg rename to public/images/illustrations/food.svg diff --git a/public/Gemini_Generated_Image_lxh416lxh416lxh4.png b/public/images/illustrations/gemini-generated-image.png similarity index 100% rename from public/Gemini_Generated_Image_lxh416lxh416lxh4.png rename to public/images/illustrations/gemini-generated-image.png diff --git a/public/images/nearle-redesign/heading-shopper.webp b/public/images/illustrations/heading-shopper.webp similarity index 100% rename from public/images/nearle-redesign/heading-shopper.webp rename to public/images/illustrations/heading-shopper.webp diff --git a/public/images/nearle-redesign/heading-store.webp b/public/images/illustrations/heading-store.webp similarity index 100% rename from public/images/nearle-redesign/heading-store.webp rename to public/images/illustrations/heading-store.webp diff --git a/public/location.svg b/public/images/illustrations/location.svg similarity index 100% rename from public/location.svg rename to public/images/illustrations/location.svg diff --git a/public/nerale (1).png b/public/images/illustrations/nerale.png similarity index 100% rename from public/nerale (1).png rename to public/images/illustrations/nerale.png diff --git a/public/images/nearle-redesign/shops-you-know.webp b/public/images/illustrations/shops-you-know.webp similarity index 100% rename from public/images/nearle-redesign/shops-you-know.webp rename to public/images/illustrations/shops-you-know.webp diff --git a/public/super.png b/public/images/illustrations/super.png similarity index 100% rename from public/super.png rename to public/images/illustrations/super.png diff --git a/public/superhero.png b/public/images/illustrations/superhero.png similarity index 100% rename from public/superhero.png rename to public/images/illustrations/superhero.png diff --git a/public/images/nearle-redesign/support-local-business.webp b/public/images/illustrations/support-local-business.webp similarity index 100% rename from public/images/nearle-redesign/support-local-business.webp rename to public/images/illustrations/support-local-business.webp diff --git a/public/trust.svg b/public/images/illustrations/trust.svg similarity index 100% rename from public/trust.svg rename to public/images/illustrations/trust.svg diff --git a/public/vegetable.png b/public/images/illustrations/vegetable.png similarity index 100% rename from public/vegetable.png rename to public/images/illustrations/vegetable.png diff --git a/artificial intelligence booting.svg b/public/images/platform/ai-booting.svg similarity index 100% rename from artificial intelligence booting.svg rename to public/images/platform/ai-booting.svg diff --git a/public/images/app-mockup.webp b/public/images/platform/app-mockup.webp similarity index 100% rename from public/images/app-mockup.webp rename to public/images/platform/app-mockup.webp diff --git a/public/mobile-image.webp b/public/images/platform/mobile-image.webp similarity index 100% rename from public/mobile-image.webp rename to public/images/platform/mobile-image.webp diff --git a/public/platform.png b/public/images/platform/platform.png similarity index 100% rename from public/platform.png rename to public/images/platform/platform.png diff --git a/public/images/cat-daily-essentials.webp b/public/images/stores/cat-daily-essentials.webp similarity index 100% rename from public/images/cat-daily-essentials.webp rename to public/images/stores/cat-daily-essentials.webp diff --git a/public/images/cat-health-wellness.webp b/public/images/stores/cat-health-wellness.webp similarity index 100% rename from public/images/cat-health-wellness.webp rename to public/images/stores/cat-health-wellness.webp diff --git a/public/images/cat-home-services.webp b/public/images/stores/cat-home-services.webp similarity index 100% rename from public/images/cat-home-services.webp rename to public/images/stores/cat-home-services.webp diff --git a/public/images/cat-hot-food.webp b/public/images/stores/cat-hot-food.webp similarity index 100% rename from public/images/cat-hot-food.webp rename to public/images/stores/cat-hot-food.webp diff --git a/public/images/cat-pet-essentials.webp b/public/images/stores/cat-pet-essentials.webp similarity index 100% rename from public/images/cat-pet-essentials.webp rename to public/images/stores/cat-pet-essentials.webp diff --git a/public/images/nearle-merchant/catalogue-ui.webp b/public/images/stores/catalogue-ui.webp similarity index 100% rename from public/images/nearle-merchant/catalogue-ui.webp rename to public/images/stores/catalogue-ui.webp diff --git a/public/images/nearle-merchant/delivery-support.webp b/public/images/stores/delivery-support.webp similarity index 100% rename from public/images/nearle-merchant/delivery-support.webp rename to public/images/stores/delivery-support.webp diff --git a/public/images/nearle-merchant/local-map.webp b/public/images/stores/local-map.webp similarity index 100% rename from public/images/nearle-merchant/local-map.webp rename to public/images/stores/local-map.webp diff --git a/public/images/nearle-merchant/merchant-hero.webp b/public/images/stores/merchant-hero.webp similarity index 100% rename from public/images/nearle-merchant/merchant-hero.webp rename to public/images/stores/merchant-hero.webp diff --git a/public/merchant.png b/public/images/stores/merchant.png similarity index 100% rename from public/merchant.png rename to public/images/stores/merchant.png diff --git a/public/nearle-qr-code.png b/public/images/stores/nearle-qr-code.png similarity index 100% rename from public/nearle-qr-code.png rename to public/images/stores/nearle-qr-code.png diff --git a/public/images/nearle-merchant/qr-stand.webp b/public/images/stores/qr-stand.webp similarity index 100% rename from public/images/nearle-merchant/qr-stand.webp rename to public/images/stores/qr-stand.webp diff --git a/public/images/nearle-merchant/success-owner.webp b/public/images/stores/success-owner.webp similarity index 100% rename from public/images/nearle-merchant/success-owner.webp rename to public/images/stores/success-owner.webp diff --git a/public/why-nearle.png b/public/images/why-nearle/why-nearle.png similarity index 100% rename from public/why-nearle.png rename to public/images/why-nearle/why-nearle.png diff --git a/Dlivery Map.svg b/public/images/workflow/delivery-map.svg similarity index 100% rename from Dlivery Map.svg rename to public/images/workflow/delivery-map.svg diff --git a/public/delivery.png b/public/images/workflow/delivery.png similarity index 100% rename from public/delivery.png rename to public/images/workflow/delivery.png diff --git a/public/images/nearle-how/how-grocery-bag.webp b/public/images/workflow/how-grocery-bag.webp similarity index 100% rename from public/images/nearle-how/how-grocery-bag.webp rename to public/images/workflow/how-grocery-bag.webp diff --git a/public/images/nearle-how/how-storefront.webp b/public/images/workflow/how-storefront.webp similarity index 100% rename from public/images/nearle-how/how-storefront.webp rename to public/images/workflow/how-storefront.webp diff --git a/public/map1.webp b/public/images/workflow/map1.webp similarity index 100% rename from public/map1.webp rename to public/images/workflow/map1.webp diff --git a/public/logo-light.png b/public/logos/logo-light.png similarity index 100% rename from public/logo-light.png rename to public/logos/logo-light.png diff --git a/public/logo.png b/public/logos/logo.png similarity index 100% rename from public/logo.png rename to public/logos/logo.png diff --git a/take_screenshot.js b/scripts/take-screenshot.js similarity index 100% rename from take_screenshot.js rename to scripts/take-screenshot.js diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index e629d06..80f36cd 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -2,10 +2,10 @@ import React from "react"; import Image from "next/image"; import Link from "next/link"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { AboutHero } from "@/components/heroes/AboutHero"; -import { AnimatedSection } from "@/components/motion/AnimatedSection"; -import { AnimatedGrid, AnimatedCard } from "@/components/motion/AnimatedGrid"; +import { AnimatedSection } from "@/components/animations/AnimatedSection"; +import { AnimatedGrid, AnimatedCard } from "@/components/animations/AnimatedGrid"; import { FloatingDelivery } from "@/components/about/FloatingDelivery"; import type { Metadata } from "next"; @@ -20,7 +20,7 @@ const STRATEGY_CARDS = [ descr: "To help average stores perform like the great ones, not just by selling products, but by building a strong brand identity and real relationships with customers through Nearle.", icon: "target", iconClass: "bg-[#6330D6]/[0.07] text-[#6330D6] border-[#6330D6]/10", - image: "/images/nearle-how/how-storefront.webp", + image: "/images/workflow/how-storefront.webp", imageAlt: "3D local store storefront with purple awning", imgFit: "object-contain object-bottom" }, @@ -29,7 +29,7 @@ const STRATEGY_CARDS = [ descr: "Our vision is to make every neighbourhood more connected by helping people discover, support, and shop from the local businesses around them.", icon: "visibility", iconClass: "bg-secondary/[0.07] text-secondary border-secondary/10", - image: "/images/nearle-merchant/local-map.webp", + image: "/images/stores/local-map.webp", imageAlt: "Nearle local neighbourhood map", imgFit: "object-cover object-center" }, @@ -38,7 +38,7 @@ const STRATEGY_CARDS = [ descr: "Nearle is essential for a business to grow by leveraging the full potential of its neighbourhood. It is an indispensable tool for consumers to take advantage of what their neighbourhood has to offer.", icon: "help_outline", iconClass: "bg-[#6330D6]/10 text-[#6330D6] border-[#6330D6]/20", - image: "/images/app-mockup.webp", + image: "/images/platform/app-mockup.webp", imageAlt: "Nearle app on a smartphone", imgFit: "object-contain object-bottom" } diff --git a/src/app/brands/page.tsx b/src/app/brands/page.tsx index 5d738e3..ee03684 100644 --- a/src/app/brands/page.tsx +++ b/src/app/brands/page.tsx @@ -2,11 +2,11 @@ import React from "react"; import Image from "next/image"; import Link from "next/link"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { BrandsHero } from "@/components/heroes/BrandsHero"; import { FAQAccordion } from "@/components/ui/FAQAccordion"; -import { AnimatedSection } from "@/components/motion/AnimatedSection"; -import { AnimatedGrid, AnimatedCard } from "@/components/motion/AnimatedGrid"; +import { AnimatedSection } from "@/components/animations/AnimatedSection"; +import { AnimatedGrid, AnimatedCard } from "@/components/animations/AnimatedGrid"; import { CTABanner } from "@/components/ui/CTABanner"; import { NetworkBackground } from "@/components/brands/NetworkBackground"; import { PartnershipConnector } from "@/components/brands/PartnershipConnector"; @@ -199,7 +199,7 @@ export default function BrandsPage() { {/* ─── Industries ─── */}
Daily essentials like milk, bread, and fresh produce stocked on Nearle stores
Health and personal care products stocked on Nearle stores
Pet essentials brand stocked on Nearle stores
Neighbourhood store owner reviewing brand orders on his phone ); diff --git a/src/app/businesses/page.tsx b/src/app/businesses/page.tsx index 5cbe117..784fdd8 100644 --- a/src/app/businesses/page.tsx +++ b/src/app/businesses/page.tsx @@ -2,11 +2,11 @@ import React from "react"; import Image from "next/image"; import Link from "next/link"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { BusinessFeaturesGrid } from "@/components/businesses/BusinessFeaturesGrid"; import { BusinessHero } from "@/components/heroes/BusinessHero"; -import { AnimatedSection } from "@/components/motion/AnimatedSection"; -import { AnimatedGrid, AnimatedCard } from "@/components/motion/AnimatedGrid"; +import { AnimatedSection } from "@/components/animations/AnimatedSection"; +import { AnimatedGrid, AnimatedCard } from "@/components/animations/AnimatedGrid"; import { CTABanner } from "@/components/ui/CTABanner"; import type { Metadata } from "next"; @@ -177,7 +177,7 @@ export default function BusinessesPage() {
Local shop storefront with purple awning and now online board
Nearle grocery bag filled with vegetables and packaged products. + This covers CSS-only motion it can't reach — Tailwind transitions/hover transforms + and the infinite keyframe loops (float, pulse-subtle, hero-bike-float, stroke-dash, + hero-map-drift). Near-instant rather than removed, so final states stay intact. */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2c5971d..3d2cddc 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,9 +1,9 @@ import type { Metadata, Viewport } from "next"; import { Lato } from "next/font/google"; import "./globals.css"; -import { MotionProvider } from "@/components/layout/MotionProvider"; -import { PremiumNavbar } from "@/components/layout/PremiumNavbar"; -import { PremiumFooter } from "@/components/layout/PremiumFooter"; +import { MotionProvider } from "@/components/common/MotionProvider"; +import { PremiumNavbar } from "@/components/navbar/PremiumNavbar"; +import { PremiumFooter } from "@/components/footer/PremiumFooter"; const lato = Lato({ subsets: ["latin"], @@ -41,7 +41,7 @@ export const metadata: Metadata = { type: "website", images: [ { - url: "/logo.png", + url: "/logos/logo.png", width: 512, height: 512, alt: "Nearle logo", @@ -53,13 +53,13 @@ export const metadata: Metadata = { title: "Nearle: Your Neighborhood, Delivered", description: "India's hyperlocal neighborhood commerce platform", - images: ["/logo.png"], + images: ["/logos/logo.png"], }, alternates: { canonical: "/" }, icons: { icon: "/favicon.ico", shortcut: "/favicon.ico", - apple: "/apple-icon.png", + apple: "/icons/apple-icon.png", }, robots: { index: true, follow: true }, }; @@ -78,7 +78,7 @@ const jsonLd = { "@id": "https://nearle.in/#organization", name: "Nearle", url: "https://nearle.in", - logo: "https://nearle.in/logo.png", + logo: "https://nearle.in/logos/logo.png", description: "Nearle is an AI Commerce platform that digitizes neighbourhood stores — with AI catalogs by ProductLLM, QR ordering, and local discovery — instead of replacing them.", sameAs: [ @@ -119,7 +119,7 @@ export default function RootLayout({
-
+
{children}
diff --git a/src/app/merchants/page.tsx b/src/app/merchants/page.tsx index c2e3179..44e1895 100644 --- a/src/app/merchants/page.tsx +++ b/src/app/merchants/page.tsx @@ -1,11 +1,11 @@ import React from "react"; import Link from "next/link"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { MerchantsHero } from "@/components/heroes/MerchantsHero"; import { FAQAccordion } from "@/components/ui/FAQAccordion"; -import { AnimatedSection } from "@/components/motion/AnimatedSection"; -import { AnimatedGrid, AnimatedCard } from "@/components/motion/AnimatedGrid"; +import { AnimatedSection } from "@/components/animations/AnimatedSection"; +import { AnimatedGrid, AnimatedCard } from "@/components/animations/AnimatedGrid"; import { CTABanner } from "@/components/ui/CTABanner"; import type { Metadata } from "next"; diff --git a/src/app/page.tsx b/src/app/page.tsx index 5169fa1..8340932 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,18 +1,21 @@ import type { Metadata } from "next"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { Hero } from "@/components/home/Hero"; +import { VoiceCommerceExperience } from "@/components/home/VoiceCommerceExperience"; +import { StoreJourney } from "@/components/home/experience/StoreJourney"; import { ServiceCategories } from "@/components/home/ServiceCategories"; import { WhyNearle } from "@/components/home/WhyNearle"; import { HowItWorks } from "@/components/home/HowItWorks"; import { HyperlocalFeatures } from "@/components/home/HyperlocalFeatures"; import { BusinessSection } from "@/components/home/BusinessSection"; import { WhyAICommerceWins } from "@/components/home/WhyAICommerceWins"; +import { AICommerceTeaser } from "@/components/home/AICommerceTeaser"; import { StoreQRSection } from "@/components/home/StoreQRSection"; export const metadata: Metadata = { title: "AI Commerce Platform for Neighbourhood Stores", description: - "Nearle is the AI Commerce platform that digitizes neighbourhood stores instead of replacing them. AI catalogs by ProductLLM, QR ordering, and local discovery — commerce that runs on your neighbourhood.", + "Nearle digitizes the neighbourhood stores you already trust. Shop from nearby merchants, let Nearle AI find products by natural language, and get orders packed by the shopkeeper and delivered by a Nearle rider.", openGraph: { title: "Nearle — AI Commerce Platform for Neighbourhood Stores", description: @@ -26,12 +29,15 @@ export default function HomePage() { return ( + + + ); diff --git a/src/app/people/page.tsx b/src/app/people/page.tsx index 91711dc..e526381 100644 --- a/src/app/people/page.tsx +++ b/src/app/people/page.tsx @@ -1,12 +1,12 @@ import React from "react"; import Image from "next/image"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { PeopleHero } from "@/components/heroes/PeopleHero"; -import { AnimatedSection } from "@/components/motion/AnimatedSection"; -import { AnimatedGrid, AnimatedCard } from "@/components/motion/AnimatedGrid"; +import { AnimatedSection } from "@/components/animations/AnimatedSection"; +import { AnimatedGrid, AnimatedCard } from "@/components/animations/AnimatedGrid"; import { AnimatedTimeline } from "@/components/delivery/AnimatedTimeline"; -import { siteContent } from "@/config/site-content"; +import { siteContent } from "@/constants/site-content"; import type { Metadata } from "next"; export const metadata: Metadata = { @@ -79,7 +79,7 @@ const OFFERINGS = [ descr: "Enjoy the comfort of elegant living. Nearle is India's first hyper-local managed platform bringing all amenities and requirements directly to your fingertips.", icon: "local_florist", color: "from-purple-500/10 to-indigo-500/10 text-primary border-purple-100", - image: "/nearle-people.webp", + image: "/images/hero/nearle-people.webp", isWide: false }, { @@ -88,7 +88,7 @@ const OFFERINGS = [ descr: "Pick hot deals within your neighbourhood. Stay updated on localized sales, discounts, and flash promotions happening today.", icon: "local_activity", color: "from-amber-500/10 to-orange-500/10 text-amber-700 border-amber-100", - image: "/images/app-mockup.webp", + image: "/images/platform/app-mockup.webp", isWide: false }, { @@ -97,7 +97,7 @@ const OFFERINGS = [ descr: "Enjoy the ease of the World Wide Web, fulfilled entirely by trusted local businesses. Avoid traffic lights, parking hassles, and pollution.", icon: "travel_explore", color: "from-green-500/10 to-emerald-500/10 text-secondary border-green-100", - image: "/super.png", + image: "/images/illustrations/super.png", isWide: false }, { @@ -106,7 +106,7 @@ const OFFERINGS = [ descr: "Enjoy safe, convenient shopping with custom pricing, resident promotions, and bulk order discounts negotiated for your community.", icon: "shopping_bag", color: "from-rose-500/10 to-pink-500/10 text-rose-700 border-rose-100", - image: "/images/cat-pet-essentials.webp", + image: "/images/stores/cat-pet-essentials.webp", isWide: false }, { @@ -115,7 +115,7 @@ const OFFERINGS = [ descr: "Order everything you need in your neighborhood with a single tap. A fast, organized last-mile delivery network ensures prompt fulfillment.", icon: "touch_app", color: "from-sky-500/10 to-blue-500/10 text-sky-700 border-sky-100", - image: "/about.webp", + image: "/images/hero/about.webp", isWide: true }, { @@ -124,7 +124,7 @@ const OFFERINGS = [ descr: "Get your fresh fruits, farm-fresh vegetables, dairy, and grocery items delivered instantly from verified local green grocers.", icon: "eco", color: "from-emerald-500/10 to-teal-500/10 text-emerald-700 border-emerald-100", - image: "/images/cat-daily-essentials.webp", + image: "/images/stores/cat-daily-essentials.webp", isWide: false }, { @@ -133,7 +133,7 @@ const OFFERINGS = [ descr: "Choose from the best local restaurants and neighborhood eateries close to your home. Hot food delivered with relevance and speed.", icon: "restaurant", color: "from-orange-500/10 to-red-500/10 text-orange-700 border-orange-100", - image: "/images/cat-hot-food.webp", + image: "/images/stores/cat-hot-food.webp", isWide: false }, { @@ -142,7 +142,7 @@ const OFFERINGS = [ descr: "Access custom-tailored local neighborhood services designed to integrate convenience directly into residential society living.", icon: "stars", color: "from-violet-500/10 to-purple-500/10 text-violet-700 border-violet-100", - image: "/images/cat-health-wellness.webp", + image: "/images/stores/cat-health-wellness.webp", isWide: false }, { @@ -151,7 +151,7 @@ const OFFERINGS = [ descr: "Book certified local service providers at your convenience. From handymen to laundry, pet care to pharmacy delivery, all in one place.", icon: "construction", color: "from-cyan-500/10 to-blue-500/10 text-cyan-700 border-cyan-100", - image: "/images/cat-home-services.webp", + image: "/images/stores/cat-home-services.webp", isWide: false } ]; diff --git a/src/app/platform/page.tsx b/src/app/platform/page.tsx index a5461be..73ace34 100644 --- a/src/app/platform/page.tsx +++ b/src/app/platform/page.tsx @@ -1,5 +1,5 @@ import type { Metadata } from "next"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { PlatformHero } from "@/components/platform/PlatformHero"; import { PlatformArchitecture } from "@/components/platform/PlatformArchitecture"; import { ProductFeatureGrid } from "@/components/platform/ProductFeatureGrid"; diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx index 6f2e24f..764d711 100644 --- a/src/app/privacy/page.tsx +++ b/src/app/privacy/page.tsx @@ -1,7 +1,7 @@ import React from "react"; import Link from "next/link"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import type { Metadata } from "next"; export const metadata: Metadata = { diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx index 6a84f16..5628605 100644 --- a/src/app/terms/page.tsx +++ b/src/app/terms/page.tsx @@ -1,7 +1,7 @@ import React from "react"; import Link from "next/link"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import type { Metadata } from "next"; export const metadata: Metadata = { diff --git a/src/app/why-nearle/page.tsx b/src/app/why-nearle/page.tsx index 1644b74..6bed0fd 100644 --- a/src/app/why-nearle/page.tsx +++ b/src/app/why-nearle/page.tsx @@ -1,5 +1,5 @@ import type { Metadata } from "next"; -import { PremiumPageShell } from "@/components/layout/PremiumPageShell"; +import { PremiumPageShell } from "@/components/common/PremiumPageShell"; import { WhyNearleHero } from "@/components/why-nearle/WhyNearleHero"; import { CommerceEvolution } from "@/components/why-nearle/CommerceEvolution"; import { AICommerceExplainer } from "@/components/why-nearle/AICommerceExplainer"; diff --git a/src/components/about/FloatingDelivery.tsx b/src/components/about/FloatingDelivery.tsx index f619f31..c61e4e3 100644 --- a/src/components/about/FloatingDelivery.tsx +++ b/src/components/about/FloatingDelivery.tsx @@ -13,7 +13,7 @@ export function FloatingDelivery() { transition={{ duration: 6, ease: "easeInOut", repeat: Infinity }} >
Nearle
Nearle
+
+ + + The Shift + + + Traditional commerce, reimagined by AI + + + +
+ {/* Column headers */} +
+ + Traditional Commerce + + + Nearle AI Commerce + +
+ + + {ROWS.map((row) => ( + + {/* Traditional side */} +
+ + + + + {row.traditional} + +
+ + {/* Nearle side */} +
+ + + + + {row.nearle} + +
+
+ ))} +
+ + + + Learn More + + + +
+
+
+ ); +} diff --git a/src/components/home/BusinessSection.tsx b/src/components/home/BusinessSection.tsx index a1e36af..e9351ea 100644 --- a/src/components/home/BusinessSection.tsx +++ b/src/components/home/BusinessSection.tsx @@ -11,7 +11,7 @@ const FEATURES = [ title: "AI Catalogue", desc: "Turn your shelf into a live online catalogue with ProductLLM — no manual data entry.", icon: "menu_book", - visual: "/images/nearle-merchant/catalogue-ui.webp", + visual: "/images/stores/catalogue-ui.webp", alt: "Clean grocery catalogue interface preview", tone: "bg-primary/8 text-primary", }, @@ -19,7 +19,7 @@ const FEATURES = [ title: "QR Ordering", desc: "Let customers scan, browse, and place orders directly from your store.", icon: "qr_code", - visual: "/images/nearle-merchant/qr-stand.webp", + visual: "/images/stores/qr-stand.webp", alt: "QR ordering stand on a local grocery store counter", tone: "bg-secondary/8 text-secondary", }, @@ -27,7 +27,7 @@ const FEATURES = [ title: "Local Discovery", desc: "Get discovered by nearby customers searching for products you sell.", icon: "location_on", - visual: "/images/nearle-merchant/local-map.webp", + visual: "/images/stores/local-map.webp", alt: "Local discovery map with purple pins and a store listing", tone: "bg-[#de96f9]/10 text-primary", }, @@ -35,7 +35,7 @@ const FEATURES = [ title: "Delivery Support", desc: "Deliver orders easily with your own staff or trusted local delivery partners.", icon: "local_shipping", - visual: "/images/nearle-merchant/delivery-support.webp", + visual: "/images/stores/delivery-support.webp", alt: "Local delivery partner handing a grocery bag to a customer", tone: "bg-rose-500/5 text-rose-600", }, @@ -105,7 +105,7 @@ function LocalDiscoveryVisual() { {/* Store Card (Right Side) */}
- Owner + Owner

Kumar Provision Store

@@ -279,7 +279,7 @@ export function BusinessSection() { >
Indian grocery shop owner using a smartphone inside a kirana store -
- - {/* REALISTIC MOBILE DEVICE FRAME */} -
- - {/* Hardware Buttons */} -
-
-
-
- - {/* Inner Black Bezel */} -
- - {/* Inner Screen */} -
- - {/* Dynamic Island */} -
-
-
-
-
- - {/* Status Bar */} -
- 9:41 -
- {/* Signal */} -
-
-
-
-
-
- {/* Wifi */} - - - - - {/* Battery */} -
-
-
-
-
-
- - {/* Map Visual Content */} -
- - - {[ - ["left-[17%] top-[30%]", "bg-primary"], - ["right-[16%] top-[28%]", "bg-[#006D37]"], - ["left-[20%] bottom-[33%]", "bg-[#006D37]"], - ["right-[18%] bottom-[32%]", "bg-primary"], - ["right-[35%] top-[20%]", "bg-primary"], - ].map(([position, color]) => ( -
-
-
-
-
- ))} - -
-
-
-
-
-
- -
-

Your Store

-
- - - 4.8 - - Open - 0.8 km -
-
-
-
-
-
- Offers -
-
- Shop -
-
-
- ); -} - -function StepVisual({ type }: { type: string }) { - if (type === "store") { - return ( -
-
- 3D local shop storefront with purple awning and now online board -
-
- ); - } - - if (type === "phone") { - return ( -
- -
- ); - } - - return ( -
-
- {["Offers & Discounts", "Loyal Customers", "Repeat Orders"].map((chip) => ( -
- {chip} -
- ))} -
-
- Nearle grocery bag filled with vegetables and packaged products -
-
- ); -} - export function HowItWorks() { return ( + <>
{/* HERO AREA */}
@@ -316,7 +127,7 @@ export function HowItWorks() {
Indian kirana-store owner using a laptop inside a grocery shop
+
- {/* CARDS SECTION */} -
+ {/* MERCHANT JOURNEY — self-contained cinematic showcase (auto-plays in + place; no sticky pin, so no empty scroll-track). */} +
- How It Works + Merchant Journey

- Build Your Neighbourhood Brand + From your shelf to a growing business

- Three simple milestones to scale your retail reach from offline streets straight into neighbourhood homes. + Eight steps, powered by AI. Join once, and Nearle turns your shelf into a + discoverable storefront while you stay at the centre of every order.

- - {STEPS.map((step) => ( - - - {step.num} - -
- -
-
-

- {step.title} -

-

- {step.desc} -

-
-
- -
-
- ))} -
-
- + + + ); } diff --git a/src/components/home/HyperlocalFeatures.tsx b/src/components/home/HyperlocalFeatures.tsx index f77ef66..a9b59ee 100644 --- a/src/components/home/HyperlocalFeatures.tsx +++ b/src/components/home/HyperlocalFeatures.tsx @@ -49,7 +49,7 @@ export function HyperlocalFeatures() { viewport={viewport} > Map Background Download Nearle on the App Store Download Nearle on Google Play Nearle Store QR Code Nearle mobile app interface Nearle Store QR Code Nearle mobile app interface Download Nearle on the App Store Download Nearle on Google Play + {/* Voice waves sit behind everything, centred on the phone side */} + + + +
+
+ {/* ─── LEFT: what it does ─── */} + + + + AI Voice Commerce + + + +
+ + Just speak. + +
+
+ {/* text-balance keeps the mobile wrap as "Nearle handles / + the rest." instead of orphaning "rest." on its own line */} + + Nearle handles the rest. + +
+
+ + + Order products, discover nearby stores, and book trusted local services using + natural conversation. + + + + {FEATURE_CHIPS.map((chip) => ( + + + {chip.emoji} + + {chip.label} + + ))} + + + + + + Try Voice Commerce + + + +
+ + {/* ─── RIGHT: the live phone ─── */} + + {/* Width-driven at every breakpoint — the 476/941 aspect ratio + derives the height, so the phone never collapses. */} +
+ {/* soft purple glow anchoring the device */} + + +
+
+ + ); +} diff --git a/src/components/home/WhyAICommerceWins.tsx b/src/components/home/WhyAICommerceWins.tsx index 33540d7..5f35ced 100644 --- a/src/components/home/WhyAICommerceWins.tsx +++ b/src/components/home/WhyAICommerceWins.tsx @@ -1,32 +1,46 @@ "use client"; import Link from "next/link"; -import { motion } from "framer-motion"; +import { motion, useReducedMotion } from "framer-motion"; import { MaterialIcon } from "@/components/ui/MaterialIcon"; import { fadeUp, fadeIn, staggerContainer, viewport } from "@/lib/animations"; const CARDS = [ { - title: "Neighbourhood Trust", - desc: "Every order is fulfilled by a real local shop your street already knows — not an anonymous warehouse.", - icon: "handshake", + title: "Understands your intent", + desc: "Reads natural language and knows what you actually need.", + icon: "psychology", color: "bg-primary/5 text-primary border-primary/10", }, { - title: "AI-Powered Catalog", - desc: "ProductLLM turns a shelf into a live, shoppable catalog in minutes — so any store can go online without the busywork.", - icon: "auto_awesome", + title: "Finds matching products", + desc: "Maps your intent to real items on your store’s shelves.", + icon: "inventory_2", color: "bg-secondary/5 text-secondary border-secondary/10", }, { - title: "Offline-First Commerce", - desc: "Billing and inventory keep working even when the network drops. Built for how neighbourhood stores really run.", - icon: "wifi_off", + title: "Recommends alternatives", + desc: "Out of stock? It suggests the closest match in the store.", + icon: "autorenew", color: "bg-[#de96f9]/10 text-primary border-[#de96f9]/20", }, + { + title: "Checks availability", + desc: "Confirms what’s in stock before you place the order.", + icon: "storefront", + color: "bg-secondary/5 text-secondary border-secondary/10", + }, + { + title: "Helps you shop faster", + desc: "Fewer taps — everyday essentials in just seconds.", + icon: "bolt", + color: "bg-primary/5 text-primary border-primary/10", + }, ]; export function WhyAICommerceWins() { + const reduce = useReducedMotion(); + return (
@@ -38,39 +52,43 @@ export function WhyAICommerceWins() { viewport={viewport} > - AI Commerce + The Assistant

- Why AI Commerce Wins + What Nearle AI Does

- Nearle isn’t another delivery app. It’s the AI layer that brings - neighbourhood stores online — without replacing them. + The store stays the hero. Nearle AI is the quiet assistant that helps you + find what you need inside it — faster.

- {CARDS.map((card) => ( + {CARDS.map((card, i) => ( -
- -
-

+ + + +

{card.title}

-

+

{card.desc}

diff --git a/src/components/home/WhyNearle.tsx b/src/components/home/WhyNearle.tsx index 7a10005..158cd1d 100644 --- a/src/components/home/WhyNearle.tsx +++ b/src/components/home/WhyNearle.tsx @@ -7,36 +7,28 @@ import { fadeUp, fadeIn, staggerContainer, viewport } from "@/lib/animations"; const CARDS = [ { - title: "Shops You Know", - desc: "Order from familiar neighbourhood stores near you.", - icon: "store", + title: "Shop Your Trusted Store", + desc: "Browse products from neighbourhood stores you already know and trust.", + icon: "storefront", color: "bg-primary/5 text-primary border-primary/10", - image: "/images/nearle-redesign/shops-you-know.webp", + image: "/images/illustrations/shops-you-know.webp", alt: "Friendly local grocery shop owner inside a kirana store", }, { - title: "Better Local Value", - desc: "Discover local offers and daily savings nearby.", - icon: "local_offer", - color: "bg-secondary/5 text-secondary border-secondary/10", - image: "/images/nearle-redesign/better-local-value.webp", - alt: "Fresh local vegetables and fruits with a local offers sign", - }, - { - title: "Easy Reordering", - desc: "Save your favourite stores for quick reordering.", - icon: "history", + title: "AI Assisted Shopping", + desc: "Search naturally. Nearle AI understands what you’re looking for and recommends relevant products.", + icon: "auto_awesome", color: "bg-[#de96f9]/10 text-primary border-[#de96f9]/20", - image: "/images/nearle-redesign/easy-reordering.webp", + image: "/images/illustrations/easy-reordering.webp", alt: "Hand holding a smartphone with a simple grocery ordering app", }, { - title: "Support Local Business", - desc: "Every order directly supports nearby shopkeepers.", - icon: "favorite", - color: "bg-rose-500/5 text-rose-700 border-rose-100", - image: "/images/nearle-redesign/support-local-business.webp", - alt: "Local shop owner and customer shaking hands inside a store", + title: "Local Delivery", + desc: "Orders go directly to the merchant and are delivered by Nearle riders.", + icon: "two_wheeler", + color: "bg-secondary/5 text-secondary border-secondary/10", + image: "/images/illustrations/support-local-business.webp", + alt: "Local shop owner handing a packed order to a delivery rider", }, ]; @@ -54,7 +46,7 @@ export function WhyNearle() { >

- Why Nearle Feels Different + Why Nearle

- Nearle brings the convenience of an app to the stores you already know and trust. + The store you trust, the assistant that helps you shop, and delivery that keeps + the merchant at the centre.

{/* Cards Grid */} + {steps.map((label, i) => { + const done = i < activeStep; + const active = i === activeStep; + return ( +
+ + {done ? ( + + + + ) : active ? ( + + ) : ( + + )} + + + {label} + +
+ ); + })} +
+ ); +} diff --git a/src/components/home/experience/StoreCanvas.tsx b/src/components/home/experience/StoreCanvas.tsx new file mode 100644 index 0000000..74e6082 --- /dev/null +++ b/src/components/home/experience/StoreCanvas.tsx @@ -0,0 +1,314 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { MaterialIcon } from "@/components/ui/MaterialIcon"; +import { AIThinking } from "./AIThinking"; +import { + AI_STEPS, + FULFILMENT_STEPS, + type JourneyStage, + type StoreJourney, +} from "@/hooks/useStoreJourney"; + +const screenEase = [0.22, 1, 0.36, 1] as [number, number, number, number]; +// Slow, smooth screen changes (Apple/Linear-style) instead of snappy cuts. +const screenMotion = { + initial: { opacity: 0, y: 14, scale: 0.985 }, + animate: { opacity: 1, y: 0, scale: 1 }, + exit: { opacity: 0, y: -12, scale: 0.99 }, + transition: { duration: 0.65, ease: screenEase }, +}; + +// Which visual screen a stage maps to (enter-store + search share one screen so +// the transition into typing stays seamless; fulfilment + done share the flow). +function screenKey(stage: JourneyStage): string { + if (stage === "enter-store" || stage === "search") return "storefront"; + if (stage === "done") return "fulfilment"; + return stage; +} + +// The device frame whose inner screen swaps as the journey advances. +export function StoreCanvas({ journey }: { journey: StoreJourney }) { + const { + stage, + stores, + store, + intent, + recommendation, + typed, + thinkingStep, + fulfilStep, + reduced, + selectStore, + } = journey; + + return ( +
+ {/* Ambient brand glow */} +