From e261cde8f5dbc2979b7551ca4890310a498cc909 Mon Sep 17 00:00:00 2001 From: R-Bharathraj Date: Tue, 7 Jul 2026 13:21:13 +0530 Subject: [PATCH] updated pages --- public/logo_icons/apple-round.svg | 11 + public/logo_icons/apple.jpg | Bin 0 -> 19402 bytes public/logo_icons/images.png | Bin 0 -> 11597 bytes src/app/about_us/page.tsx | 85 +++--- src/app/for_people/page.tsx | 3 + src/app/page.tsx | 6 + src/app/solutions_page/page.tsx | 239 ++++++---------- src/app/use_cases/page.tsx | 260 ++++++++++++++++++ src/components/About.tsx | 154 ----------- src/components/BlogSection.tsx | 193 ------------- src/components/Footer.tsx | 6 +- src/components/GSAPReveal.tsx | 28 -- src/components/Partners.tsx | 153 ----------- src/components/PhoneWidget.tsx | 175 ------------ src/components/ProblemParticles.tsx | 196 ------------- src/components/Solutions.tsx | 237 ---------------- src/components/Testimonial.tsx | 211 -------------- .../for-people/DiscoverDealsSection.tsx | 42 ++- .../for-people/EarnRewardsSection.tsx | 36 ++- .../for-people/ExperienceSection.tsx | 73 +++-- src/components/for-people/FinalCTASection.tsx | 226 +++++++++++++-- src/components/for-people/HeroSection.tsx | 4 +- src/components/for-people/PhoneMockup.tsx | 33 ++- src/components/for-people/PillarsSection.tsx | 68 +++++ src/components/home/ProblemSection.tsx | 26 ++ 25 files changed, 853 insertions(+), 1612 deletions(-) create mode 100644 public/logo_icons/apple-round.svg create mode 100644 public/logo_icons/apple.jpg create mode 100644 public/logo_icons/images.png delete mode 100644 src/components/About.tsx delete mode 100644 src/components/BlogSection.tsx delete mode 100644 src/components/GSAPReveal.tsx delete mode 100644 src/components/Partners.tsx delete mode 100644 src/components/PhoneWidget.tsx delete mode 100644 src/components/ProblemParticles.tsx delete mode 100644 src/components/Solutions.tsx delete mode 100644 src/components/Testimonial.tsx create mode 100644 src/components/for-people/PillarsSection.tsx diff --git a/public/logo_icons/apple-round.svg b/public/logo_icons/apple-round.svg new file mode 100644 index 0000000..0c53155 --- /dev/null +++ b/public/logo_icons/apple-round.svg @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/public/logo_icons/apple.jpg b/public/logo_icons/apple.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a90d88e5d1babd04a7389c6808f4e53cbdb2b17 GIT binary patch literal 19402 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 literal 0 HcmV?d00001 diff --git a/public/logo_icons/images.png b/public/logo_icons/images.png new file mode 100644 index 0000000000000000000000000000000000000000..ef12c33fb248eb687bec4d0e91ca8d57534fb08a GIT binary patch literal 11597 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 Mw4PeIignok0g1N`xBvhE literal 0 HcmV?d00001 diff --git a/src/app/about_us/page.tsx b/src/app/about_us/page.tsx index dc50e88..5e52552 100644 --- a/src/app/about_us/page.tsx +++ b/src/app/about_us/page.tsx @@ -17,15 +17,6 @@ function Reveal({ children, delay = 0 }: { children: React.ReactNode; delay?: nu ); } -const VALUES = [ - { n: '01', title: 'Intelligence first', desc: 'Every product decision starts with data, not instinct.' }, - { n: '02', title: 'Merchant obsessed', desc: 'We build for the store owner who works 14-hour days.' }, - { n: '03', title: 'Radical transparency', desc: 'No black boxes. Our AI explains every recommendation.' }, - { n: '04', title: 'Build to last', desc: 'We optimise for long-term impact, not vanity metrics.' }, -]; - -const TEAM: { name: string; role: string; initials: string; color: string }[] = []; - export default function AboutUsPage() { return (
@@ -101,18 +92,18 @@ export default function AboutUsPage() { {[ { label: 'Mission', bg: '#07070d', textColor: '#fff', accent: '#f4be28', - body: 'To transform physical retail with AI-driven intelligence and meaningful customer engagement.', + body: 'Loyaly exists to close the gap between digital discovery and physical purchase. We give local stores the tools to compete, and give shoppers a reason to keep coming back.', }, { label: 'Vision', bg: '#f4be28', textColor: '#111', accent: '#c9960f', - body: 'To become the leading retail intelligence platform across global markets.', + body: 'Empowering every neighbourhood, making exceptional in-store experiences and real rewards accessible to all.', }, ].map((mv, i) => (
{mv.label}
@@ -125,35 +116,39 @@ export default function AboutUsPage() {
- {/* ── VALUES ── */} + {/* ── MARKET OPPORTUNITY ── */}
- -
How We Work
-

- What we believe. -

-
-
- {VALUES.map((v, i) => ( - -
- {v.n} -

{v.title}

-

{v.desc}

-
-
- ))} +
+ +
Market Opportunity
+

+ 13 Million Stores.
One Opportunity. +

+

+ India's retail market is one of the largest and fastest-growing in the world. We're building Loyaly for the stores that power it, and the shoppers who love them. +

+
+ +
+ {[ + { val: '13 Million+', label: 'Total Retail Stores Across India' }, + { val: '2 Million+', label: 'Organised & High-Footfall Stores' }, + { val: '50,000+', label: 'Stores In Our Launch Cities' }, + ].map((m) => ( +
+
{m.val}
+
{m.label}
+
+ ))} +
+
{/* ── TEAM ── */} - {/* ── CULTURE CLOSE ── */} + {/* ── CLOSE: POINT TO THE CREW ── */}
"We're not just building a product. We're redefining retail."

- Join Us → +
+ See Our Products → + Join Us +
diff --git a/src/app/for_people/page.tsx b/src/app/for_people/page.tsx index 8af6f1c..26442f2 100644 --- a/src/app/for_people/page.tsx +++ b/src/app/for_people/page.tsx @@ -3,6 +3,7 @@ import React from 'react'; import VerticalScrollWrapper from '@/components/for-people/VerticalScrollWrapper'; import HeroSection from '@/components/for-people/HeroSection'; +import PillarsSection from '@/components/for-people/PillarsSection'; import WhyLoyalySection from '@/components/for-people/WhyLoyalySection'; import DiscoverDealsSection from '@/components/for-people/DiscoverDealsSection'; import EarnRewardsSection from '@/components/for-people/EarnRewardsSection'; @@ -14,6 +15,7 @@ import FinalCTASection from '@/components/for-people/FinalCTASection'; const SECTIONS = [ 'Intro', 'The Gap', + 'Save More', 'Discover', 'Earn', 'Spend', @@ -28,6 +30,7 @@ export default function ForPeoplePage() { + diff --git a/src/app/page.tsx b/src/app/page.tsx index fb6770c..caf0659 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -319,6 +319,9 @@ export default function IndexPage() { Walk In Into a
Loyal Customer +

+ Offline is the new Online. +

Loyaly.ai turns everyday digital engagement into real world shopping rewards. Customers earn LYTs through games and daily activities, then redeem them at offline stores near them.

@@ -444,6 +447,9 @@ export default function IndexPage() { Walk In Into a
Loyal Customer +

+ Offline is the new Online. +

Loyaly.ai turns everyday digital engagement into real world shopping rewards. Customers earn LYTs through games and daily activities, then redeem them at offline stores near them.

diff --git a/src/app/solutions_page/page.tsx b/src/app/solutions_page/page.tsx index 9833af1..ac98abc 100644 --- a/src/app/solutions_page/page.tsx +++ b/src/app/solutions_page/page.tsx @@ -1,23 +1,30 @@ 'use client'; -import React, { useState } from 'react'; +import React from 'react'; import Link from 'next/link'; import Image from 'next/image'; -import GSAPAnimator from '@/components/GSAPAnimator'; import { useReveal } from '@/hooks/useReveal'; +import GSAPAnimator from '@/components/GSAPAnimator'; import ScrollStack, { ScrollStackItem } from '@/components/ScrollStack'; -function RevealBlock({ children, delay = 0 }: { children: React.ReactNode; delay?: number }) { +function Reveal({ children, delay = 0 }: { children: React.ReactNode; delay?: number }) { const { ref, visible } = useReveal(); return (
{children}
); } +const VALUES = [ + { n: '01', title: 'Intelligence first', desc: 'Every product decision starts with data, not instinct.' }, + { n: '02', title: 'Merchant obsessed', desc: 'We build for the store owner who works 14-hour days.' }, + { n: '03', title: 'Radical transparency', desc: 'No black boxes. Our AI explains every recommendation.' }, + { n: '04', title: 'Build to last', desc: 'We optimise for long-term impact, not vanity metrics.' }, +]; + const PRODUCTS = [ { n: '01', title: 'Behavision', subtitle: 'AI Powered Footfall Analytics', color: '#f4be28', @@ -65,124 +72,76 @@ const PRODUCTS = [ }, ]; -const CAPS = [ - { - n: '01', title: 'Merchant Campaign Platform', color: '#f4be28', - desc: 'Register your store, upload products and inventory, then launch interactive promotional campaigns in minutes. Define maximum discounts per product and track performance in real time.', - metrics: [{ val: '5+', lbl: 'Game formats' }, { val: '1-click', lbl: 'Campaign setup' }], - }, - { - n: '02', title: 'Game Based Discount Engine', color: '#a78bfa', - desc: 'Select a product, choose a game (Maze, Spin Wheel, Scratch Card, or Match Master) and set a maximum discount. Customers play once and discover their reward only after completing the game.', - metrics: [{ val: '4×', lbl: 'Engagement lift' }, { val: '100%', lbl: 'Margin controlled' }], - }, - { - n: '03', title: 'Smart Coupon System', color: '#34d399', - desc: 'Generate daily surprise coupons through the Battery Challenge and other activities. Offer flat discounts, BOGO, percentage-off deals, festival specials, and brand promotions, fresh every day.', - metrics: [{ val: '6', lbl: 'Coupon types' }, { val: 'Daily', lbl: 'Fresh surprises' }], - }, - { - n: '04', title: 'Footfall & Campaign Analytics', color: '#f97316', - desc: 'Track which campaigns drove store visits, measure conversion rates, monitor repeat footfall, and optimize your promotional budget with a real-time analytics dashboard.', - metrics: [{ val: '98%', lbl: 'Count accuracy' }, { val: '<9ms', lbl: 'Real-time latency' }], - }, -]; - -export default function SolutionsPage() { - const [hovered, setHovered] = useState(null); - +export default function MeetTheCrewPage() { return (
{/* ── HERO ── */}
{/* Background photo */} - -
+ +
{/* Accent blobs */} -
-
- {/* Animated rings */} - {[600, 900, 1200].map((s, i) => ( -
- ))} +
+
+ {/* Big ghost text */} +
LOYALY
-
+
-

- Built for
Modern
- Retail Growth. +

+ Meet the
+ Crew.

-

- Instead of waiting for customers to walk in, create exciting reasons for them to come, with game based campaigns, smart coupons, and a loyalty ecosystem that rewards every visit. +

+ The builders, thinkers, and retail obsessives behind Loyaly, working every day to make offline shopping as smart as online.

-
- Explore Solutions → - Book Demo -
- {/* ── CAPABILITIES ── */} + {/* ── VALUES ── */}
- -
-
-
Capabilities
-

- Four tools.
One merchant platform. -

-
-

- Every tool works independently and amplifies the others, giving merchants a complete system to attract, engage, and retain customers. -

-
-
- -
- {CAPS.map((cap, i) => ( - -
setHovered(i)} - onMouseLeave={() => setHovered(null)} - className="sp-cap-row" - style={{ - display: 'grid', gridTemplateColumns: '80px 1fr 1fr auto', - alignItems: 'center', gap: '4vw', - padding: '40px 0', - borderBottom: '1px solid rgba(0,0,0,0.07)', - cursor: 'default', - transition: 'all 0.3s ease', - }} - > - {cap.n} -

{cap.title}

-

{cap.desc}

-
- {cap.metrics.map((m, j) => ( -
-
{m.val}
-
{m.lbl}
-
- ))} -
+ +
How We Work
+

+ What we believe. +

+
+
+ {VALUES.map((v, i) => ( + +
+ {v.n} +

{v.title}

+

{v.desc}

- +
))}
@@ -190,15 +149,15 @@ export default function SolutionsPage() { {/* ── OUR PRODUCTS ── */}
- -
Our Products
+ +
Meet the Products

Four products.
One ecosystem.

- Each product solves a distinct part of the retail journey, and together they form one connected platform, from footfall to spend to loyalty. + Behavision, SpendSense, Dyscount, and Identiq, each solves a distinct part of the retail journey, and together they form one connected platform, from footfall to spend to loyalty.

-
+
@@ -209,7 +168,7 @@ export default function SolutionsPage() { border: `1px solid ${p.color}40`, borderRadius: 28, padding: 'clamp(28px, 3.2vw, 48px)', height: '100%', boxSizing: 'border-box', }}> -
+
{/* Left — identity + description */}
@@ -264,63 +223,31 @@ export default function SolutionsPage() {
- {/* ── WHY IT MATTERS ── */} -
-
- -
- "Every digital interaction should lead to a{' '} - meaningful in-store experience." -
-
-

Loyaly.ai, 2025

- -
- - {/* ── FINAL CTA ── */} -
- -

- See every solution working together. -

-

- Get a tailored walkthrough of how Loyaly.ai's merchant platform, game campaigns, and coupon engine fit your specific retail format. + {/* ── CULTURE CLOSE ── */} +

+
+ +

+ "We're not just building a product. We're redefining retail."

-
- Book Demo → - Explore Solutions -
- - -
- {[ - { v: '10K+', l: 'Partner stores' }, { v: '50K+', l: 'Active users' }, - { v: '98%', l: 'Uptime SLA' }, { v: '<9ms', l: 'Response time' }, - ].map((s, i) => ( -
-
{s.v}
-
{s.l}
-
- ))} -
-
+ Join Us → +
diff --git a/src/app/use_cases/page.tsx b/src/app/use_cases/page.tsx index 36f6926..32761f2 100644 --- a/src/app/use_cases/page.tsx +++ b/src/app/use_cases/page.tsx @@ -14,6 +14,70 @@ const OUTCOMES = [ { stat: '9ms', label: 'Real-time decision latency' }, ]; +const CAPS = [ + { + n: '01', title: 'Merchant Campaign Platform', color: '#f4be28', + desc: 'Register your store, upload products and inventory, then launch interactive promotional campaigns in minutes. Define maximum discounts per product and track performance in real time.', + metrics: [{ val: '5+', lbl: 'Game formats' }, { val: '1-click', lbl: 'Campaign setup' }], + }, + { + n: '02', title: 'Game Based Discount Engine', color: '#a78bfa', + desc: 'Select a product, choose a game (Maze, Spin Wheel, Scratch Card, or Match Master) and set a maximum discount. Customers play once and discover their reward only after completing the game.', + metrics: [{ val: '4×', lbl: 'Engagement lift' }, { val: '100%', lbl: 'Margin controlled' }], + }, + { + n: '03', title: 'Smart Coupon System', color: '#34d399', + desc: 'Generate daily surprise coupons through the Battery Challenge and other activities. Offer flat discounts, BOGO, percentage-off deals, festival specials, and brand promotions, fresh every day.', + metrics: [{ val: '6', lbl: 'Coupon types' }, { val: 'Daily', lbl: 'Fresh surprises' }], + }, + { + n: '04', title: 'Footfall & Campaign Analytics', color: '#f97316', + desc: 'Track which campaigns drove store visits, measure conversion rates, monitor repeat footfall, and optimize your promotional budget with a real-time analytics dashboard.', + metrics: [{ val: '98%', lbl: 'Count accuracy' }, { val: '<9ms', lbl: 'Real-time latency' }], + }, +]; + +const STEPS = [ + { + n: '01', title: 'Sign Up', desc: 'Create your Loyaly merchant account in minutes.', color: '#f4be28', + icon: , + }, + { + n: '02', title: 'Upload Your Products', desc: 'Add your catalogue, deals, and offers to the platform.', color: '#a78bfa', + icon: , + }, + { + n: '03', title: 'Publish Your Offers', desc: 'Go live with targeted deals your nearby customers will see instantly.', color: '#34d399', + icon: , + }, + { + n: '04', title: 'Connect to Customers', desc: 'Loyaly matches you with shoppers in your area who are ready to buy.', color: '#f97316', + icon: , + }, + { + n: '05', title: 'Close the Deal', desc: 'Customers walk in. They purchase. You grow.', color: '#f4be28', + icon: , + }, +]; + +const PILLARS = [ + { + title: 'Get Online', color: '#f4be28', + desc: 'Your store, visible to thousands of local shoppers, without building a website.', + icon: , + }, + { + title: 'Get Noticed', color: '#a78bfa', + desc: "Push real-time offers and proximity alerts that reach customers the moment they're nearby.", + icon: , + }, + { + title: 'Get Simplified', color: '#34d399', + desc: 'One dashboard. All your deals, customers, and performance, managed in one place.', + icon: , + }, +]; + const WHO = [ { label: 'Retail Stores', @@ -48,6 +112,7 @@ function RevealBlock({ children, delay = 0, className = '' }: { children: React. export default function ForBusinessPage() { const [countVisible, setCountVisible] = useState(false); + const [hovered, setHovered] = useState(null); const statsRef = useRef(null); useEffect(() => { @@ -162,6 +227,186 @@ export default function ForBusinessPage() { {/* ── PRODUCTS ── */} + {/* ── CAPABILITIES ── */} +
+ +
+
+
Capabilities
+

+ Four tools.
One merchant platform. +

+
+

+ Every tool works independently and amplifies the others, giving merchants a complete system to attract, engage, and retain customers. +

+
+
+ +
+ {CAPS.map((cap, i) => ( + +
setHovered(i)} + onMouseLeave={() => setHovered(null)} + className="uc-cap-row" + style={{ + display: 'grid', gridTemplateColumns: '80px 1fr 1fr auto', + alignItems: 'center', gap: '4vw', + padding: '40px 0', + borderBottom: '1px solid rgba(0,0,0,0.07)', + cursor: 'default', + transition: 'all 0.3s ease', + }} + > + {cap.n} +

{cap.title}

+

{cap.desc}

+
+ {cap.metrics.map((m, j) => ( +
+
{m.val}
+
{m.lbl}
+
+ ))} +
+
+
+ ))} +
+
+ + {/* ── HOW IT WORKS ── */} +
+
+ +
How It Works
+

+ Live in five steps. +

+
+
+
+ {STEPS.map((step, i) => ( + +
+
+ {step.icon} +
+
+
+ {step.n} +

{step.title}

+
+

{step.desc}

+
+
+
+ ))} +
+
+ + {/* ── MERCHANT BENEFITS ── */} +
+ +
Why Merchants Choose Us
+

+ Three ways we grow your store. +

+
+
+ {PILLARS.map((p, i) => ( + +
+ 0{i + 1} +
{p.icon}
+

{p.title}

+

{p.desc}

+
+
+ + ))} +
+
+ + {/* ── PROXIMITY MARKETING ── */} +
+
+ +
+ + {/* Radar visual */} +
+ {[0, 1, 2].map((r) => ( +
+ ))} +
+ + + +
+
+ + {/* Content */} +
+
Capability Spotlight
+

+ Reach customers the moment they're nearby. +

+

+ Loyaly's proximity engine sends instant notifications to shoppers browsing within your store's radius. No ad spend. No guesswork. Just timely, relevant offers delivered at exactly the right moment. +

+
+ {[{ v: 'Instant', l: 'Notification speed' }, { v: '0', l: 'Ad spend required' }, { v: 'Real-time', l: 'Radius targeting' }].map((s) => ( +
+
{s.v}
+
{s.l}
+
+ ))} +
+
+
+ +
+ {/* ── OUTCOMES ── */}
@@ -235,16 +480,31 @@ export default function ForBusinessPage() { ); diff --git a/src/components/About.tsx b/src/components/About.tsx deleted file mode 100644 index 78e5de0..0000000 --- a/src/components/About.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import Image from 'next/image'; -import Link from 'next/link'; - -const FEATURES = [ - { - icon: '👁', - title: 'Turn Footfall into Insight', - description: - 'Real-time visitor tracking and movement analytics reveal exactly how customers move through your store, enabling smarter layout, staffing, and marketing decisions.', - }, - { - icon: '🎯', - title: 'Personalisation, Perfected', - description: - 'AI-driven profiles let you deliver the right offer to the right customer at precisely the right moment — online, in-store, or both.', - }, - { - icon: '⚙️', - title: 'One Engine. Total Intelligence.', - description: - 'A single unified platform connects footfall, loyalty, promotions, and revenue data so every team works from the same source of truth.', - }, -]; - -export default function About() { - return ( -
- {/* Two-column intro */} -
- {/* Image */} -
- Loyaly.AI platform dashboard showing customer intelligence data -
- - {/* Text */} -
-

- About Us -

-

- AI Powered Customer Intelligence for Retail -

-

- Loyaly.ai is an AI powered customer intelligence platform built for modern retail. We help - businesses understand who their customers are, what drives their behaviour, and how to - build lasting loyalty at every touchpoint. -

-

- From footfall tracking and personalised engagement to smart loyalty programmes and revenue - optimisation, Loyaly.AI gives retailers one unified platform to know their customers deeply - and act on that knowledge instantly. -

- - Explore Our Solutions - -
-
- - {/* Three-feature grid */} -
-
- {FEATURES.map(({ icon, title, description }) => ( -
- -

- {title} -

-

- {description} -

-
- ))} -
-
-
- ); -} diff --git a/src/components/BlogSection.tsx b/src/components/BlogSection.tsx deleted file mode 100644 index 67ad10b..0000000 --- a/src/components/BlogSection.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import Image from 'next/image'; -import Link from 'next/link'; - -const CASE_STUDIES = [ - { - slug: 'ai-maximises-discount-strategy', - title: 'Stop Wasting Discounts: How AI Maximises Every Offer You Give', - excerpt: - 'Most retail discounts go to customers who would have bought anyway. Discover how Loyaly.AI\'s promotion intelligence engine targets the right buyers at the right margin.', - tags: ['AI Solutions', 'Retail Intelligence'], - image: '/loyaly_php/assets/images/case-study-2-img-960x718.jpeg', - imageAlt: 'Data visualisation showing AI-optimised discount targeting across customer segments', - readTime: '5 min read', - }, - { - slug: 'ai-redefining-retail-loyalty-2026', - title: 'Beyond Points: How AI is Redefining Retail Loyalty in 2026', - excerpt: - 'Traditional points schemes are losing ground. Learn how AI-driven loyalty programmes build genuine relationships through personalisation, timing, and context-aware rewards.', - tags: ['AI Retail', 'Loyalty Intelligence'], - image: '/loyaly_php/assets/images/case-study-1-img-960x718.jpeg', - imageAlt: 'Retail customer using a loyalty app powered by Loyaly.AI', - readTime: '7 min read', - }, -]; - -export default function BlogSection() { - return ( -
-
- {/* Header */} -
-
-

- Case Studies -

-

- Insights from the Loyaly.AI field -

-
- - All Articles - -
- - {/* Card grid */} -
- {CASE_STUDIES.map(({ slug, title, excerpt, tags, image, imageAlt, readTime }) => ( -
{ - const el = e.currentTarget as HTMLElement; - el.style.transform = 'translateY(-4px)'; - el.style.boxShadow = '0 8px 32px rgba(23,21,18,0.12)'; - }} - onMouseLeave={e => { - const el = e.currentTarget as HTMLElement; - el.style.transform = 'translateY(0)'; - el.style.boxShadow = '0 2px 16px rgba(23,21,18,0.07)'; - }} - > - {/* Image */} - -
- {imageAlt} -
- - - {/* Content */} -
- {/* Tags */} -
- {tags.map(tag => ( - - {tag} - - ))} -
- -

- - {title} - -

- -

- {excerpt} -

- -
- {readTime} - - Read more - -
-
-
- ))} -
-
-
- ); -} diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index f22618b..f757efe 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -16,9 +16,9 @@ const NAV = [ { title: 'Platform', links: [ - { label: 'Behavision AI', href: '/solutions_page' }, - { label: 'SpendSense AI', href: '/solutions_page' }, - { label: 'Dyscount AI', href: '/solutions_page' }, + { label: 'Behavision AI', href: '/use_cases' }, + { label: 'SpendSense AI', href: '/use_cases' }, + { label: 'Dyscount AI', href: '/use_cases' }, ], }, { diff --git a/src/components/GSAPReveal.tsx b/src/components/GSAPReveal.tsx deleted file mode 100644 index 9340161..0000000 --- a/src/components/GSAPReveal.tsx +++ /dev/null @@ -1,28 +0,0 @@ -'use client'; - -import React from 'react'; -import { useGSAPReveal, RevealAnimation } from '@/hooks/useGSAPReveal'; - -interface Props { - children: React.ReactNode; - delay?: number; - animation?: RevealAnimation; - duration?: number; - ease?: string; - start?: string; - className?: string; - style?: React.CSSProperties; - as?: keyof React.JSX.IntrinsicElements; -} - -export default function GSAPReveal({ - children, delay = 0, animation = 'fade-up', - duration = 1.0, ease, start, className, style, -}: Props) { - const ref = useGSAPReveal({ delay, animation, duration, ease, start }); - return ( -
- {children} -
- ); -} diff --git a/src/components/Partners.tsx b/src/components/Partners.tsx deleted file mode 100644 index ed98373..0000000 --- a/src/components/Partners.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import Image from 'next/image'; - -const PARTNERS = [ - { name: 'Partner 1', src: '/loyaly_php/assets/images/partners-1.png' }, - { name: 'Partner 2', src: '/loyaly_php/assets/images/partners-2.png' }, - { name: 'Partner 3', src: '/loyaly_php/assets/images/partners-3.png' }, - { name: 'Partner 4', src: '/loyaly_php/assets/images/partners-4.png' }, - { name: 'Partner 5', src: '/loyaly_php/assets/images/partners-5.png' }, - { name: 'Partner 6', src: '/loyaly_php/assets/images/partners-6.png' }, -]; - -// Duplicate list so the CSS marquee loops seamlessly -const TRACK = [...PARTNERS, ...PARTNERS]; - -export default function Partners() { - return ( -
-
-

- Our Partners -

-

- Our trusted collaborators in progress and success -

-
- - {/* Marquee track */} -
- ); -} diff --git a/src/components/PhoneWidget.tsx b/src/components/PhoneWidget.tsx deleted file mode 100644 index b3c8461..0000000 --- a/src/components/PhoneWidget.tsx +++ /dev/null @@ -1,175 +0,0 @@ -'use client'; - -import React, { useRef, useEffect, useCallback } from 'react'; - -export default function PhoneWidget() { - const stageRef = useRef(null); - - const onMove = useCallback((e: MouseEvent) => { - const el = stageRef.current; - if (!el) return; - const r = el.getBoundingClientRect(); - const px = (e.clientX - r.left) / r.width - 0.5; - const py = (e.clientY - r.top) / r.height - 0.5; - el.style.setProperty('--rx', `${(-py * 8).toFixed(2)}deg`); - el.style.setProperty('--ry', `${(px * 10).toFixed(2)}deg`); - el.style.setProperty('--tx', `${(px * 18).toFixed(1)}px`); - el.style.setProperty('--ty', `${(py * 18).toFixed(1)}px`); - }, []); - - const onLeave = useCallback(() => { - const el = stageRef.current; - if (!el) return; - el.style.setProperty('--rx', '0deg'); - el.style.setProperty('--ry', '0deg'); - el.style.setProperty('--tx', '0px'); - el.style.setProperty('--ty', '0px'); - }, []); - - useEffect(() => { - const el = stageRef.current; - if (!el) return; - el.addEventListener('mousemove', onMove); - el.addEventListener('mouseleave', onLeave); - return () => { - el.removeEventListener('mousemove', onMove); - el.removeEventListener('mouseleave', onLeave); - }; - }, [onMove, onLeave]); - - return ( - <> - - -
-
- {/* Glow ring */} -
- - {/* Phone shell */} -
- {/* Shimmer sweep */} -
-
-
- - {/* Dynamic island */} -
-
-
-
-
-
- - {/* Header */} -
-
Good Morning
-
Loyaly ✦
-
- - {/* LYTs balance card */} -
-
-
Total LYTs
-
284
-
≈ ₹284 redeemable
-
- - {/* Activity feed */} -
- {[ - { label: 'Daily Login', pts: '+50', color: '#4ade80' }, - { label: 'Walking 5k Steps', pts: '+80', color: '#4ade80' }, - { label: 'Spin Wheel', pts: '-50', color: '#f87171' }, - ].map((item, i) => ( -
- {item.label} - {item.pts} -
- ))} -
- - {/* Nav dots */} -
- {[1, 0, 0, 0].map((a, i) => ( -
- ))} -
-
- - {/* Floating chip — top left */} -
-
-
-
+120 LYTs
-
just now
-
-
- - {/* Floating chip — bottom right */} -
-
Redeemable
-
₹284.00
-
-
-
- - ); -} diff --git a/src/components/ProblemParticles.tsx b/src/components/ProblemParticles.tsx deleted file mode 100644 index 6352e9b..0000000 --- a/src/components/ProblemParticles.tsx +++ /dev/null @@ -1,196 +0,0 @@ -'use client'; - -import { useEffect, useRef } from 'react'; - -interface Particle { - x: number; - y: number; - vx: number; - vy: number; - radius: number; - alpha: number; - type: 'lost' | 'converted' | 'regular'; - pulseSpeed: number; - pulseTime: number; -} - -export default function ProblemParticles() { - const canvasRef = useRef(null); - - useEffect(() => { - const canvas = canvasRef.current; - if (!canvas) return; - - const ctx = canvas.getContext('2d'); - if (!ctx) return; - - let animationFrameId = 0; - let cssWidth = canvas.offsetWidth; - let cssHeight = canvas.offsetHeight; - - const particles: Particle[] = []; - const storeNode = { x: cssWidth / 2, y: cssHeight / 2, radius: 18 }; - - const setCanvasSize = () => { - const dpr = Math.max(1, window.devicePixelRatio || 1); - cssWidth = canvas.offsetWidth; - cssHeight = canvas.offsetHeight; - canvas.width = Math.round(cssWidth * dpr); - canvas.height = Math.round(cssHeight * dpr); - // Map drawing coordinates to CSS pixels - ctx.setTransform(dpr, 0, 0, dpr, 0, 0); - storeNode.x = cssWidth / 2; - storeNode.y = cssHeight / 2; - }; - - const createParticle = (isInitial = false): Particle => { - const typeRand = Math.random(); - const type = typeRand < 0.2 ? 'lost' : typeRand < 0.45 ? 'converted' : 'regular'; - - let x: number, y: number; - if (isInitial) { - x = Math.random() * cssWidth; - y = Math.random() * cssHeight; - } else { - // Spawn from edges - if (Math.random() < 0.5) { - x = Math.random() < 0.5 ? 0 : cssWidth; - y = Math.random() * cssHeight; - } else { - x = Math.random() * cssWidth; - y = Math.random() < 0.5 ? 0 : cssHeight; - } - } - - // Vector pointing towards the store node (center) - const angle = Math.atan2(storeNode.y - y, storeNode.x - x); - const speed = 0.4 + Math.random() * 0.8; - - return { - x, - y, - vx: Math.cos(angle) * speed + (Math.random() - 0.5) * 0.2, - vy: Math.sin(angle) * speed + (Math.random() - 0.5) * 0.2, - radius: 2 + Math.random() * 4, - alpha: 0.1 + Math.random() * 0.7, - type, - pulseSpeed: 0.05 + Math.random() * 0.05, - pulseTime: Math.random() * Math.PI, - }; - }; - - // Initialize - setCanvasSize(); - for (let i = 0; i < 45; i++) particles.push(createParticle(true)); - - const handleResize = () => { - if (!canvas) return; - setCanvasSize(); - }; - - window.addEventListener('resize', handleResize); - - const draw = () => { - ctx.clearRect(0, 0, cssWidth, cssHeight); - - // Background glow - const bgGlow = ctx.createRadialGradient( - storeNode.x, - storeNode.y, - 10, - storeNode.x, - storeNode.y, - cssWidth * 0.4 - ); - bgGlow.addColorStop(0, 'rgba(0, 102, 255, 0.08)'); - bgGlow.addColorStop(1, 'rgba(0, 0, 0, 0)'); - ctx.fillStyle = bgGlow; - ctx.fillRect(0, 0, cssWidth, cssHeight); - - // Store hub - ctx.shadowBlur = 30; - ctx.shadowColor = '#0066ff'; - ctx.fillStyle = 'rgba(0, 102, 255, 0.9)'; - ctx.beginPath(); - ctx.arc(storeNode.x, storeNode.y, storeNode.radius, 0, Math.PI * 2); - ctx.fill(); - - ctx.strokeStyle = 'rgba(255, 255, 255, 0.6)'; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.arc(storeNode.x, storeNode.y, storeNode.radius - 6, 0, Math.PI * 2); - ctx.stroke(); - ctx.shadowBlur = 0; - - // Particles - particles.forEach((p, idx) => { - p.x += p.vx; - p.y += p.vy; - p.pulseTime += p.pulseSpeed; - - let alpha = p.alpha; - let radius = p.radius; - - if (p.type === 'converted') { - alpha = Math.max(0.4, p.alpha + Math.sin(p.pulseTime) * 0.3); - radius = p.radius + Math.sin(p.pulseTime) * 1.5; - } else if (p.type === 'lost') { - const dist = Math.hypot(storeNode.x - p.x, storeNode.y - p.y); - if (dist < 150) p.alpha -= 0.008; - } - - // Connections between particles - for (let j = idx + 1; j < particles.length; j++) { - const p2 = particles[j]; - const dist = Math.hypot(p2.x - p.x, p2.y - p.y); - if (dist < 80 && p.alpha > 0 && p2.alpha > 0) { - const lineAlpha = (1 - dist / 80) * 0.18 * Math.min(alpha, p2.alpha); - ctx.strokeStyle = `rgba(0, 102, 255, ${lineAlpha})`; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.moveTo(p.x, p.y); - ctx.lineTo(p2.x, p2.y); - ctx.stroke(); - } - } - - // Connection to store hub - const distToStore = Math.hypot(storeNode.x - p.x, storeNode.y - p.y); - if (distToStore < 120 && p.alpha > 0) { - const lineAlpha = (1 - distToStore / 120) * 0.25 * p.alpha; - ctx.strokeStyle = p.type === 'converted' ? `rgba(0, 220, 255, ${lineAlpha})` : `rgba(0, 102, 255, ${lineAlpha})`; - ctx.beginPath(); - ctx.moveTo(p.x, p.y); - ctx.lineTo(storeNode.x, storeNode.y); - ctx.stroke(); - } - - // Respawn check - if (distToStore < storeNode.radius || p.x < 0 || p.x > cssWidth || p.y < 0 || p.y > cssHeight || p.alpha <= 0) { - particles[idx] = createParticle(); - } else { - ctx.fillStyle = p.type === 'converted' ? `rgba(0, 220, 255, ${alpha})` : p.type === 'lost' ? `rgba(255, 68, 68, ${alpha})` : `rgba(255, 255, 255, ${alpha})`; - if (p.type === 'converted') { - ctx.shadowBlur = 10; - ctx.shadowColor = '#00dcff'; - } - ctx.beginPath(); - ctx.arc(p.x, p.y, radius, 0, Math.PI * 2); - ctx.fill(); - ctx.shadowBlur = 0; - } - }); - - animationFrameId = requestAnimationFrame(draw); - }; - - draw(); - - return () => { - window.removeEventListener('resize', handleResize); - cancelAnimationFrame(animationFrameId); - }; - }, []); - - return ; -} diff --git a/src/components/Solutions.tsx b/src/components/Solutions.tsx deleted file mode 100644 index 4df4236..0000000 --- a/src/components/Solutions.tsx +++ /dev/null @@ -1,237 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import Image from 'next/image'; -import Link from 'next/link'; - -const SOLUTIONS = [ - { - id: 'footfall', - category: 'AI Solution', - title: 'Footfall Intelligence', - subtitle: 'Understand Customer Movement in Real Time', - excerpt: - 'Track visitor count, movement patterns, and peak hours across your retail spaces. Turn anonymous foot traffic into actionable intelligence that drives layout, staffing, and promotions.', - image: '/loyaly_php/assets/images/deepvision-fi-640x640.jpg', - imageAlt: 'Footfall Intelligence dashboard showing real-time customer movement heatmaps', - href: '/solutions/footfall-intelligence', - }, - { - id: 'journey', - category: 'AI Solution', - title: 'Customer Journey', - subtitle: 'Map Every Interaction Seamlessly', - excerpt: - 'Track and understand each step of your customer\'s journey — online and in-store — to identify friction points, improve conversion, and deliver experiences that build loyalty.', - image: '/loyaly_php/assets/images/nlpgenius-natural-language-processing-fi-640x640.jpg', - imageAlt: 'Customer journey map visualisation inside Loyaly.AI platform', - href: '/solutions/customer-journey', - }, - { - id: 'engagement', - category: 'AI Solution', - title: 'Customer Engagement', - subtitle: 'Drive Meaningful Interactions', - excerpt: - 'Analyse behaviour and preferences to deliver personalised experiences, timely offers, and targeted messaging that keep customers coming back.', - image: '/loyaly_php/assets/images/smarttrader-predictive-stock-market-analysis-fi-640x640.jpg', - imageAlt: 'Customer engagement analytics showing personalisation performance metrics', - href: '/solutions/customer-engagement', - }, - { - id: 'loyalty', - category: 'AI Solution', - title: 'Loyalty Management', - subtitle: 'Build Lasting Relationships', - excerpt: - 'Reward customer loyalty with smart programmes that adapt in real time — from LYTs and tiers to personalised perks that feel genuinely earned.', - image: '/loyaly_php/assets/images/cognivision-transformative-ai-for-intelligent-fi-640x640.jpg', - imageAlt: 'Loyalty management module showing customer tier performance', - href: '/solutions/loyalty-management', - }, - { - id: 'revenue', - category: 'AI Solution', - title: 'Revenue Optimisation', - subtitle: 'Maximise Business Performance', - excerpt: - 'Leverage data insights to optimise pricing, promotions, and strategies for higher revenue growth — without sacrificing margin.', - image: '/loyaly_php/assets/images/neuraforge-crafting-future-ready-ai-solutions-fi-640x640.jpg', - imageAlt: 'Revenue optimisation charts showing margin improvements', - href: '/solutions/revenue-optimisation', - }, -]; - -export default function Solutions() { - const [hoveredId, setHoveredId] = useState(null); - - return ( -
-
- {/* Header */} -
-

- Our Solutions -

-

- Exploring groundbreaking AI solutions transforming retail -

-

- From understanding footfall to optimising revenue, our five AI modules work independently - or together as one unified intelligence engine. -

-
- - {/* Grid */} -
- {SOLUTIONS.map(({ id, category, title, subtitle, excerpt, image, imageAlt, href }) => { - const isHovered = hoveredId === id; - return ( -
setHoveredId(id)} - onMouseLeave={() => setHoveredId(null)} - style={{ - background: '#fff8e8', - borderRadius: '16px', - overflow: 'hidden', - boxShadow: isHovered - ? '0 12px 40px rgba(23,21,18,0.14)' - : '0 2px 12px rgba(23,21,18,0.06)', - transform: isHovered ? 'translateY(-6px)' : 'translateY(0)', - transition: 'transform 0.3s ease, box-shadow 0.3s ease', - display: 'flex', - flexDirection: 'column', - }} - > - {/* Card image */} - -
- {imageAlt} -
- - - {/* Card content */} -
- {/* Category badge */} - - {category} - - -

- - {title} - -

- -

- {subtitle} -

- -

- {excerpt} -

- - - Explore more - -
-
- ); - })} -
- - {/* CTA */} -
- - View all solutions - -
-
-
- ); -} diff --git a/src/components/Testimonial.tsx b/src/components/Testimonial.tsx deleted file mode 100644 index 9cc5bc5..0000000 --- a/src/components/Testimonial.tsx +++ /dev/null @@ -1,211 +0,0 @@ -'use client'; - -import { useState, useEffect, useRef, useCallback } from 'react'; - -const TESTIMONIALS = [ - { - quote: - 'Loyaly.AI transformed how we understand our customers. Foot traffic insights alone helped us rearrange our store layout and boost average basket size by 18% in the first quarter.', - author: 'Priya Nair', - role: 'Head of Retail Operations', - company: 'Trendsetter Fashion Stores', - avatar: '/loyaly_php/assets/images/partners-1.png', - }, - { - quote: - 'The AI powered loyalty engine learns fast. Within weeks we were delivering personalised offers that felt genuinely relevant — our repeat visit rate climbed 23%.', - author: 'Arjun Mehta', - role: 'VP of Customer Experience', - company: 'FreshMart Supermarkets', - avatar: '/loyaly_php/assets/images/partners-2.png', - }, - { - quote: - "We tried three loyalty platforms before Loyaly.AI. This is the first one that actually connects footfall data, promotions, and CRM in a single dashboard. It's changed how we run campaigns.", - author: 'Sarah Connelly', - role: 'Chief Marketing Officer', - company: 'Urban Living Group', - avatar: '/loyaly_php/assets/images/partners-3.png', - }, -]; - -export default function Testimonial() { - const [active, setActive] = useState(0); - const [paused, setPaused] = useState(false); - const timerRef = useRef | null>(null); - const total = TESTIMONIALS.length; - - const go = useCallback( - (index: number) => { - setActive((index + total) % total); - }, - [total] - ); - - // Auto-advance every 6 s - useEffect(() => { - if (paused) return; - timerRef.current = setTimeout(() => go(active + 1), 6000); - return () => { - if (timerRef.current) clearTimeout(timerRef.current); - }; - }, [active, paused, go]); - - const { quote, author, role, company } = TESTIMONIALS[active]; - - return ( -
setPaused(true)} - onMouseLeave={() => setPaused(false)} - > -
- {/* Section label */} -

- Customer Stories -

-

- See how retailers are transforming customer loyalty with Loyaly.AI -

- - {/* Quote card */} -
- {/* Decorative quote mark */} - - -
- {quote} -
- -
- - {author} - - - {role}, {company} - -
-
- - {/* Navigation dots */} -
- {TESTIMONIALS.map((_, i) => ( -
- - {/* Prev / Next */} -
- - -
-
- - -
- ); -} - -const arrowBtnStyle: React.CSSProperties = { - width: '40px', - height: '40px', - borderRadius: '50%', - background: 'rgba(255,255,255,0.08)', - color: '#fff', - border: '1px solid rgba(255,255,255,0.15)', - cursor: 'pointer', - fontSize: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - transition: 'background 0.2s', -}; diff --git a/src/components/for-people/DiscoverDealsSection.tsx b/src/components/for-people/DiscoverDealsSection.tsx index 5c1c4c7..144c506 100644 --- a/src/components/for-people/DiscoverDealsSection.tsx +++ b/src/components/for-people/DiscoverDealsSection.tsx @@ -1,8 +1,14 @@ 'use client'; -import React, { useState } from 'react'; +import React, { useState, useLayoutEffect, useEffect, useRef } from 'react'; import Image from 'next/image'; import { PhoneFrame, PhoneBottomNav, BellIcon, PinIcon, ChevronIcon, SearchIcon, MicIcon, CameraIcon, MapIcon, HeartLogoIcon } from './PhoneMockup'; +import { gsap } from 'gsap'; +import { ScrollTrigger } from 'gsap/ScrollTrigger'; + +if (typeof window !== 'undefined') gsap.registerPlugin(ScrollTrigger); + +const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect; const deals = [ { store: 'Starbucks', category: 'Coffee & Drinks', offer: '2× LYTs', savings: '₹120 saved', color: '#00704A', dot: '#22c55e', distance: '0.3 km', rating: 4.8 }, @@ -14,9 +20,37 @@ const deals = [ export default function DiscoverDealsSection() { const [hovered, setHovered] = useState(null); + const panelRef = useRef(null); + const phoneRef = useRef(null); + + useIsomorphicLayoutEffect(() => { + if (typeof window === 'undefined') return; + const section = panelRef.current; + const phone = phoneRef.current; + if (!section || !phone) return; + + const ctx = gsap.context(() => { + gsap.fromTo(phone, + { y: 160, opacity: 0 }, + { + y: 0, + opacity: 1, + ease: 'power2.out', + scrollTrigger: { + trigger: section, + start: 'top 92%', + end: 'top 25%', + scrub: 1.2, + } + } + ); + }, section); + + return () => ctx.revert(); + }, []); return ( -
+
{/* Background photo */} @@ -63,7 +97,7 @@ export default function DiscoverDealsSection() {
{/* Phone mockup — white app screen, matches the in-app Discover experience */} -
+
{/* Amber header */} @@ -151,7 +185,7 @@ export default function DiscoverDealsSection() {
- +
diff --git a/src/components/for-people/EarnRewardsSection.tsx b/src/components/for-people/EarnRewardsSection.tsx index 27bf72b..8fe7dab 100644 --- a/src/components/for-people/EarnRewardsSection.tsx +++ b/src/components/for-people/EarnRewardsSection.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import Image from 'next/image'; import { gsap } from 'gsap'; import { ScrollTrigger } from 'gsap/ScrollTrigger'; @@ -8,6 +8,8 @@ import { PhoneFrame, PhoneBottomNav, BellIcon, FlameIcon } from './PhoneMockup'; if (typeof window !== 'undefined') gsap.registerPlugin(ScrollTrigger); +const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect; + const feed = [ { store: 'Daily Login', pts: +50, time: '2m ago', type: 'earn' }, { store: 'Walking 5,000 steps', pts: +80, time: '1h ago', type: 'earn' }, @@ -18,10 +20,38 @@ const feed = [ export default function EarnRewardsSection() { const [pts, setPts] = useState(0); const panelRef = useRef(null); + const phoneRef = useRef(null); const rafRef = useRef(0); const rowRefs = useRef<(HTMLDivElement | null)[]>([]); const activeRowRef = useRef(0); + // Phone mockup rises in from the bottom as the section scrolls into view + useIsomorphicLayoutEffect(() => { + if (typeof window === 'undefined') return; + const section = panelRef.current; + const phone = phoneRef.current; + if (!section || !phone) return; + + const ctx = gsap.context(() => { + gsap.fromTo(phone, + { y: 160, opacity: 0 }, + { + y: 0, + opacity: 1, + ease: 'power2.out', + scrollTrigger: { + trigger: section, + start: 'top 92%', + end: 'top 25%', + scrub: 1.2, + } + } + ); + }, section); + + return () => ctx.revert(); + }, []); + // Move the highlighted feed card as the section scrolls through the viewport useEffect(() => { if (typeof window === 'undefined') return; @@ -136,7 +166,7 @@ export default function EarnRewardsSection() {
{/* Right — phone mockup, matches the in-app Earn / Home experience */} -
+
{/* Amber header */} @@ -230,7 +260,7 @@ export default function EarnRewardsSection() { ))}
- +
diff --git a/src/components/for-people/ExperienceSection.tsx b/src/components/for-people/ExperienceSection.tsx index 15152fe..21fd38a 100644 --- a/src/components/for-people/ExperienceSection.tsx +++ b/src/components/for-people/ExperienceSection.tsx @@ -1,6 +1,12 @@ 'use client'; -import React from 'react'; +import React, { useLayoutEffect, useEffect, useRef } from 'react'; +import { gsap } from 'gsap'; +import { ScrollTrigger } from 'gsap/ScrollTrigger'; + +if (typeof window !== 'undefined') gsap.registerPlugin(ScrollTrigger); + +const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect; const words = [ { text: 'Effortless.', size: 'clamp(58px, 9vw, 134px)', color: '#ffffff' }, @@ -14,8 +20,37 @@ const steps = [ ]; export default function ExperienceSection() { + const panelRef = useRef(null); + const cardRef = useRef(null); + + useIsomorphicLayoutEffect(() => { + if (typeof window === 'undefined') return; + const section = panelRef.current; + const card = cardRef.current; + if (!section || !card) return; + + const ctx = gsap.context(() => { + gsap.fromTo(card, + { x: 200, opacity: 0 }, + { + x: 0, + opacity: 1, + ease: 'power2.out', + scrollTrigger: { + trigger: section, + start: 'top 92%', + end: 'top 25%', + scrub: 1.2, + } + } + ); + }, section); + + return () => ctx.revert(); + }, []); + return ( -
+
@@ -36,35 +71,41 @@ export default function ExperienceSection() { ))}
- {/* Steps */} -
-

+

No plastic cards. No coupon hunting. No app open required at checkout. Loyaly works quietly in the background while you shop the way you always have.

{steps.map((s, i) => ( -
- {s.n} - {s.label} + {s.n} + {s.label}
))}
-
+
- {['#f4be28', '#4ade80', '#a855f7', '#3b82f6'].map((c, i) => ( -
0 ? -9 : 0 }} /> + {['#ff7b39', '#4ade80', '#a855f7', '#3b82f6'].map((c, i) => ( +
0 ? -9 : 0 }} /> ))}
- - Joined by 50,000+ shoppers + + Joined by 50,000+ shoppers
diff --git a/src/components/for-people/FinalCTASection.tsx b/src/components/for-people/FinalCTASection.tsx index 79e867c..2389f1e 100644 --- a/src/components/for-people/FinalCTASection.tsx +++ b/src/components/for-people/FinalCTASection.tsx @@ -44,13 +44,9 @@ export default function FinalCTASection() { const tl = gsap.timeline({ scrollTrigger: { trigger: sectionRef.current, start: 'top 80%', toggleActions: 'play none none reset' }, }); - tl.fromTo('.fcta-badge', - { opacity: 0, y: 20, scale: 0.9 }, - { opacity: 1, y: 0, scale: 1, duration: 0.6, ease: 'back.out(2)' } - ) - .fromTo('.fcta-line-1', + tl.fromTo('.fcta-line-1', { opacity: 0, y: 50, filter: 'blur(8px)' }, - { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.8, ease: 'expo.out' }, '-=0.2' + { opacity: 1, y: 0, filter: 'blur(0px)', duration: 0.8, ease: 'expo.out' } ) .fromTo('.fcta-line-2', { opacity: 0, y: 50, filter: 'blur(8px)' }, @@ -60,9 +56,32 @@ export default function FinalCTASection() { { opacity: 0, y: 24 }, { opacity: 1, y: 0, duration: 0.65, ease: 'power3.out' }, '-=0.4' ) + .fromTo('.fcta-hanging-logo', + { opacity: 0, y: -60, rotation: -16 }, + { opacity: 1, y: 0, rotation: 0, duration: 1.1, stagger: 0.16, ease: 'back.out(1.5)' }, + '-=0.45' + ) + .fromTo('.fcta-logo-link', + { rotation: 10 }, + { rotation: 0, duration: 1.2, stagger: 0.16, ease: 'back.out(1.6)' }, + '<' + ) + .call(() => { + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; + gsap.utils.toArray('.fcta-hanging-logo').forEach((el, i) => { + gsap.to(el, { + rotation: i % 2 === 0 ? 3.5 : -3.5, + duration: 2.4 + i * 0.3, + ease: 'sine.inOut', + yoyo: true, + repeat: -1, + transformOrigin: 'top center', + }); + }); + }) .fromTo('.fcta-btns', { opacity: 0, y: 20 }, - { opacity: 1, y: 0, duration: 0.55, ease: 'power3.out' }, '-=0.3' + { opacity: 1, y: 0, duration: 0.55, ease: 'power3.out' }, '-=0.45' ) .fromTo('.fcta-stat', { opacity: 0, y: 28, scale: 0.88 }, @@ -94,30 +113,10 @@ export default function FinalCTASection() { {/* Amber glow orb top-center */}
- {/* Ghost wordmark */} -
- LOYALY -
{/* Content */}
- {/* Live badge */} -
- - - Now live in Coimbatore - -
{/* Headline */}

@@ -144,13 +143,130 @@ export default function FinalCTASection() { {/* Subtitle */}

Download Loyaly and start earning on your very next purchase. Free. Instant. Yours.

+ {/* Hanging Logos */} +
+ {/* Play Store Logo (hanging) */} +
+ {/* Keyring loop */} +
+ {/* String */} +
+ {/* Logo Circle */} + + Google Play + + {/* Tooltip */} +
+ Download In Playstore +
+
+ + {/* Apple Logo (hanging) */} +
+ {/* Keyring loop */} +
+ {/* String */} +
+ {/* Logo Circle */} + + App Store + + {/* Tooltip */} +
+ Download in App store +
+
+
+ {/* CTAs */}
{` @keyframes fctaPulse { 0%,100%{box-shadow:0 0 0 0 rgba(34,197,94,0.5)} 50%{box-shadow:0 0 0 6px rgba(34,197,94,0)} } @keyframes fctaShimmer { 0%{background-position:200% center} 100%{background-position:-200% center} } + .fcta-hanging-logo a { + transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + } + .fcta-hanging-logo a:hover { + transform: scale(1.08); + } + .fcta-tooltip { + position: absolute; + top: calc(100% + 4px); + left: 50%; + transform: translateX(-50%) translateY(8px); + background: #171512; + color: #ffffff; + padding: 6px 14px; + border-radius: 6px; + font-size: 11px; + font-weight: 700; + font-family: 'Sora', sans-serif; + white-space: nowrap; + opacity: 0; + pointer-events: none; + transition: opacity 0.25s ease, transform 0.25s cubic-bezier(0.25, 1, 0.22, 1); + box-shadow: 0 4px 12px rgba(0,0,0,0.15); + z-index: 10; + } + .fcta-hanging-logo:hover .fcta-tooltip { + opacity: 1; + transform: translateX(-50%) translateY(0); + } + .fcta-tooltip::before { + content: ''; + position: absolute; + top: -4px; + left: 50%; + transform: translateX(-50%) rotate(45deg); + width: 8px; + height: 8px; + background: #171512; + } + @media (max-width: 1023px) { + .fcta-hanging-logos-wrapper { + display: none !important; + } + .fcta-sub { + margin-bottom: 40px !important; + } + } + @media (min-width: 1024px) { + .fcta-btns { + display: none !important; + } + } `}

); diff --git a/src/components/for-people/HeroSection.tsx b/src/components/for-people/HeroSection.tsx index 3746afa..417cdbf 100644 --- a/src/components/for-people/HeroSection.tsx +++ b/src/components/for-people/HeroSection.tsx @@ -61,7 +61,7 @@ export default function HeroSection() {

Shop Smart. Live Rewarded. @@ -71,7 +71,7 @@ export default function HeroSection() { fontSize: 'clamp(16px, 1.4vw, 19px)', lineHeight: 1.7, fontWeight: 400, color: 'rgba(255,255,255,0.58)', maxWidth: 640, margin: '0 auto 40px', fontFamily: 'Sora, sans-serif', }}> - Meet LYT (Loyaly Token): the single currency behind every reward in the app. Earn them through daily tasks, walking challenges, and games, then spend them instantly at partner stores near you with zero expiry. + Meet LYTs (Loyaly Tokens): the single currency behind every reward. Earn them through daily challenges and games, then spend instantly at partner stores near you with zero expiry.

