diff --git a/public/images/stock/about-team.jpg b/public/images/stock/about-team.jpg new file mode 100644 index 0000000..2102c3c Binary files /dev/null and b/public/images/stock/about-team.jpg differ diff --git a/public/images/stock/app-hero.jpg b/public/images/stock/app-hero.jpg new file mode 100644 index 0000000..5683143 Binary files /dev/null and b/public/images/stock/app-hero.jpg differ diff --git a/public/images/stock/blog-article.jpg b/public/images/stock/blog-article.jpg new file mode 100644 index 0000000..b37d535 Binary files /dev/null and b/public/images/stock/blog-article.jpg differ diff --git a/public/images/stock/blog-main.jpg b/public/images/stock/blog-main.jpg new file mode 100644 index 0000000..a62cf36 Binary files /dev/null and b/public/images/stock/blog-main.jpg differ diff --git a/public/images/stock/contacts.jpg b/public/images/stock/contacts.jpg new file mode 100644 index 0000000..deb03bd Binary files /dev/null and b/public/images/stock/contacts.jpg differ diff --git a/public/images/stock/deals-retail.jpg b/public/images/stock/deals-retail.jpg new file mode 100644 index 0000000..158d081 Binary files /dev/null and b/public/images/stock/deals-retail.jpg differ diff --git a/public/images/stock/faq.jpg b/public/images/stock/faq.jpg new file mode 100644 index 0000000..f02783a Binary files /dev/null and b/public/images/stock/faq.jpg differ diff --git a/public/images/stock/solutions.jpg b/public/images/stock/solutions.jpg new file mode 100644 index 0000000..29e7fe4 Binary files /dev/null and b/public/images/stock/solutions.jpg differ diff --git a/public/images/stock/use-cases.jpg b/public/images/stock/use-cases.jpg new file mode 100644 index 0000000..f83455f Binary files /dev/null and b/public/images/stock/use-cases.jpg differ diff --git a/src/app/about_us/page.tsx b/src/app/about_us/page.tsx index c460c77..187af91 100644 --- a/src/app/about_us/page.tsx +++ b/src/app/about_us/page.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import Link from 'next/link'; +import Image from 'next/image'; import { useReveal } from '@/hooks/useReveal'; import GSAPAnimator from '@/components/GSAPAnimator'; @@ -32,28 +33,41 @@ export default function AboutUsPage() { {/* ── HERO ── */}
+ {/* Background photo */} + +
+
+ {/* Accent blobs */} +
+
{/* Big ghost text */}
LOYALY
-
-
-
- Meet the Crew +
+
+
+ Meet the Crew

Behind Loyaly.

-

+

We're not just building a product. We're redefining retail — one store at a time.

- {/* Company DNA widget */} -
-
- {/* Brand header */} -
-
-
-
Loyaly.ai
-
AI Retail Platform
-
-
- {/* Stats */} -
- {[['2024', 'Founded'], ['12+', 'Cities'], ['20+', 'Team']].map(([v, l]) => ( -
-
{v}
-
{l}
-
- ))} -
- {/* Values */} -
- {['Intelligence first', 'Merchant obsessed', 'Build to last'].map((v, i) => ( -
- - {v} -
- ))} -
- {/* Mission */} -
-
Mission
-
Transform physical retail with AI-driven intelligence and meaningful customer engagement.
-
-
-
@@ -115,16 +88,16 @@ export default function AboutUsPage() {
-
Our Story
+
Our Story

We started with
a simple idea.

-

+

Offline retail deserves the same intelligence as online. A store owner in Coimbatore shouldn't be flying blind while an e-commerce algorithm knows exactly what every user wants.

-

+

Today, we're building a connected ecosystem where businesses grow smarter and customers shop better — together.

@@ -151,7 +124,7 @@ export default function AboutUsPage() { display: 'flex', flexDirection: 'column', justifyContent: 'space-between', margin: '0 20px 20px', boxSizing: 'border-box', }}> -
{mv.label}
+
{mv.label}

{mv.body}

@@ -164,7 +137,7 @@ export default function AboutUsPage() { {/* ── VALUES ── */}
-
How We Work
+
How We Work

What we believe.

@@ -179,7 +152,7 @@ export default function AboutUsPage() { }}> {v.n}

{v.title}

-

{v.desc}

+

{v.desc}

))} @@ -205,7 +178,7 @@ export default function AboutUsPage() { display: 'inline-flex', alignItems: 'center', gap: 10, padding: '18px 44px', background: '#111', color: '#f4be28', fontSize: 16, fontWeight: 800, borderRadius: 100, textDecoration: 'none', - fontFamily: 'Manrope, sans-serif', position: 'relative', zIndex: 2, + fontFamily: 'Sora, sans-serif', position: 'relative', zIndex: 2, }}>Join Us →
@@ -237,11 +210,11 @@ function TeamCarousel() { {/* Header */}
-
The Team
+
The Team

Builders. Thinkers.
Retail obsessives.

-

+

Profiles coming soon — we're still busy building the future of retail.

@@ -325,7 +298,7 @@ function TeamCarousel() { transition: 'opacity 0.4s ease', }}>
{member.name}
-
{member.role}
+
{member.role}
{/* Gold dot */} diff --git a/src/app/blog_main/page.tsx b/src/app/blog_main/page.tsx index 5393c76..4d91194 100644 --- a/src/app/blog_main/page.tsx +++ b/src/app/blog_main/page.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import Link from 'next/link'; +import Image from 'next/image'; import { useReveal } from '@/hooks/useReveal'; import GSAPAnimator from '@/components/GSAPAnimator'; @@ -65,63 +66,38 @@ export default function BlogMainPage() { {/* ── HERO ── */}
+ {/* Background photo */} + +
+
+ {/* Accent blobs */} +
+
-
-
-
- Market Insights +
+
+
+ Market Insights

Insights for the
Future of Retail.

-

+

Explore ideas, trends, and strategies shaping modern retail — from our team to yours.

- {/* Featured article preview widget */} -
-
- {/* Visual banner */} -
-
-
-
RETAIL
-
AI
-
- Featured -
- {/* Article info */} -
-
- Analytics - 6 min read -
-

Why Footfall Data is the New Gold

-

Offline retailers are sitting on untapped behavioural gold — and most don't even know it exists yet.

-
-
- {['02', '03', '04'].map(n => ( -
{n}
- ))} -
+2
-
- Read article → -
-
-
-
@@ -133,7 +109,7 @@ export default function BlogMainPage() { padding: '10px 22px', borderRadius: 100, background: activeFilter === f ? '#0a0a0f' : 'transparent', color: activeFilter === f ? '#f4be28' : 'rgba(0,0,0,0.4)', - fontSize: 13, fontWeight: 700, fontFamily: 'Manrope, sans-serif', + fontSize: 13, fontWeight: 700, fontFamily: 'Sora, sans-serif', border: `1px solid ${activeFilter === f ? '#0a0a0f' : 'rgba(0,0,0,0.1)'}`, cursor: 'pointer', transition: 'all 0.2s ease', }}>{f} @@ -154,13 +130,13 @@ export default function BlogMainPage() { {/* Left — article info */}
- {featured.tag} - {featured.readTime} read - Featured + {featured.tag} + {featured.readTime} read + Featured

{featured.title}

-

{featured.excerpt}

- +

{featured.excerpt}

+ Read Article →
@@ -206,13 +182,13 @@ export default function BlogMainPage() { >
- {article.tag} - {article.readTime} + {article.tag} + {article.readTime}

{article.title}

-

{article.excerpt}

+

{article.excerpt}

- + Read Article → @@ -228,20 +204,20 @@ export default function BlogMainPage() {

Stay ahead of retail.

-

+

Get our latest insights on AI, footfall, and the future of physical retail — delivered monthly.

diff --git a/src/app/blog_single_page/page.tsx b/src/app/blog_single_page/page.tsx index 70de6d8..2be8e45 100644 --- a/src/app/blog_single_page/page.tsx +++ b/src/app/blog_single_page/page.tsx @@ -2,6 +2,7 @@ import React from 'react'; import Link from 'next/link'; +import Image from 'next/image'; const ARTICLE = { tag: 'Analytics', @@ -41,30 +42,36 @@ export default function BlogSinglePage() { {/* Hero */}
+ {/* Background photo */} + +
+
+
+
-
-
- +
+
+ ← Market Insights - / - {ARTICLE.tag} + / + {ARTICLE.tag}

{ARTICLE.title}

-

+

{ARTICLE.excerpt}

-
+
-
-
{ARTICLE.author}
-
{ARTICLE.date} · {ARTICLE.readTime} read
+
+
{ARTICLE.author}
+
{ARTICLE.date} · {ARTICLE.readTime} read
@@ -78,7 +85,7 @@ export default function BlogSinglePage() {

{s.heading}

-

+

{s.body}

{i < ARTICLE.sections.length - 1 && ( @@ -96,7 +103,7 @@ export default function BlogSinglePage() {

"Every day without footfall data is a day of lost insight."

-
— Loyaly.ai, 2026
+
@@ -107,16 +114,16 @@ export default function BlogSinglePage() {

Ready to see your store's data?

-

Book a 30-minute demo and see Behavision AI in action.

+

Book a 30-minute demo and see Behavision AI in action.

- + Book a Demo → {/* Related articles */}
-
More from Market Insights
+
More from Market Insights
{ARTICLE.relatedArticles.map((a) => ( { (e.currentTarget as HTMLAnchorElement).style.background = '#fafafa'; (e.currentTarget as HTMLAnchorElement).style.borderColor = 'rgba(0,0,0,0.07)'; }} >
- {a.tag} - {a.readTime} read + {a.tag} + {a.readTime} read

{a.title}

diff --git a/src/app/contacts/page.tsx b/src/app/contacts/page.tsx index cde4412..c96ddae 100644 --- a/src/app/contacts/page.tsx +++ b/src/app/contacts/page.tsx @@ -1,6 +1,7 @@ 'use client'; import React from 'react'; +import Image from 'next/image'; import GSAPAnimator from '@/components/GSAPAnimator'; import dynamic from 'next/dynamic'; @@ -13,11 +14,18 @@ export default function ContactsPage() { {/* ── HERO ── */}
+ {/* Background photo */} + +
+
+ {/* Accent blobs */} +
+
{/* Grid texture */}
-
-
+
+
- Contact + Contact

Tell us about your store and your goals. Our team will get back to you within one business day.

{/* Quick contact chips */} -
+
{[ { label: 'loyalydigital@gmail.com', href: 'mailto:loyalydigital@gmail.com' }, { label: 'Coimbatore, TN', href: undefined }, @@ -60,9 +70,9 @@ export default function ContactsPage() { {c.label} @@ -74,45 +84,6 @@ export default function ContactsPage() { })}
- {/* Message preview widget */} -
-
- {/* Header */} -
-
-
New Message
-
loyalydigital@gmail.com
-
- ● LIVE -
- {/* Incoming message */} -
-
From: A Retail Partner
-
"We'd love to explore how Loyaly.ai can drive footfall and loyalty for our chain of stores..."
-
- {/* Reply */} -
-
Loyaly.ai
-
We'll be in touch within one business day. Let's build something great together! ✦
-
- {/* Contact details */} - {[ - { icon: '📍', text: 'Coimbatore, Tamil Nadu' }, - { icon: '✉️', text: 'loyalydigital@gmail.com' }, - { icon: '⏱', text: 'Response within 24 hours' }, - ].map((c, i) => ( -
0 ? '1px solid rgba(255,255,255,0.05)' : 'none' }}> - {c.icon} - {c.text} -
- ))} -
-

diff --git a/src/app/faq/page.tsx b/src/app/faq/page.tsx index a6d02bd..f4e9eac 100644 --- a/src/app/faq/page.tsx +++ b/src/app/faq/page.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import Link from 'next/link'; +import Image from 'next/image'; import GSAPAnimator from '@/components/GSAPAnimator'; const FAQS = [ @@ -49,45 +50,41 @@ export default function FAQPage() { {/* Hero */}
+ {/* Background photo */} + +
+
+ {/* Accent blobs */} +
+
-
-
-
- FAQ +
+
+
+ FAQ

Got
Questions?

-

+

Everything you need to know about Loyaly — for customers, merchants, and curious minds.

- + Still need help? Contact us →
- {/* Stats card */} -
-
- {[ - { v: '15+', l: 'FAQ answers' }, - { v: '3', l: 'Categories' }, - { v: '<24h', l: 'Support response' }, - ].map((s, i) => ( -
-
{s.v}
-
{s.l}
-
- ))} -
-
-
{/* FAQ sections */} @@ -121,7 +118,7 @@ export default function FAQPage() { padding: '20px 24px', background: 'none', border: 'none', cursor: 'pointer', textAlign: 'left', gap: 16, }} > - {item.q} + {item.q} {isOpen && (
-

{item.a}

+

{item.a}

)}
@@ -146,8 +143,8 @@ export default function FAQPage() { {/* CTA */}

Still have questions?

-

Our team is happy to help — get in touch and we'll respond within one business day.

- +

Our team is happy to help — get in touch and we'll respond within one business day.

+ Contact Us →
diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 0e1a2cd..8ecf159 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -41,7 +41,7 @@ export default function RootLayout({ diff --git a/src/app/page.tsx b/src/app/page.tsx index ab6f146..9142ee7 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -351,7 +351,7 @@ export default function IndexPage() { position: 'relative', zIndex: 2, fontSize: 11, fontWeight: 800, letterSpacing: '0.3em', textTransform: 'uppercase', color: 'rgba(244,190,40,0.75)', - fontFamily: 'Manrope, sans-serif', marginBottom: 36, + fontFamily: 'Sora, sans-serif', marginBottom: 36, userSelect: 'none', }}> Loyaly @@ -383,7 +383,7 @@ export default function IndexPage() { position: 'relative', zIndex: 2, fontSize: 11, fontWeight: 600, letterSpacing: '0.2em', textTransform: 'uppercase', color: 'rgba(255,255,255,0.28)', - fontFamily: 'Manrope, sans-serif', marginTop: 28, + fontFamily: 'Sora, sans-serif', marginTop: 28, userSelect: 'none', }}> Loading experience @@ -469,7 +469,7 @@ export default function IndexPage() { letterSpacing: '0.12em', textTransform: 'uppercase', color: 'rgba(255,255,255,0.42)', - fontFamily: 'Manrope, sans-serif', + fontFamily: 'Sora, sans-serif', position: 'relative', }}> Scroll to explore diff --git a/src/app/solutions_page/page.tsx b/src/app/solutions_page/page.tsx index 0247c76..b92e2e0 100644 --- a/src/app/solutions_page/page.tsx +++ b/src/app/solutions_page/page.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import Link from 'next/link'; +import Image from 'next/image'; import GSAPAnimator from '@/components/GSAPAnimator'; import { useReveal } from '@/hooks/useReveal'; @@ -48,88 +49,50 @@ export default function SolutionsPage() { {/* ── HERO ── */}
+ {/* Background photo */} + +
+
+ {/* Accent blobs */} +
+
{/* Animated rings */} {[600, 900, 1200].map((s, i) => (
))} -
-
-
- Solutions +
+
+
+ Solutions

Built for
Modern
- Retail Growth. + Retail Growth.

-

+

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.

-
- Explore Solutions → - Book Demo -
-
- {/* Merchant campaign dashboard widget */} -
-
- {/* Header */} -
-
-
Merchant Dashboard
-
Live Campaign Analytics
-
- ● LIVE -
- {/* Campaign cards */} - {[ - { game: 'Maze Challenge', product: 'Nike Air Max', players: 847, conv: 38, color: '#f4be28' }, - { game: 'Spin Wheel', product: 'H&M Summer Collection', players: 523, conv: 44, color: '#a78bfa' }, - { game: 'Scratch Card', product: 'Starbucks Bundle', players: 1204, conv: 61, color: '#34d399' }, - ].map((c, i) => ( -
-
-
-
{c.game}
-
{c.product}
-
- Active -
-
-
-
{c.players.toLocaleString()}
-
Players
-
-
-
-
{c.conv}%
-
Conversion
-
-
-
- ))} - {/* Footer stat */} -
- Store visits this week - +42% -
+
+ Explore Solutions → + Book Demo
@@ -140,12 +103,12 @@ export default function SolutionsPage() {
-
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.

@@ -168,12 +131,12 @@ export default function SolutionsPage() { > {cap.n}

{cap.title}

-

{cap.desc}

+

{cap.desc}

{cap.metrics.map((m, j) => (
{m.val}
-
{m.lbl}
+
{m.lbl}
))}
@@ -198,7 +161,7 @@ export default function SolutionsPage() { meaningful in-store experience."
-

— Loyaly.ai, 2025

+

— Loyaly.ai, 2025

@@ -208,12 +171,12 @@ export default function SolutionsPage() {

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.

- Book Demo → - Explore Solutions + Book Demo → + Explore Solutions
@@ -224,7 +187,7 @@ export default function SolutionsPage() { ].map((s, i) => (
{s.v}
-
{s.l}
+
{s.l}
))} diff --git a/src/app/use_cases/page.tsx b/src/app/use_cases/page.tsx index 5f71c01..5594cf7 100644 --- a/src/app/use_cases/page.tsx +++ b/src/app/use_cases/page.tsx @@ -2,6 +2,7 @@ import React, { useRef, useState, useEffect } from 'react'; import Link from 'next/link'; +import Image from 'next/image'; import GSAPAnimator from '@/components/GSAPAnimator'; import { useReveal } from '@/hooks/useReveal'; @@ -87,11 +88,18 @@ export default function ForBusinessPage() { {/* ── HERO ── */}
+ {/* Background photo */} + +
+
+ {/* Accent blobs */} +
+
{/* Grid bg */}
-
-
+
+
- For Business + For Business

Loyaly.ai gives you complete visibility and control over your retail operations — understanding customers from entry to purchase.

-
+
Book a Demo → Talk to Sales
- {/* Real-time analytics widget */} -
-
- {/* Header */} -
-
Live Analytics
- ● LIVE -
-
Coimbatore Flagship Store
- {/* Main visitors stat */} -
-
Visitors Today
-
2,847
-
↑ +12% vs yesterday
-
- {/* Mini bar chart */} -
- {[30, 45, 38, 55, 62, 50, 70, 80, 65, 90, 75, 60].map((h, i) => ( -
- ))} -
- {/* Metric rows */} - {[ - { label: 'Conversion Rate', val: '34.8%', delta: '+3.2×', color: '#f4be28' }, - { label: 'Avg Basket Value', val: '₹1,240', delta: '+18%', color: '#a78bfa' }, - { label: 'Customer Retention', val: '68%', delta: '+12%', color: '#4ade80' }, - { label: 'Discount Savings', val: '41%', delta: 'saved', color: '#34d399' }, - ].map((m, i) => ( -
- {m.label} -
- {m.val} - {m.delta} -
-
- ))} -
-

@@ -199,7 +164,7 @@ export default function ForBusinessPage() {
-
The Challenge
+
The Challenge

You're Getting
Visitors. But
Missing Revenue. @@ -219,7 +184,7 @@ export default function ForBusinessPage() { display: 'flex', gap: 20, alignItems: 'flex-start', }}> 0{i + 1} - {line} + {line}

))} @@ -230,7 +195,7 @@ export default function ForBusinessPage() { {/* ── PRODUCTS ── */}
-
Our Products
+
Our Products

AI-Powered Retail Intelligence.

@@ -243,7 +208,7 @@ export default function ForBusinessPage() { padding: '10px 24px', borderRadius: 100, border: 'none', cursor: 'pointer', background: activeProduct === i ? p.color : 'transparent', color: activeProduct === i ? '#111' : 'rgba(255,255,255,0.45)', - fontSize: 14, fontWeight: 700, fontFamily: 'Manrope, sans-serif', + fontSize: 14, fontWeight: 700, fontFamily: 'Sora, sans-serif', transition: 'all 0.3s cubic-bezier(0.22,1,0.36,1)', }}>{p.name} ))} @@ -258,17 +223,17 @@ export default function ForBusinessPage() {
{p.tag}

{p.name}

-

{p.desc}

+

{p.desc}

Learn More →
{p.metric}
-
{p.metricLabel}
+
{p.metricLabel}
))} @@ -286,7 +251,7 @@ export default function ForBusinessPage() { {/* ── OUTCOMES ── */}
-
Outcomes
+
Outcomes

Real Results.
Not Assumptions.

@@ -300,7 +265,7 @@ export default function ForBusinessPage() { borderRadius: i === 0 ? '24px 0 0 24px' : i === 3 ? '0 24px 24px 0' : 0, }}>
{o.stat}
-
{o.label}
+
{o.label}
))} @@ -310,7 +275,7 @@ export default function ForBusinessPage() { {/* ── WHO IT'S FOR ── */}
-
Who It's For
+
Who It's For

Built for every format of physical retail.

@@ -339,10 +304,10 @@ export default function ForBusinessPage() {

Ready to Transform
Your Retail Business?

-

Schedule a demo and see your store's potential in 30 minutes.

+

Schedule a demo and see your store's potential in 30 minutes.

- Schedule a Demo - Talk to Sales + Schedule a Demo + Talk to Sales
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 9f950bb..dcea516 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -80,7 +80,7 @@ export default function Footer() { }}>
-
+
Let's build together

@@ -94,7 +94,7 @@ export default function Footer() { display: 'inline-flex', alignItems: 'center', gap: 10, padding: '18px 40px', background: '#f4be28', color: '#111', fontSize: 16, fontWeight: 800, borderRadius: 100, textDecoration: 'none', - fontFamily: 'Manrope, sans-serif', boxShadow: '0 16px 48px rgba(244,190,40,0.25)', + fontFamily: 'Sora, sans-serif', boxShadow: '0 16px 48px rgba(244,190,40,0.25)', whiteSpace: 'nowrap', }}> Book a Demo @@ -103,7 +103,7 @@ export default function Footer() { or talk to sales → @@ -123,7 +123,7 @@ export default function Footer() { Loyaly.AI -

+

AI-powered retail intelligence that turns every walk-in into a loyal customer.

@@ -146,13 +146,13 @@ export default function Footer() { {/* Nav columns */} {NAV.map(col => (

Come visit us or drop a message — we'll get back to you within one business day. @@ -81,8 +81,8 @@ export default function MapSection() {

-
{item.label}
-
{item.value}
+
{item.label}
+
{item.value}
))} @@ -96,7 +96,7 @@ export default function MapSection() { display: 'inline-flex', alignItems: 'center', gap: 10, padding: '14px 32px', background: '#f4be28', color: '#171512', fontSize: 14, fontWeight: 800, borderRadius: 100, - textDecoration: 'none', fontFamily: 'Manrope, sans-serif', + textDecoration: 'none', fontFamily: 'Sora, sans-serif', boxShadow: '0 8px 28px rgba(244,190,40,0.35)', width: 'fit-content', }} diff --git a/src/components/PhoneWidget.tsx b/src/components/PhoneWidget.tsx index 8099567..a102a5f 100644 --- a/src/components/PhoneWidget.tsx +++ b/src/components/PhoneWidget.tsx @@ -97,8 +97,8 @@ export default function PhoneWidget() { {/* Header */}
-
Good Morning
-
Loyaly ✦
+
Good Morning
+
Loyaly ✦
{/* Points card */} @@ -109,9 +109,9 @@ export default function PhoneWidget() { position: 'relative', overflow: 'hidden', }}>
-
Total Points
-
284
-
≈ ₹284 redeemable
+
Total Points
+
284
+
≈ ₹284 redeemable
{/* Activity feed */} @@ -126,8 +126,8 @@ export default function PhoneWidget() { background: 'rgba(255,255,255,0.04)', borderRadius: 12, padding: '10px 13px', border: '1px solid rgba(255,255,255,0.06)', }}> - {item.label} - {item.pts} + {item.label} + {item.pts} ))} @@ -151,8 +151,8 @@ export default function PhoneWidget() { }}>
-
+120 pts
-
just now
+
+120 pts
+
just now
@@ -165,7 +165,7 @@ export default function PhoneWidget() { boxShadow: '0 8px 32px rgba(0,0,0,0.4)', animation: 'pwOrbFloat 8s ease-in-out infinite', }}> -
Redeemable
+
Redeemable
₹284.00
diff --git a/src/components/Testimonial.tsx b/src/components/Testimonial.tsx index f345b94..7834033 100644 --- a/src/components/Testimonial.tsx +++ b/src/components/Testimonial.tsx @@ -109,7 +109,7 @@ export default function Testimonial() { lineHeight: 1, color: '#f4be28', opacity: 0.25, - fontFamily: 'Georgia, serif', + fontFamily: 'Sora, serif', }} > " diff --git a/src/components/for-people/AIRecommendationsSection.tsx b/src/components/for-people/AIRecommendationsSection.tsx index 057beef..37fc154 100644 --- a/src/components/for-people/AIRecommendationsSection.tsx +++ b/src/components/for-people/AIRecommendationsSection.tsx @@ -44,7 +44,7 @@ export default function AIRecommendationsSection() {

Our recommendation engine learns your taste from every transaction and surfaces offers uniquely matched to you — getting sharper with every visit.

@@ -57,7 +57,7 @@ export default function AIRecommendationsSection() { ].map((s, i) => (
{s.val}
-
{s.lbl}
+
{s.lbl}
))} @@ -66,8 +66,8 @@ export default function AIRecommendationsSection() { {/* Right — recommendation cards */}
- Recommended for you - Recommended for you + @@ -98,8 +98,8 @@ export default function AIRecommendationsSection() { {/* Info */}
-
{rec.label}
-
{rec.tag}
+
{rec.label}
+
{rec.tag}
{/* Match badge — brand gold */} @@ -109,7 +109,7 @@ export default function AIRecommendationsSection() { textAlign: 'center', }}>
{rec.match}
-
match
+
match
))} @@ -117,9 +117,9 @@ export default function AIRecommendationsSection() { {/* Confidence bar */}
- Model confidence + Model confidence High
diff --git a/src/components/for-people/DiscoverDealsSection.tsx b/src/components/for-people/DiscoverDealsSection.tsx index 1634f61..ef1d02d 100644 --- a/src/components/for-people/DiscoverDealsSection.tsx +++ b/src/components/for-people/DiscoverDealsSection.tsx @@ -1,6 +1,7 @@ 'use client'; import React, { useState } from 'react'; +import Image from 'next/image'; const deals = [ { store: 'Starbucks', category: 'Coffee & Drinks', offer: '2× Points', savings: '₹120 saved', color: '#00704A', distance: '0.3 km', rating: 4.8 }, @@ -16,6 +17,10 @@ export default function DiscoverDealsSection() { return (
+ {/* Background photo */} + +
+ {/* Soft radial */}

Find participating stores nearby and see their active game-based discount campaigns, live coupons, and coin-earning opportunities — all surfaced in real time so you never miss a deal.

@@ -52,7 +57,7 @@ export default function DiscoverDealsSection() { - Coimbatore, TN + Coimbatore, TN
@@ -83,21 +88,21 @@ export default function DiscoverDealsSection() {
- {deal.store} - {deal.distance} - ★ {deal.rating} + {deal.store} + {deal.distance} + ★ {deal.rating}
- {deal.category} + {deal.category}
{deal.offer}
-
{deal.savings}
+
{deal.savings}
))}
+ 2,400 more deals near you
diff --git a/src/components/for-people/EarnRewardsSection.tsx b/src/components/for-people/EarnRewardsSection.tsx index 7ea9fb6..e430436 100644 --- a/src/components/for-people/EarnRewardsSection.tsx +++ b/src/components/for-people/EarnRewardsSection.tsx @@ -48,7 +48,7 @@ export default function EarnRewardsSection() { background: '#f0fdf4', border: '1.5px solid #16a34a', borderRadius: 100, padding: '7px 16px', }}> - Live points balance + Live points balance {/* Giant gold number */} @@ -67,7 +67,7 @@ export default function EarnRewardsSection() { background: '#fff7e0', border: '1px solid #f4be28', }}> ₹{pts.toLocaleString()} - redeemable value + redeemable value
Earn · 03
@@ -82,7 +82,7 @@ export default function EarnRewardsSection() {

Earn Loyaly Coins through daily app login, completing 5,000-step walking challenges, playing Maze, Spin Wheel, Scratch Card, and Match Master games, or visiting Selfie Booths at partner malls. Every activity puts more coins in your wallet.

@@ -95,8 +95,8 @@ export default function EarnRewardsSection() { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 14, paddingBottom: 14, borderBottom: '2px solid #f4be28', }}> - Activity feed - Activity feed + @@ -123,8 +123,8 @@ export default function EarnRewardsSection() { color: tx.type === 'earn' ? '#16a34a' : '#ef4444', }}>{tx.type === 'earn' ? '↑' : '↓'}
-
{tx.store}
-
{tx.time}
+
{tx.store}
+
{tx.time}
(
-
{s.label}
+
{s.label}
{s.val}
))} diff --git a/src/components/for-people/ExperienceSection.tsx b/src/components/for-people/ExperienceSection.tsx index eae53c4..054aea7 100644 --- a/src/components/for-people/ExperienceSection.tsx +++ b/src/components/for-people/ExperienceSection.tsx @@ -40,7 +40,7 @@ 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.

