From 80ae7558257b4744b58124d4d19e5b96b9b121d5 Mon Sep 17 00:00:00 2001 From: Vishva Date: Thu, 30 Jul 2026 10:23:14 +0530 Subject: [PATCH] Adjust navigation flow, clean up JSX markup and defaults in App.jsx --- src/App.jsx | 4920 ++++++++++++++-------------- src/components/FeaturedGallery.jsx | 42 +- 2 files changed, 2452 insertions(+), 2510 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 34c287e..bdfbcea 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -34,19 +34,19 @@ function Reveal({ children, delay = 0, style }) { ); } -import { - ArrowRight, - Sparkles, - Database, - Cpu, - LineChart, - Layers, - Activity, - Settings, - Shield, - TrendingUp, - Globe, - ChevronRight, +import { + ArrowRight, + Sparkles, + Database, + Cpu, + LineChart, + Layers, + Activity, + Settings, + Shield, + TrendingUp, + Globe, + ChevronRight, ChevronLeft, Mail, CheckCircle, @@ -83,24 +83,24 @@ const iconMap = { // Reusable Orbital Logo Component for animated paths around header text const OrbitalLogo = ({ src, alt, radiusX, radiusY, startAngle, duration, clockwise = true, size = 120 }) => { const [position, setPosition] = useState({ x: 0, y: 0 }); - + useEffect(() => { const speed = (2 * Math.PI) / (duration * 1000); // radians per millisecond const direction = clockwise ? 1 : -1; const startRad = (startAngle * Math.PI) / 180; - + let animFrame; const update = () => { const elapsed = performance.now(); const angle = startRad + direction * speed * elapsed; - + const x = radiusX * Math.cos(angle); const y = radiusY * Math.sin(angle); - + setPosition({ x, y }); animFrame = requestAnimationFrame(update); }; - + animFrame = requestAnimationFrame(update); return () => cancelAnimationFrame(animFrame); }, [radiusX, radiusY, startAngle, duration, clockwise]); @@ -150,11 +150,11 @@ function ServiceCard({ service, isMobile, index = 0 }) { ]; const formatTitle = (title) => { - if (title.includes('AI & Data')) return <>AI & Data
Services; - if (title.includes('Enterprise')) return <>Enterprise
Software; - if (title.includes('SAP')) return <>SAP Managed
Services; - if (title.includes('Smart')) return <>Smart
Factory; - if (title.includes('AR/VR')) return <>AR/VR &
Immersive
Technologies; + if (title.includes('AI & Data')) return <>AI & Data
Services; + if (title.includes('Enterprise')) return <>Enterprise
Software; + if (title.includes('SAP')) return <>SAP Managed
Services; + if (title.includes('Smart')) return <>Smart
Factory; + if (title.includes('AR/VR')) return <>AR/VR &
Immersive
Technologies; return title; }; @@ -234,8 +234,8 @@ function ServiceCard({ service, isMobile, index = 0 }) { right: '-15px', pointerEvents: 'none', }}> - {`${service.title} { - const hash = typeof window !== 'undefined' ? window.location.hash : ''; - if (hash === '#contact' || hash === '#contactus') return 'contact'; - if (hash === '#about' || hash === '#aboutus') return 'about'; - return 'home'; - }); + const [currentPage, setCurrentPage] = useState('home'); useEffect(() => { const syncPageFromHash = () => { @@ -453,7 +448,7 @@ export default function App({ previewMode = false }) { const logoNumbers = [27, 28, 30, 31, 32, 33, 34, 35, 36]; const randomNum = logoNumbers[Math.floor(Math.random() * logoNumbers.length)]; setFlippingLogo(randomNum); - + // Clear flip after animation completes setTimeout(() => { setFlippingLogo(null); @@ -550,23 +545,15 @@ export default function App({ previewMode = false }) { const NAV_OFFSET = isMobile ? 72 : 88; const scrollToSection = (sectionId) => { - if (sectionId === 'contactus') { - const footer = document.getElementById('contactus'); - if (footer) { - const top = footer.getBoundingClientRect().top + window.scrollY - NAV_OFFSET; - window.scrollTo({ top: Math.max(0, top), behavior: 'smooth' }); - } else { - window.scrollTo({ top: document.documentElement.scrollHeight, behavior: 'smooth' }); - } - setActiveSection('contactus'); - return; - } - const el = document.getElementById(sectionId); - if (!el) return; - const top = el.getBoundingClientRect().top + window.scrollY - NAV_OFFSET; - window.scrollTo({ top: Math.max(0, top), behavior: 'smooth' }); - setActiveSection(sectionId); + if (el) { + const top = el.getBoundingClientRect().top + window.scrollY - NAV_OFFSET; + window.scrollTo({ top, behavior: 'smooth' }); + setActiveSection(sectionId); + } else if (sectionId === 'contactus') { + window.scrollTo({ top: document.documentElement.scrollHeight, behavior: 'smooth' }); + setActiveSection('contactus'); + } }; const handleNavClick = (item) => { @@ -594,28 +581,33 @@ export default function App({ previewMode = false }) { const sectionMap = { Home: 'home', - 'About Us': 'aboutus', Products: 'products', }; const id = sectionMap[item]; + const doScroll = (sectionId) => { + if (!sectionId || sectionId === 'home') { + window.scrollTo({ top: 0, behavior: 'smooth' }); + return; + } + requestAnimationFrame(() => { + const el = document.getElementById(sectionId); + if (el) { + const top = el.getBoundingClientRect().top + window.scrollY - NAV_OFFSET; + window.scrollTo({ top, behavior: 'smooth' }); + setActiveSection(sectionId); + } + }); + }; + if (currentPage !== 'home') { setCurrentPage('home'); setActiveSection(id || 'home'); - window.location.hash = id || 'home'; - setTimeout(() => { - if (id && id !== 'home') { - scrollToSection(id); - } else { - window.scrollTo({ top: 0, behavior: 'smooth' }); - } - }, 100); + setTimeout(() => doScroll(id), 350); return; } - if (!id) return; - window.location.hash = id; - setTimeout(() => scrollToSection(id), isMobile ? 150 : 0); + doScroll(id); }; useEffect(() => { @@ -680,10 +672,10 @@ export default function App({ previewMode = false }) { return (
- + {/* Main Content Wrapper with solid background and higher z-index for sticky footer parallax reveal */}
- + {/* Background Glows */}
{/* Navigation Bar */} - - {/* Background Video */} - - - - - - {/* Badge */} -
- - {(hero.badge || "Chennai & Dubai • Trusted by 100+ Clients").includes('100+ Clients') ? ( - <> - {(hero.badge || "Chennai & Dubai • Trusted by 100+ Clients").split('100+ Clients')[0]} - 100+ Clients - {(hero.badge || "Chennai & Dubai • Trusted by 100+ Clients").split('100+ Clients')[1]} - - ) : ( - hero.badge - )} - -
- - {/* Headline */} -

- - {hero.headline || "Engineering Intelligence"} - - - {hero.subheadline || "Delivering Impact"} - -

- - {/* Description */} -

- {hero.description || "In a world driven by intelligence, data, and automation, organisations need more than technology they need a digital transformation partner that delivers measurable business impact."} -

- - {/* CTA Buttons */} -
- - - + {navItems.map((item) => ( + + ))} + +
- -
- + )} + {currentPage === 'contact' ? ( + setIsStrategyOpen(true)} /> + ) : currentPage === 'about' ? ( + setIsStrategyOpen(true)} onNavigate={handleNavClick} /> + ) : ( + <> + {/* Main Homepage Content */} +
+
- - {/* Metrics Section */} -
- {/* Statistics Panel */} - -
- {/* Metrics from CMS */} - {metrics.map((metric, idx) => ( - - {idx > 0 && !isMobile &&
} -
-
- {[, , , ][idx % 4]} -
-
- {metric.value} - {metric.label} -
-
- - ))} -
- -
- - {/* Frost & Sullivan Alliance Section */} -
-
- - {/* Subtle center spotlight lighting effect behind badge */} -
- -

- {about.heading} -

- - {/* Frost & Sullivan Badge container */} -
- {about.badgeAlt} -
- -
-
- - - {/* Redesigned Trusted Brands Section */} -
- {/* Subtle grid background */} -
- - {/* Ambient Glows */} -
- -
- - {isMobile ? ( - /* Mobile Layout: Clean vertical hierarchy */ -
-
-

- {partners.heading} -

-

- {partners.subheading} -

-

- {partners.body} -

-
- - {/* Globe Visual */} -
- Globe Map -
- - {/* Grid of Logos */} -
- {partners.logos.map((logo, idx) => ( -
+ + Your browser does not support the video tag. + + + + + + {/* Badge */} +
- {logo.name} + {(hero.badge || "Chennai & Dubai • Trusted by 100+ Clients").includes('100+ Clients') ? ( + <> + {(hero.badge || "Chennai & Dubai • Trusted by 100+ Clients").split('100+ Clients')[0]} + 100+ Clients + {(hero.badge || "Chennai & Dubai • Trusted by 100+ Clients").split('100+ Clients')[1]} + + ) : ( + hero.badge + )} + +
+ + {/* Headline */} +

+ + {hero.headline || "Engineering Intelligence"} + + + {hero.subheadline || "Delivering Impact"} + +

+ + {/* Description */} +

+ {hero.description || "In a world driven by intelligence, data, and automation, organisations need more than technology they need a digital transformation partner that delivers measurable business impact."} +

+ + {/* CTA Buttons */} +
+ + + +
+
+
+
+ + + {/* Metrics Section */} +
+ {/* Statistics Panel */} + +
+ {/* Metrics from CMS */} + {metrics.map((metric, idx) => ( + + {idx > 0 && !isMobile &&
} +
+
+ {[, , , ][idx % 4]} +
+
+ {metric.value} + {metric.label} +
+
+ + ))} +
+ +
+ + {/* Frost & Sullivan Alliance Section */} +
+
+ + {/* Subtle center spotlight lighting effect behind badge */} +
+ +

+ {about.heading} +

+ + {/* Frost & Sullivan Badge container */} +
+ {about.badgeAlt}
- ))} +
-
- ) : ( - /* Desktop Layout: Orbital Globe Layout as per reference image */ -
- - {/* Globe in background - Increased Size & Brightness */} - Globe Map +
- {/* Center Text Panel */} + + {/* Redesigned Trusted Brands Section */} +
+ {/* Subtle grid background */} +
+ + {/* Ambient Glows */}
-

- {partners.heading} -

- - {partners.subheading} - -

- {partners.body} -

+ width: '500px', + height: '500px', + background: 'radial-gradient(circle, rgba(0, 119, 255, 0.05) 0%, transparent 70%)', + pointerEvents: 'none', + zIndex: 0, + }} /> + +
+ + {isMobile ? ( + /* Mobile Layout: Clean vertical hierarchy */ +
+
+

+ {partners.heading} +

+

+ {partners.subheading} +

+

+ {partners.body} +

+
+ + {/* Globe Visual */} +
+ Globe Map +
+ + {/* Grid of Logos */} +
+ {partners.logos.map((logo, idx) => ( +
+ {logo.name} +
+ ))} +
+
+ ) : ( + /* Desktop Layout: Orbital Globe Layout as per reference image */ +
+ + {/* Globe in background - Increased Size & Brightness */} + Globe Map + + {/* Center Text Panel */} +
+

+ {partners.heading} +

+ + {partners.subheading} + +

+ {partners.body} +

+
+ + {/* orbital logos with smooth continuous motion in horizontally elongated oval paths - No Skewing */} + {/* Outer Orbit - Increased size further to radiusX=520, radiusY=320 */} + + + + + + + {/* Inner Orbit - Adjusted size to radiusX=360, radiusY=225 */} + + + + + + +
+ )} +
- - {/* orbital logos with smooth continuous motion in horizontally elongated oval paths - No Skewing */} - {/* Outer Orbit - Increased size further to radiusX=520, radiusY=320 */} - - - - - - - {/* Inner Orbit - Adjusted size to radiusX=360, radiusY=225 */} - - - - - - -
- )} - -
-
+
- {/* Certifications Section */} -
-
- -

- {certifications.heading} -

-
- -
- {certifications.items.map((cert, idx) => ( - -
- {cert.alt} -
-
- ))} -
-
-
- {/* Services Section */} -
- {/* Background Ambient Glow matching screenshot */} -
- -
- {/* Left Column - Intro Panel */} - -
-

- Our Services -

- - TECHNOLOGY THAT MOVES YOUR BUSINESS FORWARD. - -

- From market leaders to high-growth innovators enterprises trust Cavin Infotech to deliver secure, scalable, and future-ready digital solutions that create measurable business value. -

-
- - {/* Navigation buttons at the bottom matching screenshot */} -
- {/* Left Button */} - - - {/* Right Button */} - -
-
- - {/* Right Column - Horizontal scroll container */} -
- -
- {services.map((service, index) => ( - - ))} -
-
-
-
-
- - {/* Why Cavin Infotech Section */} - {/* Why Cavin Infotech Section */} -
-
- {/* Section Header - Left Aligned */} -
- -

- Why Organizations choose us -

- - BUILT ON ENTERPRISE EXPERIENCE, DRIVEN BY EXECUTION. - -
-
- - {isMobile ? ( -
- {/* The Expertise Edge */} - -
-

The Expertise Edge

-
-

- Deep manufacturing domain expertise + certified SAP mastery + production-grade AI engineering. We don't just consult - we've lived your challenges. -

-
- - - {/* Speed That Sets Us Apart */} - -
-

Speed That Sets Us Apart

-
-

- In just five years, we've delivered what takes most companies decades - with clean architecture, zero bureaucracy, and exceptional quality. -

-
- - - {/* Proven Platforms, Real Impact */} - -
-

Proven Platforms, Real Impact

-
-

- PRODMAX and Nebula AI Platform are not pilots - they're delivering measurable gains in factories right now. -

-
    -
  • • Up to 30% reduction in operational overheads
  • -
  • • Real-time visibility across 100+ connected machines
  • -
  • • End-to-end traceability from raw materials to dispatch
  • -
-
- - - {/* Results We Stand By */} - -
-

Results We Stand By

-
-

- We track what matters: productivity, cost savings, OEE, ROI, and business impact. Transformation only counts when it shows in your numbers. -

-
- -
- ) : ( -
- {/* The Expertise Edge (Col 1 to 3, Row 1) */} - -
- {/* Arc overlay */} -
-
- -

- The Expertise Edge -

-
-

- Deep manufacturing domain expertise + certified SAP mastery + production-grade AI engineering. We don't just consult - we've lived your challenges. -

-
- - - {/* Speed That Sets Us Apart (Col 3 to 5, Row 1) */} - -
-
- -

- Speed That Sets Us Apart -

-
-

- In just five years, we've delivered what takes most companies decades - with clean architecture, zero bureaucracy, and exceptional quality. -

-
- - - {/* Results We Stand By Tall Card (Col 5, Row 1 & 2) */} - -
-
-

- Results We Stand By -

-

- We track what matters: productivity, cost savings, OEE, ROI, and business impact. Transformation only counts when it shows in your numbers. -

+ gap: isMobile ? '1.5rem' : '5rem', + flexWrap: 'wrap' + }}> + {certifications.items.map((cert, idx) => ( + +
+ {cert.alt} +
+
+ ))}
-
- - {/* Image Card 1 (Col 1, Row 2) */} - +
+ {/* Services Section */} +
+ {/* Background Ambient Glow matching screenshot */}
- Financial Advisers & Strategy -
- + position: 'absolute', + top: '0%', + right: '0%', + width: '700px', + height: '700px', + background: 'radial-gradient(circle at 80% 20%, rgba(30, 85, 145, 0.22) 0%, transparent 60%)', + pointerEvents: 'none', + zIndex: 0 + }} /> - {/* Proven Platforms, Real Impact (Col 2 to 4, Row 2) */} - -
-
- -

- Proven Platforms, Real Impact -

-

- PRODMAX and Nebula AI Platform are not pilots - they're delivering measurable gains in factories right now. -

-
    -
  • • Up to 30% reduction in operational overheads
  • -
  • • Real-time visibility across 100+ connected machines
  • -
  • • End-to-end traceability from raw materials to dispatch
  • -
-
- - - {/* Image Card 2 (Col 4, Row 2) */} - -
- People working together -
-
-
- )} -
- - - {/* Featured Gallery Section */} - - - - - {/* Products Suite */} -
- {/* Wave Pattern Overlay */} - -
- {/* Header - Left Aligned matching screenshot */} - -
-

- {products.title || 'Our Products Suite'} -

- - {products.eyebrow || 'ONE ECOSYSTEM. EXPONENTIAL IMPACT.'} - -
-
- - {/* Product Cards Grid */} -
- {products.items.map((item, index) => ( - - ))} -
- - {/* Sub-text below product cards */} -

- Plus many more specialized solutions: LiveWire, Nucleus, Digital Meeting Agenda, SEC, XR Workbench, TMS, and others - purpose-built for manufacturing and enterprise excellence. -

- - {/* Bottom CTA Button */} -
- -
-
-
- - {/* Insights Section */} -
-
- {/* Header */} - -
-

- {content.insights.title} -

-

- {content.insights.subtitle} -

-
- - {/* Nav Arrows */} -
- - -
-
- - {/* Carousel Container */} - -
- {insights.map((insight, idx) => ( - -
{ - e.currentTarget.style.borderColor = 'rgba(255,170,0,0.35)'; - e.currentTarget.style.boxShadow = '0 16px 48px rgba(255,170,0,0.12)'; - e.currentTarget.style.transform = 'translateY(-5px)'; - }} - onMouseLeave={e => { - e.currentTarget.style.borderColor = 'rgba(255,255,255,0.08)'; - e.currentTarget.style.boxShadow = '0 4px 30px rgba(0,0,0,0.5)'; - e.currentTarget.style.transform = 'translateY(0)'; - }} - > - {/* Full-bleed image */} - {insight.title} - - {/* Subtle top gradient so image top isn't too harsh */} -
- - {/* Frosted glass panel — pinned to bottom */} -
- {/* Category */} + {/* Left Column - Intro Panel */} + +
+

+ Our Services +

- {insight.category} + TECHNOLOGY THAT MOVES YOUR BUSINESS FORWARD. - - {/* Title */} -

- {insight.title} -

+ From market leaders to high-growth innovators enterprises trust Cavin Infotech to deliver secure, scalable, and future-ready digital solutions that create measurable business value. +

+
- {/* Read Blog */} -
+ {/* Left Button */} + + + {/* Right Button */} + +
+
+ + {/* Right Column - Horizontal scroll container */} +
+ +
- Read Blog + {services.map((service, index) => ( + + ))}
-
+
- - ))} -
- -
-
- - )} + + - {/* Brand Logo Divider Section */} -
- Cavin Infotech Logo Divider -
+ {/* Why Cavin Infotech Section */} + {/* Why Cavin Infotech Section */} +
+
+ {/* Section Header - Left Aligned */} +
+ +

+ Why Organizations choose us +

+ + BUILT ON ENTERPRISE EXPERIENCE, DRIVEN BY EXECUTION. + +
+
+ + {isMobile ? ( +
+ {/* The Expertise Edge */} + +
+

The Expertise Edge

+
+

+ Deep manufacturing domain expertise + certified SAP mastery + production-grade AI engineering. We don't just consult - we've lived your challenges. +

+
+ + + {/* Speed That Sets Us Apart */} + +
+

Speed That Sets Us Apart

+
+

+ In just five years, we've delivered what takes most companies decades - with clean architecture, zero bureaucracy, and exceptional quality. +

+
+ + + {/* Proven Platforms, Real Impact */} + +
+

Proven Platforms, Real Impact

+
+

+ PRODMAX and Nebula AI Platform are not pilots - they're delivering measurable gains in factories right now. +

+
    +
  • • Up to 30% reduction in operational overheads
  • +
  • • Real-time visibility across 100+ connected machines
  • +
  • • End-to-end traceability from raw materials to dispatch
  • +
+
+ + + {/* Results We Stand By */} + +
+

Results We Stand By

+
+

+ We track what matters: productivity, cost savings, OEE, ROI, and business impact. Transformation only counts when it shows in your numbers. +

+
+ +
+ ) : ( +
+ {/* The Expertise Edge (Col 1 to 3, Row 1) */} + +
+ {/* Arc overlay */} +
+
+ +

+ The Expertise Edge +

+
+

+ Deep manufacturing domain expertise + certified SAP mastery + production-grade AI engineering. We don't just consult - we've lived your challenges. +

+
+ + + {/* Speed That Sets Us Apart (Col 3 to 5, Row 1) */} + +
+
+ +

+ Speed That Sets Us Apart +

+
+

+ In just five years, we've delivered what takes most companies decades - with clean architecture, zero bureaucracy, and exceptional quality. +

+
+ + + {/* Results We Stand By Tall Card (Col 5, Row 1 & 2) */} + +
+
+

+ Results We Stand By +

+

+ We track what matters: productivity, cost savings, OEE, ROI, and business impact. Transformation only counts when it shows in your numbers. +

+
+
+
+ + {/* Image Card 1 (Col 1, Row 2) */} + +
+ Financial Advisers & Strategy +
+
+ + {/* Proven Platforms, Real Impact (Col 2 to 4, Row 2) */} + +
+
+ +

+ Proven Platforms, Real Impact +

+

+ PRODMAX and Nebula AI Platform are not pilots - they're delivering measurable gains in factories right now. +

+
    +
  • • Up to 30% reduction in operational overheads
  • +
  • • Real-time visibility across 100+ connected machines
  • +
  • • End-to-end traceability from raw materials to dispatch
  • +
+
+ + + {/* Image Card 2 (Col 4, Row 2) */} + +
+ People working together +
+
+
+ )} +
+
+ + {/* Featured Gallery Section */} + + + + + {/* Products Suite */} +
+ {/* Wave Pattern Overlay */} + +
+ {/* Header - Left Aligned matching screenshot */} + +
+

+ {products.title || 'Our Products Suite'} +

+ + {products.eyebrow || 'ONE ECOSYSTEM. EXPONENTIAL IMPACT.'} + +
+
+ + {/* Product Cards Grid */} +
+ {products.items.map((item, index) => ( + + ))} +
+ + {/* Sub-text below product cards */} +

+ Plus many more specialized solutions: LiveWire, Nucleus, Digital Meeting Agenda, SEC, XR Workbench, TMS, and others - purpose-built for manufacturing and enterprise excellence. +

+ + +
+
+ + {/* Insights Section */} +
+
+ {/* Header */} + +
+

+ {content.insights.title} +

+

+ {content.insights.subtitle} +

+
+ + {/* Nav Arrows */} +
+ + +
+
+ + {/* Carousel Container */} + +
+ {insights.map((insight, idx) => ( + +
{ + e.currentTarget.style.borderColor = 'rgba(255,170,0,0.35)'; + e.currentTarget.style.boxShadow = '0 16px 48px rgba(255,170,0,0.12)'; + e.currentTarget.style.transform = 'translateY(-5px)'; + }} + onMouseLeave={e => { + e.currentTarget.style.borderColor = 'rgba(255,255,255,0.08)'; + e.currentTarget.style.boxShadow = '0 4px 30px rgba(0,0,0,0.5)'; + e.currentTarget.style.transform = 'translateY(0)'; + }} + > + {/* Full-bleed image */} + {insight.title} + + {/* Subtle top gradient so image top isn't too harsh */} +
+ + {/* Frosted glass panel — pinned to bottom */} +
+ {/* Category */} + + {insight.category} + + + {/* Title */} +

+ {insight.title} +

+ + {/* Read Blog */} +
+ Read Blog +
+
+
+ + ))} +
+
+
+
+ + + )} + + {/* Brand Logo Divider Section */} +
+ Cavin Infotech Logo Divider +
{/* Close Content Wrapper */} {/* Sticky Parallax Reveal Footer */} @@ -2150,7 +2110,7 @@ export default function App({ previewMode = false }) { {/* Footer Container Padded Content */}
- + {/* CTA Banner Section */} {isMobile ? ( @@ -2169,13 +2129,13 @@ export default function App({ previewMode = false }) { }}>

- Let's Build What's Next -
Together. + Let's Build What's Next -
Together.

{footer.cta.body}

-
@@ -2317,732 +2290,757 @@ export default function App({ previewMode = false }) {
Products
-
- - {/* Social Links Column */} -
-
Social Links
-
- {(footer.social && footer.social.length ? footer.social : [ - { platform: 'Facebook', url: 'https://www.facebook.com/cavininfotech1' }, - { platform: 'X', url: 'https://x.com/cavin_infotech' }, - { platform: 'Instagram', url: 'https://www.instagram.com/cavin_infotech' }, - { platform: 'LinkedIn', url: 'https://www.linkedin.com/company/cavin-infotech/' }, - { platform: 'YouTube', url: 'https://youtube.com/@cavin_infotech' } - ]).map(({ platform, url }) => { - const paths = { - Facebook: 'M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z', - Instagram: 'M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.051.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z', - LinkedIn: 'M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z', - X: 'M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z', - YouTube: 'M23.498 6.163a3.003 3.003 0 0 0-2.11-2.11C19.53 3.545 12 3.545 12 3.545s-7.53 0-9.388.508a3.003 3.003 0 0 0-2.11 2.11C0 8.017 0 12 0 12s0 3.983.502 5.837a3.003 3.003 0 0 0 2.11 2.11c1.858.508 9.388.508 9.388.508s7.53 0 9.388-.508a3.003 3.003 0 0 0 2.11-2.11C24 15.983 24 12 24 12s0-3.983-.502-5.837zM9.545 15.568V8.432L15.818 12l-6.273 3.568z' - }; - const d = paths[platform] || paths.Facebook; - - return ( - { e.currentTarget.style.background = '#1e40af'; e.currentTarget.style.color = '#fff'; e.currentTarget.style.borderColor = '#1e40af'; }} - onMouseLeave={e => { e.currentTarget.style.background = 'rgba(30,41,59,0.08)'; e.currentTarget.style.color = '#475569'; e.currentTarget.style.borderColor = 'rgba(30,41,59,0.12)'; }} - > - - - - - ); - })} -
-
+
- {/* Legal / Copyright Bottom Bar */} -
-
- e.currentTarget.style.color = '#1e40af'} - onMouseLeave={e => e.currentTarget.style.color = '#475569'}>Privacy Policy - - e.currentTarget.style.color = '#1e40af'} - onMouseLeave={e => e.currentTarget.style.color = '#475569'}>Terms & Conditions + {/* Social Links Column */} +
+
Social Links
+
+ {(footer.social && footer.social.length ? footer.social : [ + { platform: 'Facebook', url: 'https://www.facebook.com/cavininfotech1' }, + { platform: 'X', url: 'https://x.com/cavin_infotech' }, + { platform: 'Instagram', url: 'https://www.instagram.com/cavin_infotech' }, + { platform: 'LinkedIn', url: 'https://www.linkedin.com/company/cavin-infotech/' }, + { platform: 'YouTube', url: 'https://youtube.com/@cavin_infotech' } + ]).map(({ platform, url }) => { + const paths = { + Facebook: 'M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z', + Instagram: 'M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.051.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z', + LinkedIn: 'M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z', + X: 'M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z', + YouTube: 'M23.498 6.163a3.003 3.003 0 0 0-2.11-2.11C19.53 3.545 12 3.545 12 3.545s-7.53 0-9.388.508a3.003 3.003 0 0 0-2.11 2.11C0 8.017 0 12 0 12s0 3.983.502 5.837a3.003 3.003 0 0 0 2.11 2.11c1.858.508 9.388.508 9.388.508s7.53 0 9.388-.508a3.003 3.003 0 0 0 2.11-2.11C24 15.983 24 12 24 12s0-3.983-.502-5.837zM9.545 15.568V8.432L15.818 12l-6.273 3.568z' + }; + const d = paths[platform] || paths.Facebook; + + return ( + { e.currentTarget.style.background = '#1e40af'; e.currentTarget.style.color = '#fff'; e.currentTarget.style.borderColor = '#1e40af'; }} + onMouseLeave={e => { e.currentTarget.style.background = 'rgba(30,41,59,0.08)'; e.currentTarget.style.color = '#475569'; e.currentTarget.style.borderColor = 'rgba(30,41,59,0.12)'; }} + > + + + + + ); + })}
- - Copyrights reserved to CAVIN INFOTECH -
- - {/* Careers Modal Popup */} - {isCareersOpen && !previewMode && ( + {/* Legal / Copyright Bottom Bar */}
-
- - {/* Close Button */} -
+
+ + + {/* Careers Modal Popup */ } + { + isCareersOpen && !previewMode && ( +
+
+ + {/* Close Button */} + + + {/* LEFT SIDE: "Join Our Team" Info */} +
+ {/* Blur asset overlay on left section */} + e.currentTarget.style.color = '#38bdf8'} - onMouseLeave={e => e.currentTarget.style.color = '#94a3b8'} - > - × - + /> - {/* LEFT SIDE: "Join Our Team" Info */} -
+

+ Join Our Team +

+ +
    - {/* Blur asset overlay on left section */} - - -
    -

    - Join Our Team -

    - -
      - {[ - 'Work on Challenging Projects', - 'Collaborative Global Team', - 'Continuous Growth & Learning', - 'Competitive Compensation' - ].map((item, idx) => ( -
    • - - ✓ - - {item} -
    • - ))} -
    -
    + gap: '1.25rem' + }}> + {[ + 'Work on Challenging Projects', + 'Collaborative Global Team', + 'Continuous Growth & Learning', + 'Competitive Compensation' + ].map((item, idx) => ( +
  • + + ✓ + + {item} +
  • + ))} +
+
- {/* RIGHT SIDE: Careers Form */} -
- {!showCareersAcknowledgement ? ( -
{ - e.preventDefault(); - if (!careersName.trim() || !careersEmail.trim() || !careersPhone.trim()) { - setCareersErrorMsg('Please fill in Name, Email, and Phone fields.'); - return; - } - if (!careersFile) { - setCareersErrorMsg('Please upload your resume file.'); - return; - } - if (!careersTurnstileToken) { - setCareersErrorMsg('Please complete the Cloudflare Turnstile security verification.'); - return; + {/* RIGHT SIDE: Careers Form */} +
+ {!showCareersAcknowledgement ? ( + { + e.preventDefault(); + if (!careersName.trim() || !careersEmail.trim() || !careersPhone.trim()) { + setCareersErrorMsg('Please fill in Name, Email, and Phone fields.'); + return; + } + if (!careersFile) { + setCareersErrorMsg('Please upload your resume file.'); + return; + } + if (!careersTurnstileToken) { + setCareersErrorMsg('Please complete the Cloudflare Turnstile security verification.'); + return; + } + + setIsCareersSubmitting(true); + setCareersErrorMsg(''); + + try { + const uploadData = new FormData(); + uploadData.append('type', 'careers'); + uploadData.append('name', careersName); + uploadData.append('email', careersEmail); + uploadData.append('phone', careersPhone); + if (careersFile) { + uploadData.append('resume', careersFile); + uploadData.append('resumeName', careersFile.name); } + uploadData.append('message', `New Careers Application from ${careersName}`); + uploadData.append('turnstileToken', careersTurnstileToken); - setIsCareersSubmitting(true); - setCareersErrorMsg(''); + let response = await fetch('/api/contact', { + method: 'POST', + body: uploadData + }); - try { - const uploadData = new FormData(); - uploadData.append('type', 'careers'); - uploadData.append('name', careersName); - uploadData.append('email', careersEmail); - uploadData.append('phone', careersPhone); - if (careersFile) { - uploadData.append('resume', careersFile); - uploadData.append('resumeName', careersFile.name); - } - uploadData.append('message', `New Careers Application from ${careersName}`); - uploadData.append('turnstileToken', careersTurnstileToken); - - let response = await fetch('/api/contact', { + if (!response.ok) { + response = await fetch('/api/send', { method: 'POST', body: uploadData }); - - if (!response.ok) { - response = await fetch('/api/send', { - method: 'POST', - body: uploadData - }); - } - - const resData = await response.json().catch(() => ({})); - - if (response.ok && resData.success) { - setShowCareersAcknowledgement(true); - } else { - setShowCareersAcknowledgement(true); - } - } catch (err) { - console.error('Error sending application:', err); - setShowCareersAcknowledgement(true); - } finally { - setIsCareersSubmitting(false); } - }} - style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }} - > - {careersErrorMsg && ( -
- {careersErrorMsg} -
- )} - {/* Name Input */} -
- { - setCareersName(e.target.value); - if (careersErrorMsg) setCareersErrorMsg(''); - }} - placeholder="Name" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.6rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> + const resData = await response.json().catch(() => ({})); + + if (response.ok && resData.success) { + setShowCareersAcknowledgement(true); + } else { + setShowCareersAcknowledgement(true); + } + } catch (err) { + console.error('Error sending application:', err); + setShowCareersAcknowledgement(true); + } finally { + setIsCareersSubmitting(false); + } + }} + style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }} + > + {careersErrorMsg && ( +
+ {careersErrorMsg}
+ )} - {/* Email Input */} -
- { - setCareersEmail(e.target.value); - if (careersErrorMsg) setCareersErrorMsg(''); - }} - placeholder="Email" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.6rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> -
- - {/* Phone Input */} -
- { - setCareersPhone(e.target.value); - if (careersErrorMsg) setCareersErrorMsg(''); - }} - placeholder="Phone" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.6rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> -
- - {/* File Attachment Input */} -
-
{ - e.currentTarget.style.borderColor = '#38bdf8'; - e.currentTarget.style.background = 'rgba(56, 189, 248, 0.05)'; - }} - onMouseLeave={e => { - e.currentTarget.style.borderColor = 'rgba(255, 255, 255, 0.15)'; - e.currentTarget.style.background = 'rgba(255, 255, 255, 0.01)'; - }} - > - { - const file = e.target.files[0]; - setCareersFile(file); - if (careersErrorMsg) setCareersErrorMsg(''); - const fileName = file?.name; - const labelEl = document.getElementById('file-upload-label'); - if (labelEl && fileName) { - labelEl.textContent = fileName; - } - }} - /> - - Click to upload your Resume (.pdf, .doc, .docx) - -
-
- - {/* Cloudflare Turnstile Captcha */} - { - setCareersTurnstileToken(token); + {/* Name Input */} +
+ { + setCareersName(e.target.value); if (careersErrorMsg) setCareersErrorMsg(''); }} - onExpire={() => setCareersTurnstileToken('')} - /> - - {/* Submit Button */} -
+ + {/* Email Input */} +
+ { + setCareersEmail(e.target.value); + if (careersErrorMsg) setCareersErrorMsg(''); + }} + placeholder="Email" + style={{ + width: '100%', + background: 'transparent', + border: 'none', + borderBottom: '1px solid rgba(255, 255, 255, 0.25)', + color: '#ffffff', + fontSize: '0.98rem', + padding: '0.6rem 0', + outline: 'none', + transition: 'border-color 0.3s ease', + }} + onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} + onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} + /> +
+ + {/* Phone Input */} +
+ { + setCareersPhone(e.target.value); + if (careersErrorMsg) setCareersErrorMsg(''); + }} + placeholder="Phone" + style={{ + width: '100%', + background: 'transparent', + border: 'none', + borderBottom: '1px solid rgba(255, 255, 255, 0.25)', + color: '#ffffff', + fontSize: '0.98rem', + padding: '0.6rem 0', + outline: 'none', + transition: 'border-color 0.3s ease', + }} + onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} + onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} + /> +
+ + {/* File Attachment Input */} +
+
{ - if (!isCareersSubmitting) { - e.currentTarget.style.transform = 'translateY(-2px)'; - e.currentTarget.style.boxShadow = '0 15px 35px rgba(255, 255, 255, 0.3)'; - } + e.currentTarget.style.borderColor = '#38bdf8'; + e.currentTarget.style.background = 'rgba(56, 189, 248, 0.05)'; }} onMouseLeave={e => { - if (!isCareersSubmitting) { - e.currentTarget.style.transform = 'translateY(0)'; - e.currentTarget.style.boxShadow = '0 10px 25px rgba(255, 255, 255, 0.15)'; - } + e.currentTarget.style.borderColor = 'rgba(255, 255, 255, 0.15)'; + e.currentTarget.style.background = 'rgba(255, 255, 255, 0.01)'; }} > - {isCareersSubmitting ? 'Submitting...' : 'Submit Application'} - - - ) : ( - /* Acknowledgement Panel */ -
-
- - - + { + const file = e.target.files[0]; + setCareersFile(file); + if (careersErrorMsg) setCareersErrorMsg(''); + const fileName = file?.name; + const labelEl = document.getElementById('file-upload-label'); + if (labelEl && fileName) { + labelEl.textContent = fileName; + } + }} + /> + + Click to upload your Resume (.pdf, .doc, .docx) +
-

- Application Received! -

-

- Thank you for applying to Cavin Infotech. We have received your resume and details successfully. Our recruitment team will review your application and contact you if your qualifications match our current needs. -

-
- )} -
+ + {/* Cloudflare Turnstile Captcha */} + { + setCareersTurnstileToken(token); + if (careersErrorMsg) setCareersErrorMsg(''); + }} + onExpire={() => setCareersTurnstileToken('')} + /> + + {/* Submit Button */} + + + ) : ( + /* Acknowledgement Panel */ +
+
+ + + +
+

+ Application Received! +

+

+ Thank you for applying to Cavin Infotech. We have received your resume and details successfully. Our recruitment team will review your application and contact you if your qualifications match our current needs. +

+ +
+ )}
- )} +
+ ) + } - {/* Book a Strategy Call Modal Popup */} - {isStrategyOpen && !previewMode && ( + {/* Book a Strategy Call Modal Popup */ } + { + isStrategyOpen && !previewMode && ( +
-
- - {/* Close Button */} - + + {/* LEFT SIDE: "How We Can Help?" Info */} +
+ {/* Blur asset overlay on left section */} + e.currentTarget.style.color = '#38bdf8'} - onMouseLeave={e => e.currentTarget.style.color = '#94a3b8'} - > - × - + /> - {/* LEFT SIDE: "How We Can Help?" Info */} -
+

+ How We Can Help? +

+ +
    - {/* Blur asset overlay on left section */} - - -
    -

    - How We Can Help? -

    - -
      - {[ - 'Tailored Strategy Session', - 'Expert Guidance', - 'Technical Architecture Review', - 'Value-Added Partnership' - ].map((item, idx) => ( -
    • - - ✓ - - {item} -
    • - ))} -
    -
    + gap: '1.25rem' + }}> + {[ + 'Tailored Strategy Session', + 'Expert Guidance', + 'Technical Architecture Review', + 'Value-Added Partnership' + ].map((item, idx) => ( +
  • + + ✓ + + {item} +
  • + ))} +
+
- {/* RIGHT SIDE: Strategy call Form */} -
- {!showStrategyAcknowledgement ? ( -
{ - e.preventDefault(); - if (!strategyName.trim() || !strategyEmail.trim() || !strategyMobile.trim() || !strategyDesignation.trim() || !strategyDate.trim() || !strategyTime.trim()) { - setStrategyErrorMsg('Please fill in all required fields including Date and Time Slot.'); - return; - } - if (!strategyTurnstileToken) { - setStrategyErrorMsg('Please complete the Cloudflare Turnstile security verification.'); - return; - } + {/* RIGHT SIDE: Strategy call Form */} +
+ {!showStrategyAcknowledgement ? ( + { + e.preventDefault(); + if (!strategyName.trim() || !strategyEmail.trim() || !strategyMobile.trim() || !strategyDesignation.trim() || !strategyDate.trim() || !strategyTime.trim()) { + setStrategyErrorMsg('Please fill in all required fields including Date and Time Slot.'); + return; + } + if (!strategyTurnstileToken) { + setStrategyErrorMsg('Please complete the Cloudflare Turnstile security verification.'); + return; + } - setIsStrategySubmitting(true); - setStrategyErrorMsg(''); + setIsStrategySubmitting(true); + setStrategyErrorMsg(''); - const selectedInterests = Object.keys(strategyInterests).filter(key => strategyInterests[key]).join(', '); - const formattedDateTime = `${strategyDate} (${strategyTime})`; + const selectedInterests = Object.keys(strategyInterests).filter(key => strategyInterests[key]).join(', '); + const formattedDateTime = `${strategyDate} (${strategyTime})`; - try { - let response = await fetch('/api/contact', { + try { + let response = await fetch('/api/contact', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + type: 'strategy', + name: strategyName, + email: strategyEmail, + phone: strategyMobile, + designation: strategyDesignation, + dateTime: formattedDateTime, + interests: selectedInterests || 'General Consultation', + message: `New Strategy Call Request from ${strategyName}`, + turnstileToken: strategyTurnstileToken + }) + }); + + if (!response.ok) { + response = await fetch('/api/send', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ @@ -3057,375 +3055,359 @@ export default function App({ previewMode = false }) { turnstileToken: strategyTurnstileToken }) }); - - if (!response.ok) { - response = await fetch('/api/send', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - type: 'strategy', - name: strategyName, - email: strategyEmail, - phone: strategyMobile, - designation: strategyDesignation, - dateTime: formattedDateTime, - interests: selectedInterests || 'General Consultation', - message: `New Strategy Call Request from ${strategyName}`, - turnstileToken: strategyTurnstileToken - }) - }); - } - - const resData = await response.json().catch(() => ({})); - - if (response.ok && resData.success) { - setShowStrategyAcknowledgement(true); - } else { - setShowStrategyAcknowledgement(true); - } - } catch (err) { - console.error('Error scheduling strategy session:', err); - setShowStrategyAcknowledgement(true); - } finally { - setIsStrategySubmitting(false); } - }} - style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }} - > - {strategyErrorMsg && ( -
- {strategyErrorMsg} -
- )} - {/* Name & Email Group */} + const resData = await response.json().catch(() => ({})); + + if (response.ok && resData.success) { + setShowStrategyAcknowledgement(true); + } else { + setShowStrategyAcknowledgement(true); + } + } catch (err) { + console.error('Error scheduling strategy session:', err); + setShowStrategyAcknowledgement(true); + } finally { + setIsStrategySubmitting(false); + } + }} + style={{ display: 'flex', flexDirection: 'column', gap: '1.5rem' }} + > + {strategyErrorMsg && (
-
- { - setStrategyName(e.target.value); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - placeholder="Name" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.5rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> -
+ {strategyErrorMsg} +
+ )} -
- { - setStrategyEmail(e.target.value); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - placeholder="Email" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.5rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> -
+ {/* Name & Email Group */} +
+
+ { + setStrategyName(e.target.value); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + placeholder="Name" + style={{ + width: '100%', + background: 'transparent', + border: 'none', + borderBottom: '1px solid rgba(255, 255, 255, 0.25)', + color: '#ffffff', + fontSize: '0.98rem', + padding: '0.5rem 0', + outline: 'none', + transition: 'border-color 0.3s ease', + }} + onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} + onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} + />
- {/* Phone & Designation Group */} -
-
- { - setStrategyMobile(e.target.value); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - placeholder="Mobile" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.5rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> -
- -
- { - setStrategyDesignation(e.target.value); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - placeholder="Designation" - style={{ - width: '100%', - background: 'transparent', - border: 'none', - borderBottom: '1px solid rgba(255, 255, 255, 0.25)', - color: '#ffffff', - fontSize: '0.98rem', - padding: '0.5rem 0', - outline: 'none', - transition: 'border-color 0.3s ease', - }} - onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} - onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} - /> -
+
+ { + setStrategyEmail(e.target.value); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + placeholder="Email" + style={{ + width: '100%', + background: 'transparent', + border: 'none', + borderBottom: '1px solid rgba(255, 255, 255, 0.25)', + color: '#ffffff', + fontSize: '0.98rem', + padding: '0.5rem 0', + outline: 'none', + transition: 'border-color 0.3s ease', + }} + onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} + onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} + />
- - {/* Date & Time Slot (Glassmorphic Custom Controls) */} -
- {/* Glassmorphic Date Picker */} -
- { - setStrategyDate(newDate); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - placeholder="Preferred Date" - /> -
- - {/* Glassmorphic Time Slot Select */} -
- { - setStrategyTime(newTime); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - placeholder="Preferred Time Slot" - options={[ - { value: '09:00 AM - 10:00 AM', label: '09:00 AM - 10:00 AM' }, - { value: '10:00 AM - 11:00 AM', label: '10:00 AM - 11:00 AM' }, - { value: '11:00 AM - 12:00 PM', label: '11:00 AM - 12:00 PM' }, - { value: '02:00 PM - 03:00 PM', label: '02:00 PM - 03:00 PM' }, - { value: '03:00 PM - 04:00 PM', label: '03:00 PM - 04:00 PM' }, - { value: '04:00 PM - 05:00 PM', label: '04:00 PM - 05:00 PM' }, - { value: '05:00 PM - 06:00 PM', label: '05:00 PM - 06:00 PM' } - ]} - /> -
-
- - {/* Areas of Interest Checkboxes */} -
- -
- {[ - 'AI & Analytics', - 'SAP Services', - 'XR Platforms', - 'Smart Factory', - 'Cloud Engineering', - 'Enterprise Software' - ].map((interest) => ( - - ))} -
-
- - {/* Cloudflare Turnstile Captcha */} - { - setStrategyTurnstileToken(token); - if (strategyErrorMsg) setStrategyErrorMsg(''); - }} - onExpire={() => setStrategyTurnstileToken('')} - /> - - {/* Submit Button */} - - - ) : ( - /* Acknowledgement Panel */ -
-
- - - -
-

- Strategy Session Scheduled! -

-

- Thank you for booking a Strategy Call. We have successfully received your information and areas of interest. A technology consultant from Cavin Infotech will reach out to you within 24 hours with an invitation link and slot confirmation. -

-
- )} -
+ + {/* Phone & Designation Group */} +
+
+ { + setStrategyMobile(e.target.value); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + placeholder="Mobile" + style={{ + width: '100%', + background: 'transparent', + border: 'none', + borderBottom: '1px solid rgba(255, 255, 255, 0.25)', + color: '#ffffff', + fontSize: '0.98rem', + padding: '0.5rem 0', + outline: 'none', + transition: 'border-color 0.3s ease', + }} + onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} + onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} + /> +
+ +
+ { + setStrategyDesignation(e.target.value); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + placeholder="Designation" + style={{ + width: '100%', + background: 'transparent', + border: 'none', + borderBottom: '1px solid rgba(255, 255, 255, 0.25)', + color: '#ffffff', + fontSize: '0.98rem', + padding: '0.5rem 0', + outline: 'none', + transition: 'border-color 0.3s ease', + }} + onFocus={e => e.currentTarget.style.borderBottomColor = '#38bdf8'} + onBlur={e => e.currentTarget.style.borderBottomColor = 'rgba(255, 255, 255, 0.25)'} + /> +
+
+ + {/* Date & Time Slot (Glassmorphic Custom Controls) */} +
+ {/* Glassmorphic Date Picker */} +
+ { + setStrategyDate(newDate); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + placeholder="Preferred Date" + /> +
+ + {/* Glassmorphic Time Slot Select */} +
+ { + setStrategyTime(newTime); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + placeholder="Preferred Time Slot" + options={[ + { value: '09:00 AM - 10:00 AM', label: '09:00 AM - 10:00 AM' }, + { value: '10:00 AM - 11:00 AM', label: '10:00 AM - 11:00 AM' }, + { value: '11:00 AM - 12:00 PM', label: '11:00 AM - 12:00 PM' }, + { value: '02:00 PM - 03:00 PM', label: '02:00 PM - 03:00 PM' }, + { value: '03:00 PM - 04:00 PM', label: '03:00 PM - 04:00 PM' }, + { value: '04:00 PM - 05:00 PM', label: '04:00 PM - 05:00 PM' }, + { value: '05:00 PM - 06:00 PM', label: '05:00 PM - 06:00 PM' } + ]} + /> +
+
+ + {/* Areas of Interest Checkboxes */} +
+ +
+ {[ + 'AI & Analytics', + 'SAP Services', + 'XR Platforms', + 'Smart Factory', + 'Cloud Engineering', + 'Enterprise Software' + ].map((interest) => ( + + ))} +
+
+ + {/* Cloudflare Turnstile Captcha */} + { + setStrategyTurnstileToken(token); + if (strategyErrorMsg) setStrategyErrorMsg(''); + }} + onExpire={() => setStrategyTurnstileToken('')} + /> + + {/* Submit Button */} + + + ) : ( + /* Acknowledgement Panel */ +
+
+ + + +
+

+ Strategy Session Scheduled! +

+

+ Thank you for booking a Strategy Call. We have successfully received your information and areas of interest. A technology consultant from Cavin Infotech will reach out to you within 24 hours with an invitation link and slot confirmation. +

+ +
+ )}
- )} -
+
+ ) + } +
); } diff --git a/src/components/FeaturedGallery.jsx b/src/components/FeaturedGallery.jsx index a42e0b0..f5b2e2b 100644 --- a/src/components/FeaturedGallery.jsx +++ b/src/components/FeaturedGallery.jsx @@ -52,47 +52,7 @@ export default function FeaturedGallery({ gallery }) { setActiveIdx={setActiveGalleryIndex} /> - {/* Bottom CTA Button matching design screenshot */} -
- -
+
);