Update homepage, use-cases, and people pages; add preloader and new section components

This commit is contained in:
R-Bharathraj
2026-07-01 18:06:06 +05:30
parent 7a15ee2b52
commit abcefbb9c9
26 changed files with 1178 additions and 897 deletions

View File

@@ -1,6 +1,7 @@
'use client';
import React, { useState } from 'react';
import Image from 'next/image';
const GroceryIcon = () => <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M6 2L3 6v14a2 2 0 002 2h14a2 2 0 002-2V6l-3-4z"/><line x1="3" y1="6" x2="21" y2="6"/><path d="M16 10a4 4 0 01-8 0"/></svg>;
const FashionIcon = () => <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M20.38 3.46L16 2a4 4 0 01-8 0L3.62 3.46a2 2 0 00-1.34 2.23l.58 3.57a1 1 0 00.99.84H6v10c0 1.1.9 2 2 2h8a2 2 0 002-2V10h2.15a1 1 0 00.99-.84l.58-3.57a2 2 0 00-1.34-2.23z"/></svg>;
@@ -23,6 +24,10 @@ export default function SpendAnywhereSection() {
return (
<section className="fp-panel" style={{ background: '#080810' }}>
{/* Background photo */}
<Image src="/images/stock/spend-anywhere.png" alt="" fill style={{ objectFit: 'cover', opacity: 0.25, zIndex: 0 }} />
<div style={{ position: 'absolute', inset: 0, background: 'linear-gradient(180deg, rgba(8,8,16,0.3) 0%, rgba(8,8,16,0.75) 80%)', zIndex: 0 }} />
<div className="fp-shell">
{/* Header row */}
@@ -45,40 +50,90 @@ export default function SpendAnywhereSection() {
</div>
{/* Category grid */}
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(260px, 1fr))', gap: 14 }}>
{brands.map((brand, i) => (
<div
key={i}
onMouseEnter={() => setActive(i)}
onMouseLeave={() => setActive(null)}
className="fp-rise"
style={{
padding: '22px 24px', borderRadius: 18,
background: active === i ? `${brand.color}10` : 'rgba(255,255,255,0.03)',
border: `1px solid ${active === i ? `${brand.color}40` : 'rgba(255,255,255,0.07)'}`,
backdropFilter: 'blur(12px)', cursor: 'default',
transitionDelay: `${0.08 + i * 0.06}s`,
transform: active === i ? 'translateY(-5px)' : 'translateY(0)',
boxShadow: active === i ? `0 22px 60px ${brand.color}1f, inset 0 1px 0 rgba(255,255,255,0.08)` : 'none',
}}
>
<div style={{ display: 'flex', alignItems: 'center', gap: 11, marginBottom: 14 }}>
{(() => { const BrandIcon = brand.Icon; return <span style={{ color: active === i ? brand.color : 'rgba(255,255,255,0.45)', transition: 'color 0.3s' }}><BrandIcon /></span>; })()}
<span style={{ fontSize: 14, fontWeight: 700, color: active === i ? '#fff' : 'rgba(255,255,255,0.75)', fontFamily: 'Sora, sans-serif', transition: 'color 0.2s' }}>{brand.name}</span>
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(260px, 1fr))', gap: 16 }}>
{brands.map((brand, i) => {
const BrandIcon = brand.Icon;
return (
<div
key={i}
onMouseEnter={() => setActive(i)}
onMouseLeave={() => setActive(null)}
className="fp-rise"
style={{
position: 'relative',
padding: '24px 28px',
borderRadius: 22,
background: active === i ? 'rgba(12, 12, 22, 0.65)' : 'rgba(10, 10, 18, 0.45)',
border: `1px solid ${active === i ? `${brand.color}45` : 'rgba(255,255,255,0.08)'}`,
backdropFilter: 'blur(20px) saturate(140%)',
WebkitBackdropFilter: 'blur(20px) saturate(140%)',
cursor: 'default',
transitionDelay: `${0.08 + i * 0.06}s`,
transform: active === i ? 'translateY(-6px)' : 'translateY(0)',
boxShadow: active === i
? `0 24px 50px -12px rgba(0,0,0,0.65), 0 0 25px -4px ${brand.color}25, inset 0 1px 0 rgba(255,255,255,0.1)`
: '0 8px 30px -10px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255,255,255,0.05)',
transition: 'all 0.4s cubic-bezier(0.25, 1, 0.22, 1)',
overflow: 'hidden',
}}
>
{/* Glowing Left Accent Bar */}
<span style={{
position: 'absolute', left: 0, top: '20%', bottom: '20%', width: 3,
borderRadius: '0 4px 4px 0',
background: brand.color,
opacity: active === i ? 1 : 0,
transform: active === i ? 'scaleY(1.2)' : 'scaleY(0.8)',
transition: 'all 0.35s cubic-bezier(0.34, 1.56, 0.64, 1)',
boxShadow: `0 0 12px ${brand.color}`,
}} />
<div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 18 }}>
{/* Icon Container with subtle background shape */}
<div style={{
width: 42,
height: 42,
borderRadius: 13,
background: active === i ? `${brand.color}20` : 'rgba(255,255,255,0.04)',
border: `1px solid ${active === i ? `${brand.color}45` : 'rgba(255,255,255,0.09)'}`,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
color: active === i ? brand.color : 'rgba(255,255,255,0.45)',
transition: 'all 0.35s cubic-bezier(0.25, 1, 0.22, 1)',
}}>
<BrandIcon />
</div>
<span style={{
fontSize: 15,
fontWeight: 800,
color: active === i ? '#fff' : 'rgba(255,255,255,0.75)',
fontFamily: 'Sora, sans-serif',
letterSpacing: '-0.01em',
transition: 'color 0.3s ease',
}}>{brand.name}</span>
</div>
<div style={{ display: 'flex', gap: 7, flexWrap: 'wrap' }}>
{brand.stores.map((s, j) => (
<span key={j} style={{
fontSize: 10,
fontWeight: 700,
textTransform: 'uppercase',
letterSpacing: '0.04em',
fontFamily: 'Sora, sans-serif',
color: active === i ? '#ffffff' : 'rgba(255,255,255,0.3)',
background: active === i ? `${brand.color}22` : 'rgba(255,255,255,0.04)',
border: `1px solid ${active === i ? `${brand.color}40` : 'rgba(255,255,255,0.06)'}`,
borderRadius: 100,
padding: '5px 12px',
transition: 'all 0.3s cubic-bezier(0.25, 1, 0.22, 1)',
}}>{s}</span>
))}
</div>
</div>
<div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
{brand.stores.map((s, j) => (
<span key={j} style={{
fontSize: 11, fontWeight: 600, fontFamily: 'Sora, sans-serif',
color: active === i ? brand.color : 'rgba(255,255,255,0.3)',
background: active === i ? `${brand.color}18` : 'rgba(255,255,255,0.04)',
border: `1px solid ${active === i ? `${brand.color}30` : 'rgba(255,255,255,0.06)'}`,
borderRadius: 100, padding: '4px 10px', transition: 'all 0.25s ease',
}}>{s}</span>
))}
</div>
</div>
))}
);
})}
</div>
{/* Stat strip */}