@@ -53,7 +53,7 @@ export default function ExperienceSection() { transitionDelay: `${0.2 + i * 0.1}s`, }}> {s.n} - {s.label} + {s.label}
))} @@ -64,7 +64,7 @@ export default function ExperienceSection() {
0 ? -9 : 0 }} /> ))}
- + Joined by 50,000+ shoppers diff --git a/src/components/for-people/FinalCTASection.tsx b/src/components/for-people/FinalCTASection.tsx index 1240603..07c3bd9 100644 --- a/src/components/for-people/FinalCTASection.tsx +++ b/src/components/for-people/FinalCTASection.tsx @@ -58,7 +58,7 @@ export default function FinalCTASection() { background: '#f0fdf4', border: '1.5px solid #16a34a', borderRadius: 100, padding: '10px 22px', }}> - + Now live in Coimbatore @@ -73,7 +73,7 @@ export default function FinalCTASection() {

Download Loyaly and start earning on your very next purchase. Free. Instant. Yours. @@ -106,7 +106,7 @@ export default function FinalCTASection() { minWidth: 110, }}>

{p.val}
-
{p.label}
+
{p.label}
))} diff --git a/src/components/for-people/HeroSection.tsx b/src/components/for-people/HeroSection.tsx index 1e6cc15..822375a 100644 --- a/src/components/for-people/HeroSection.tsx +++ b/src/components/for-people/HeroSection.tsx @@ -1,7 +1,8 @@ 'use client'; -import React, { useRef, useEffect, useCallback } from 'react'; +import React, { useRef, useEffect } from 'react'; import Link from 'next/link'; +import Image from 'next/image'; function useMagnetic(strength = 12) { const ref = useRef(null); @@ -28,29 +29,14 @@ function useMagnetic(strength = 12) { export default function HeroSection() { const magPrimary = useMagnetic(10); const magSecondary = useMagnetic(8); - const stageRef = useRef(null); - - // Pointer parallax for the phone stage - const onStageMove = useCallback((e: React.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 onStageLeave = 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'); - }, []); return ( -
+
+ + {/* Background photo */} + +
+
{/* Ambient orbs + grid */}
@@ -71,11 +57,11 @@ export default function HeroSection() {
-
+
{/* Text column */} -
-
+
+
For People · By Loyaly
@@ -89,12 +75,12 @@ export default function HeroSection() {

Earn Loyaly Coins through daily activities, interactive games, and walking challenges — then redeem them at participating stores near you. Earn Online. Spend Offline.

-
+
{/* Trust row */} -
+
{['#f4be28', '#4ade80', '#a855f7', '#3b82f6'].map((c, i) => (
0 ? -9 : 0, opacity: 0.9 }} /> ))}
- + 50,000+ active shoppers earning daily
- - {/* Visual column — phone */} -
-
- {/* Glow ring */} -
- {/* Phone shell */} -
- {/* Shimmer sweep */} -
-
-
- {/* Dynamic island */} -
-
-
-
-
-
- {/* Header */} -
-
Good Morning
-
Loyaly ✦
-
- {/* Points card */} -
-
-
Total Points
-
284
-
≈ ₹284 redeemable
-
- {/* Activity */} -
- {[ - { store: 'Starbucks', pts: '+120', color: '#4ade80' }, - { store: 'Nike Store', pts: '+85', color: '#4ade80' }, - { store: 'H&M', pts: '−50', color: '#f87171' }, - ].map((item, i) => ( -
- {item.store} - {item.pts} -
- ))} -
- {/* Nav dots */} -
- {[1, 0, 0, 0].map((a, i) => ( -
- ))} -
-
- - {/* Floating mini chips */} -
-
-
-
+120 pts
-
just now
-
-
-
-
Redeemable
-
₹284.00
-
-
-
@@ -236,7 +115,7 @@ export default function HeroSection() {
Scroll diff --git a/src/components/for-people/SpendAnywhereSection.tsx b/src/components/for-people/SpendAnywhereSection.tsx index 7558972..3a63d81 100644 --- a/src/components/for-people/SpendAnywhereSection.tsx +++ b/src/components/for-people/SpendAnywhereSection.tsx @@ -38,7 +38,7 @@ export default function SpendAnywhereSection() {

One wallet. Every store. Your Loyaly points are universal — no restrictions, no expiry, no fine print.

@@ -64,12 +64,12 @@ export default function SpendAnywhereSection() { >
{(() => { const BrandIcon = brand.Icon; return ; })()} - {brand.name} + {brand.name}
{brand.stores.map((s, j) => ( (
{s.val}
-
{s.lbl}
+
{s.lbl}
))}
diff --git a/src/components/for-people/VerticalScrollWrapper.tsx b/src/components/for-people/VerticalScrollWrapper.tsx index f012899..c56de38 100644 --- a/src/components/for-people/VerticalScrollWrapper.tsx +++ b/src/components/for-people/VerticalScrollWrapper.tsx @@ -209,7 +209,7 @@ export default function VerticalScrollWrapper({ children, sections = [] }: Props } .fp-kicker { display: inline-flex; align-items: center; gap: 12px; - font-family: 'Manrope', sans-serif; font-weight: 700; + font-family: 'Sora', sans-serif; font-weight: 700; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--gold); } .fp-kicker::before { @@ -219,7 +219,7 @@ export default function VerticalScrollWrapper({ children, sections = [] }: Props /* ── Shared buttons ── */ .fp-btn { display: inline-flex; align-items: center; gap: 10px; - font-family: 'Manrope', sans-serif; font-weight: 700; font-size: 15px; + font-family: 'Sora', sans-serif; font-weight: 700; font-size: 15px; border-radius: 100px; text-decoration: none; cursor: pointer; letter-spacing: -0.01em; white-space: nowrap; transition: transform 0.35s cubic-bezier(0.34,1.56,0.64,1), background 0.3s ease, box-shadow 0.3s ease; @@ -296,7 +296,7 @@ export default function VerticalScrollWrapper({ children, sections = [] }: Props .fp-rail-item.is-active .fp-rail-dot { background: var(--gold); box-shadow: 0 0 12px rgba(244,190,40,0.8); transform: scale(1.3); } .fp-rail-label { display: flex; align-items: center; gap: 8px; - font-family: 'Manrope', sans-serif; font-size: 11px; font-weight: 600; + font-family: 'Sora', sans-serif; font-size: 11px; font-weight: 600; letter-spacing: 0.04em; color: rgba(255,255,255,0.8); white-space: nowrap; padding: 5px 12px; border-radius: 100px; background: rgba(12,12,18,0.72); border: 1px solid rgba(255,255,255,0.08); diff --git a/src/components/for-people/WhyLoyalySection.tsx b/src/components/for-people/WhyLoyalySection.tsx index 1ce6762..2b56a47 100644 --- a/src/components/for-people/WhyLoyalySection.tsx +++ b/src/components/for-people/WhyLoyalySection.tsx @@ -68,7 +68,7 @@ export default function WhyLoyalySection() {
Loyalty penetration in offline retail
@@ -85,7 +85,7 @@ export default function WhyLoyalySection() { transitionDelay: `${0.1 + i * 0.08}s`, }}>
{m.val}
-
{m.label}
+
{m.label}
))}
@@ -99,7 +99,7 @@ export default function WhyLoyalySection() { background: '#fff7e0', border: '1.5px solid #f4be28', borderRadius: 100, padding: '10px 20px', }}> - + {count.toLocaleString()} txns today · unrewarded
@@ -114,7 +114,7 @@ export default function WhyLoyalySection() {

India's offline retail market is worth ₹2.1 lakh crore. Yet loyalty penetration sits at effectively zero. Loyaly exists to close that gap — permanently.

@@ -123,7 +123,7 @@ export default function WhyLoyalySection() { {bars.map((b, i) => (
- {b.label} + {b.label} {b.pct}%
diff --git a/src/components/home/ProblemsShift.tsx b/src/components/home/ProblemsShift.tsx index 91808d4..74f4874 100644 --- a/src/components/home/ProblemsShift.tsx +++ b/src/components/home/ProblemsShift.tsx @@ -156,7 +156,7 @@ function CompareCard({ )} - {badge} + {badge}
{/* Description */} @@ -181,7 +181,7 @@ function CompareCard({ {item.icon} - {item.text} + {item.text}
))}
@@ -261,12 +261,12 @@ export default function ProblemsShift({ isLoaded = true }: ProblemsShiftProps) {
- The Opportunity + The Opportunity

Retail is busy.
But blind.

-

+

Customers have no compelling reason to choose your store over the next one. Loyaly creates that reason — with daily rewards, interactive games, and surprise coupons redeemable in person.

@@ -312,7 +312,7 @@ export default function ProblemsShift({ isLoaded = true }: ProblemsShiftProps) { {f.icon} - {f.label} + {f.label}
{i < BOTTOM_FEATURES.length - 1 && } diff --git a/src/components/home/ProductsSection.tsx b/src/components/home/ProductsSection.tsx index 688b6be..458f563 100644 --- a/src/components/home/ProductsSection.tsx +++ b/src/components/home/ProductsSection.tsx @@ -130,8 +130,8 @@ function ProductVisual({ product }: { product: Product }) { return (
- Live footfall - + Live footfall + 2,847
@@ -145,7 +145,7 @@ function ProductVisual({ product }: { product: Product }) {
{[['Peak', '6–8 PM'], ['Dwell', '14 min'], ['Zones', '12']].map(([k, v]) => (
-
{k}
+
{k}
{v}
))} @@ -163,10 +163,10 @@ function ProductVisual({ product }: { product: Product }) { return (
-
Avg basket value
+
Avg basket value
₹1,240 - +18% + +18%
@@ -189,19 +189,19 @@ function ProductVisual({ product }: { product: Product }) { return (
-
Smart Offer
+
Smart Offer
15% OFF
-
Targeted · high-intent shoppers
+
Targeted · high-intent shoppers
- Conversion uplift + Conversion uplift +41%
-
Margin protected · 0 waste
+
Margin protected · 0 waste
); @@ -212,16 +212,16 @@ function ProductVisual({ product }: { product: Product }) {
Loyaly ✦ - GOLD MEMBER + GOLD MEMBER
-
Reward Points
+
Reward Points
284
{[['Starbucks', '+120'], ['Nike Store', '+85']].map(([s, p]) => (
- {s} - {p} + {s} + {p}
))}
@@ -269,7 +269,7 @@ function ProductCard({ product, index }: { product: Product; index: number }) {
0{product.id} - {product.subtitle} + {product.subtitle}

{product.description}

@@ -293,7 +293,7 @@ function ProductCard({ product, index }: { product: Product; index: number }) { {tag} ))}
@@ -304,7 +304,7 @@ function ProductCard({ product, index }: { product: Product; index: number }) { display: 'inline-flex', alignItems: 'center', gap: '8px', width: 'max-content', padding: '11px 22px', borderRadius: '99px', fontSize: '0.85rem', fontWeight: 800, textDecoration: 'none', color: '#111111', background: product.accent, - fontFamily: 'Manrope, sans-serif', boxShadow: `0 12px 36px rgba(${product.accentRgb},0.25)`, + fontFamily: 'Sora, sans-serif', boxShadow: `0 12px 36px rgba(${product.accentRgb},0.25)`, transition: 'transform 0.3s cubic-bezier(0.34,1.56,0.64,1)', }} onMouseEnter={(e) => { (e.currentTarget as HTMLAnchorElement).style.transform = 'scale(1.04)'; }} @@ -408,7 +408,7 @@ export default function ProductsSection({ isLoaded = false }: ProductsSectionPro
- Platform + Platform

Four products.
@@ -417,10 +417,10 @@ export default function ProductsSection({ isLoaded = false }: ProductsSectionPro

-

+

Powering every stage of the retail journey with intelligent AI solutions.

-
+
Scroll to explore diff --git a/src/components/home/TheLoop.tsx b/src/components/home/TheLoop.tsx index a21833e..ee5372a 100644 --- a/src/components/home/TheLoop.tsx +++ b/src/components/home/TheLoop.tsx @@ -149,7 +149,7 @@ export default function TheLoop() { background: 'rgba(244,190,40,0.08)', border: '1px solid rgba(244,190,40,0.22)', }}> - The Loop + The Loop

Earn coins online, unlock game-based deals, discover nearby stores, and redeem offline — a self-reinforcing loop that keeps customers engaged and drives repeat footfall.

@@ -204,7 +204,7 @@ export default function TheLoop() {
@@ -258,13 +258,13 @@ export default function TheLoop() {
-
+
Step {s.step}

{s.title}

-

+

{s.desc}

@@ -297,7 +297,7 @@ export default function TheLoop() { {/* ── Impact metrics ── */}
- + Measured Impact
@@ -318,7 +318,7 @@ export default function TheLoop() { {counts[i].toFixed(m.decimals)} {m.suffix}
-
+
{m.label}
diff --git a/src/components/home/WhatWeDo.tsx b/src/components/home/WhatWeDo.tsx index c02f58e..063a1d5 100644 --- a/src/components/home/WhatWeDo.tsx +++ b/src/components/home/WhatWeDo.tsx @@ -94,7 +94,7 @@ function StageCard({ num, title, description, icon, cardRef, orderClass }: CardP fontSize: 'clamp(0.9rem, 1vw, 1rem)', color: 'rgba(255,255,255,0.45)', lineHeight: 1.75, maxWidth: '360px', - fontFamily: 'Manrope, sans-serif', + fontFamily: 'Sora, sans-serif', position: 'relative', zIndex: 2, }}> {description} @@ -264,7 +264,7 @@ export default function WhatWeDo({ isLoaded = false }: WhatWeDoProps) {

{/* Subtitle */} -

+

Four stages. One platform. A smarter retail cycle that turns every walk-in into a loyal customer.