diff --git a/src/components/for-people/PhoneMockup.tsx b/src/components/for-people/PhoneMockup.tsx index 2bd7ba2..f801e9f 100644 --- a/src/components/for-people/PhoneMockup.tsx +++ b/src/components/for-people/PhoneMockup.tsx @@ -56,9 +56,20 @@ export function MapIcon() { ); } -export function HeartLogoIcon({ size = 16 }: { size?: number }) { +export function HeartLogoIcon({ size = 16, active = false }: { size?: number; active?: boolean }) { return ( - + ); } export function UpArrowIcon({ color = '#16a34a' }: { color?: string }) { @@ -85,12 +96,12 @@ export function FlameIcon({ color = '#f4be28' }: { color?: string }) { /* ── Bottom nav — pass the active tab key to highlight it ── */ export function PhoneBottomNav({ active = 'home' }: { active?: string }) { - const items: { key: string; icon: React.ReactNode }[] = [ - { key: 'home', icon: }, - { key: 'tag', icon: }, - { key: 'heart', icon: }, - { key: 'shop', icon: }, - { key: 'user', icon: }, + const items: { key: string; icon: (isActive: boolean) => React.ReactNode }[] = [ + { key: 'home', icon: () => }, + { key: 'tag', icon: () => }, + { key: 'heart', icon: (isActive) => }, + { key: 'shop', icon: () => }, + { key: 'user', icon: () => }, ]; return (
@@ -99,11 +110,11 @@ export function PhoneBottomNav({ active = 'home' }: { active?: string }) { return (
- {n.icon} + {n.icon(isActive)}
); })} diff --git a/src/components/for-people/PillarsSection.tsx b/src/components/for-people/PillarsSection.tsx new file mode 100644 index 0000000..740ea15 --- /dev/null +++ b/src/components/for-people/PillarsSection.tsx @@ -0,0 +1,68 @@ +'use client'; + +import React from 'react'; + +const PILLARS = [ + { + n: '01', + title: 'Shop Smarter', + desc: 'Unlock top deals, discounts, and exclusive offers at stores near you, just by walking in.', + color: '#f4be28', + }, + { + n: '02', + title: 'Earn Rewards', + desc: 'Every rupee spent earns LYT points. Zero expiry. Redeem anytime, at any partner store.', + color: '#16a34a', + }, + { + n: '03', + title: 'Make It a Pleasure', + desc: 'Shopping should feel good. Loyaly makes every trip more rewarding, more fun, and more personal.', + color: '#a78bfa', + }, +]; + +export default function PillarsSection() { + return ( +
+
+
+ Save More02 +
+ +

+ Save more on every in-store visit. +

+

+ Earn Loyaly rewards on everyday shopping, from groceries to fashion to home essentials. Every purchase brings you closer to your next reward. +

+ +
+ {PILLARS.map((p, i) => ( +
+
+

{p.title}

+

{p.desc}

+
+ ))} +
+
+ + +
+ ); +} diff --git a/src/components/home/ProblemSection.tsx b/src/components/home/ProblemSection.tsx index 703749e..903cffb 100644 --- a/src/components/home/ProblemSection.tsx +++ b/src/components/home/ProblemSection.tsx @@ -153,6 +153,31 @@ export default function ProblemSection({ isLoaded = true }: ProblemSectionProps)
+ {/* India retail market stats strip */} +
+ {[ + { val: '$2 Tn', label: 'India retail market by 2032, 25% CAGR' }, + { val: '5th', label: 'Largest retail destination globally' }, + { val: '10%', label: "Of India's GDP from retail" }, + { val: '12%', label: 'Of retail is organised, the rest is offline' }, + { val: '500M', label: 'Indians shopping online by 2030, up from 220M' }, + ].map((s, i) => ( +
+
{s.val}
+
{s.label}
+
+ ))} +
+ {/* Grid wrapper */}
{/* Row 1: Red Stat Cards */} @@ -429,6 +454,7 @@ export default function ProblemSection({ isLoaded = true }: ProblemSectionProps) #problem .problem-stats-row { grid-template-columns: 1fr !important; } #problem .dark-bento-grid { grid-template-columns: 1fr !important; } #problem .dark-bento-card-4 { grid-column: span 1; } + #problem .problem-india-stats { grid-template-columns: repeat(2, 1fr) !important; } } `}