diff --git a/package-lock.json b/package-lock.json index 12d01cf..4661dba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "jsonwebtoken": "^9.0.3", "lucide-react": "^1.18.0", "multer": "^2.2.0", + "nodemailer": "^9.0.3", "react": "^19.2.6", "react-dom": "^19.2.6" }, @@ -2867,6 +2868,15 @@ "node": ">=18" } }, + "node_modules/nodemailer": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-9.0.3.tgz", + "integrity": "sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", diff --git a/package.json b/package.json index c15608a..c2c00b0 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "jsonwebtoken": "^9.0.3", "lucide-react": "^1.18.0", "multer": "^2.2.0", + "nodemailer": "^9.0.3", "react": "^19.2.6", "react-dom": "^19.2.6" }, diff --git a/public/assets/Background pattern About Us Hero section.svg b/public/assets/Background pattern About Us Hero section.svg new file mode 100644 index 0000000..650a712 --- /dev/null +++ b/public/assets/Background pattern About Us Hero section.svg @@ -0,0 +1,2193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Bg Our Products.svg b/public/assets/Bg Our Products.svg new file mode 100644 index 0000000..f7216b4 --- /dev/null +++ b/public/assets/Bg Our Products.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/Bg Case Studies.svg b/public/assets/Bg Case Studies.svg new file mode 100644 index 0000000..32419c9 --- /dev/null +++ b/public/assets/Bg Case Studies.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/Character Left mid.svg b/public/assets/Character Left mid.svg new file mode 100644 index 0000000..fd84cdd --- /dev/null +++ b/public/assets/Character Left mid.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Character Right mid.svg b/public/assets/Character Right mid.svg new file mode 100644 index 0000000..4c0ab33 --- /dev/null +++ b/public/assets/Character Right mid.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/Character Right.svg b/public/assets/Character Right.svg new file mode 100644 index 0000000..0c663b8 --- /dev/null +++ b/public/assets/Character Right.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/Character Shadow Left.svg b/public/assets/Character Shadow Left.svg new file mode 100644 index 0000000..e48864b --- /dev/null +++ b/public/assets/Character Shadow Left.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/Character Shadow left mid.svg b/public/assets/Character Shadow left mid.svg new file mode 100644 index 0000000..503bfc7 --- /dev/null +++ b/public/assets/Character Shadow left mid.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/Character Shadow mid.svg b/public/assets/Character Shadow mid.svg new file mode 100644 index 0000000..c35a0b7 --- /dev/null +++ b/public/assets/Character Shadow mid.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/Character Shadow right mid.svg b/public/assets/Character Shadow right mid.svg new file mode 100644 index 0000000..3fdbf6b --- /dev/null +++ b/public/assets/Character Shadow right mid.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/Character Shadow right.svg b/public/assets/Character Shadow right.svg new file mode 100644 index 0000000..abf1d48 --- /dev/null +++ b/public/assets/Character Shadow right.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/Character left.svg b/public/assets/Character left.svg new file mode 100644 index 0000000..89eaec2 --- /dev/null +++ b/public/assets/Character left.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/Character mid.svg b/public/assets/Character mid.svg new file mode 100644 index 0000000..37a4cfc --- /dev/null +++ b/public/assets/Character mid.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/assets/Circle point.svg b/public/assets/Circle point.svg new file mode 100644 index 0000000..1f7e0f9 --- /dev/null +++ b/public/assets/Circle point.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/Ellipse blurred.svg b/public/assets/Ellipse blurred.svg new file mode 100644 index 0000000..b16a245 --- /dev/null +++ b/public/assets/Ellipse blurred.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/assets/Left mid.svg b/public/assets/Left mid.svg new file mode 100644 index 0000000..cfe680f --- /dev/null +++ b/public/assets/Left mid.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Left.svg b/public/assets/Left.svg new file mode 100644 index 0000000..14fa553 --- /dev/null +++ b/public/assets/Left.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Mid.svg b/public/assets/Mid.svg new file mode 100644 index 0000000..0851ea8 --- /dev/null +++ b/public/assets/Mid.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Our Products Bg.svg b/public/assets/Our Products Bg.svg new file mode 100644 index 0000000..efed37f --- /dev/null +++ b/public/assets/Our Products Bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/Path Line.svg b/public/assets/Path Line.svg new file mode 100644 index 0000000..00b5a7a --- /dev/null +++ b/public/assets/Path Line.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Right mid.svg b/public/assets/Right mid.svg new file mode 100644 index 0000000..229d1d8 --- /dev/null +++ b/public/assets/Right mid.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Right.svg b/public/assets/Right.svg new file mode 100644 index 0000000..6b7fcec --- /dev/null +++ b/public/assets/Right.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/Sparkle.png b/public/assets/Sparkle.png new file mode 100644 index 0000000..e7749a2 Binary files /dev/null and b/public/assets/Sparkle.png differ diff --git a/public/assets/Spotlight vector.svg b/public/assets/Spotlight vector.svg new file mode 100644 index 0000000..f87633a --- /dev/null +++ b/public/assets/Spotlight vector.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/assets/Wave Pattern 2.svg b/public/assets/Wave Pattern 2.svg new file mode 100644 index 0000000..52a74a2 --- /dev/null +++ b/public/assets/Wave Pattern 2.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/assets/What we Believe 01.png b/public/assets/What we Believe 01.png new file mode 100644 index 0000000..82c5675 Binary files /dev/null and b/public/assets/What we Believe 01.png differ diff --git a/public/assets/What we Believe 02.png b/public/assets/What we Believe 02.png new file mode 100644 index 0000000..f42f06d Binary files /dev/null and b/public/assets/What we Believe 02.png differ diff --git a/public/assets/What we Believe 03.png b/public/assets/What we Believe 03.png new file mode 100644 index 0000000..aa6361f Binary files /dev/null and b/public/assets/What we Believe 03.png differ diff --git a/public/assets/What we Believe 04.png b/public/assets/What we Believe 04.png new file mode 100644 index 0000000..e636abf Binary files /dev/null and b/public/assets/What we Believe 04.png differ diff --git a/public/assets/What we Believe 05.png b/public/assets/What we Believe 05.png new file mode 100644 index 0000000..a62cf33 Binary files /dev/null and b/public/assets/What we Believe 05.png differ diff --git a/public/assets/case study bg.svg b/public/assets/case study bg.svg new file mode 100644 index 0000000..599e8ef --- /dev/null +++ b/public/assets/case study bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/assets/highlight card blur items 01.svg b/public/assets/highlight card blur items 01.svg new file mode 100644 index 0000000..9f4ac40 --- /dev/null +++ b/public/assets/highlight card blur items 01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/assets/highlight card blur items 02.svg b/public/assets/highlight card blur items 02.svg new file mode 100644 index 0000000..25e0701 --- /dev/null +++ b/public/assets/highlight card blur items 02.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/assets/usha portrait.svg b/public/assets/usha portrait.svg new file mode 100644 index 0000000..5ccc027 --- /dev/null +++ b/public/assets/usha portrait.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/server/db.js b/server/db.js index c500285..880c32a 100644 --- a/server/db.js +++ b/server/db.js @@ -79,3 +79,21 @@ export function updateAdminPassword(passwordHash) { admin.passwordHash = passwordHash; writeJson(ADMIN_FILE, admin); } + +const LEADS_FILE = path.join(DATA_DIR, 'contact-leads.json'); + +export function saveLead(leadData) { + const leads = readJson(LEADS_FILE, []); + const newLead = { + id: `lead_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`, + ...leadData, + createdAt: new Date().toISOString() + }; + leads.unshift(newLead); + writeJson(LEADS_FILE, leads); + return newLead; +} + +export function getLeads() { + return readJson(LEADS_FILE, []); +} diff --git a/server/index.js b/server/index.js index 316bf74..d373b5d 100644 --- a/server/index.js +++ b/server/index.js @@ -8,6 +8,7 @@ import { initDb } from './db.js'; import authRoutes from './routes/auth.js'; import contentRoutes from './routes/content.js'; import uploadRoutes from './routes/upload.js'; +import contactRoutes from './routes/contact.js'; import multer from 'multer'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -49,6 +50,8 @@ function mountApp(base) { app.use(`${prefix}/api/auth`, authRoutes); app.use(`${prefix}/api/content`, contentRoutes); app.use(`${prefix}/api/upload`, uploadRoutes); + app.use(`${prefix}/api/contact`, contactRoutes); + app.use(`${prefix}/api/send`, contactRoutes); if (serveStatic) { app.use(prefix || '/', express.static(distDir)); diff --git a/server/routes/contact.js b/server/routes/contact.js new file mode 100644 index 0000000..d431c1f --- /dev/null +++ b/server/routes/contact.js @@ -0,0 +1,75 @@ +import express from 'express'; +import { saveLead, getLeads } from '../db.js'; +import { sendContactEmail } from '../services/mailService.js'; + +const router = express.Router(); + +// POST /api/contact - Handle Contact Us Form submission via SMTP +router.post('/', async (req, res) => { + try { + const { name, email, phone, mobile, subject, message, interests, type } = req.body; + + const contactName = name?.trim(); + const contactEmail = email?.trim(); + const contactPhone = (phone || mobile || '').trim(); + const contactSubject = (subject || interests || type || 'General Inquiry').trim(); + const contactMessage = (message || req.body.comments || '').trim(); + + if (!contactName || !contactEmail) { + return res.status(400).json({ error: 'Name and Email are required.' }); + } + + // Save lead record in database + const lead = saveLead({ + name: contactName, + email: contactEmail, + phone: contactPhone, + subject: contactSubject, + message: contactMessage, + type: type || 'contact' + }); + + // Attempt sending email via SMTP service + const mailResult = await sendContactEmail({ + name: contactName, + email: contactEmail, + phone: contactPhone, + subject: contactSubject, + message: contactMessage + }); + + if (!mailResult.success) { + // If SMTP is not yet configured or fails, return 200 with lead saved & warning + return res.status(200).json({ + success: true, + saved: true, + leadId: lead.id, + smtpError: mailResult.error, + message: 'Your message was saved successfully. Note: SMTP email dispatch requires SMTP credentials in .env.' + }); + } + + return res.status(200).json({ + success: true, + saved: true, + leadId: lead.id, + messageId: mailResult.messageId, + message: 'Message sent successfully via SMTP!' + }); + } catch (error) { + console.error('[Contact Route Error]', error); + return res.status(500).json({ error: error.message || 'Internal Server Error' }); + } +}); + +// GET /api/contact/leads - Retrieve saved contact leads +router.get('/leads', (_req, res) => { + try { + const leads = getLeads(); + return res.json({ success: true, leads }); + } catch (error) { + return res.status(500).json({ error: error.message }); + } +}); + +export default router; diff --git a/server/seed/default-content.json b/server/seed/default-content.json index 0c6866b..c584a71 100644 --- a/server/seed/default-content.json +++ b/server/seed/default-content.json @@ -246,18 +246,16 @@ { "label": "Our Services", "href": "#services" } ], "productLinks": [ - { "label": "PRODMAX", "href": "#products" }, - { "label": "Budgie HRMS", "href": "#products" }, - { "label": "EVIDO", "href": "#products" } + { "label": "Nebula AI platform", "href": "#products" }, + { "label": "Prodmax", "href": "#products" }, + { "label": "Budgie", "href": "#products" } ], "social": [ - { "platform": "Facebook", "url": "#" }, - { "platform": "Instagram", "url": "#" }, - { "platform": "LinkedIn", "url": "#" }, - { "platform": "Telegram", "url": "#" }, - { "platform": "WhatsApp", "url": "#" }, - { "platform": "X", "url": "#" }, - { "platform": "YouTube", "url": "#" } + { "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" } ], "legal": [ { "label": "Privacy Policy", "href": "#" }, diff --git a/server/services/mailService.js b/server/services/mailService.js new file mode 100644 index 0000000..9783efe --- /dev/null +++ b/server/services/mailService.js @@ -0,0 +1,119 @@ +import nodemailer from 'nodemailer'; + +/** + * Creates and returns a nodemailer SMTP transporter using environment variables. + */ +export function createSmtpTransporter() { + const host = process.env.SMTP_HOST; + const port = parseInt(process.env.SMTP_PORT || '465', 10); + const secure = process.env.SMTP_SECURE === 'true' || port === 465; + const user = process.env.SMTP_USER; + const pass = process.env.SMTP_PASS; + + if (!host || !user || !pass) { + return null; + } + + return nodemailer.createTransport({ + host, + port, + secure, + auth: { + user, + pass + }, + tls: { + rejectUnauthorized: false + } + }); +} + +/** + * Sends a contact form email via SMTP using nodemailer. + */ +export async function sendContactEmail({ name, email, phone, subject, message }) { + const transporter = createSmtpTransporter(); + + const toEmail = process.env.SMTP_TO || process.env.SMTP_USER || 'info@cavinfotech.com'; + const fromEmail = process.env.SMTP_FROM || `"Cavin Infotech Contact Form" <${process.env.SMTP_USER || 'info@cavinfotech.com'}>`; + + const mailSubject = `[Contact Inquiry] ${subject ? subject : `New Inquiry from ${name}`}`; + + const htmlContent = ` +
+
+

Cavin Infotech

+

New Website Contact Form Inquiry

+
+ +
+ + + + + + + + + + + + + + + + + +
Name:${name}
Email:${email}
Phone No:${phone || 'Not provided'}
Subject:${subject || 'General Inquiry'}
+ +
+

Message:

+

${message}

+
+
+ +
+ Submitted on ${new Date().toLocaleString()} from Cavin Infotech Contact Us Page +
+
+ `; + + const textContent = ` +New Contact Inquiry - Cavin Infotech + +Name: ${name} +Email: ${email} +Phone: ${phone || 'Not provided'} +Subject: ${subject || 'General Inquiry'} + +Message: +${message} + +Submitted on: ${new Date().toLocaleString()} + `; + + if (!transporter) { + console.warn('[SMTP Service] SMTP credentials not set in environment (SMTP_HOST, SMTP_USER, SMTP_PASS).'); + return { + success: false, + error: 'SMTP credentials not configured on the server. Please set SMTP_HOST, SMTP_USER, and SMTP_PASS in .env file.' + }; + } + + try { + const info = await transporter.sendMail({ + from: fromEmail, + to: toEmail, + replyTo: `"${name}" <${email}>`, + subject: mailSubject, + text: textContent, + html: htmlContent + }); + + console.log('[SMTP Service] Contact email sent via SMTP:', info.messageId); + return { success: true, messageId: info.messageId }; + } catch (err) { + console.error('[SMTP Service] Failed to send email via SMTP:', err); + return { success: false, error: err.message || 'SMTP sending failed' }; + } +} diff --git a/src/App.jsx b/src/App.jsx index a9add95..28eed90 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -8,6 +8,7 @@ import ServiceDial from './components/ServiceDial'; import FeaturedGallery from './components/FeaturedGallery'; import ProductCard from './components/ProductCard'; import ContactSection from './components/ContactSection'; +import AboutUsPage from './components/AboutUsPage'; // Reusable Scroll Reveal Wrapper with Reduced Motion Support function Reveal({ children, delay = 0, style }) { @@ -377,7 +378,9 @@ export default function App({ previewMode = false }) { const [activeSection, setActiveSection] = useState('home'); const [currentPage, setCurrentPage] = useState(() => { const hash = typeof window !== 'undefined' ? window.location.hash : ''; - return hash === '#contact' || hash === '#contactus' ? 'contact' : 'home'; + if (hash === '#contact' || hash === '#contactus') return 'contact'; + if (hash === '#about' || hash === '#aboutus') return 'about'; + return 'home'; }); useEffect(() => { @@ -387,6 +390,10 @@ export default function App({ previewMode = false }) { setCurrentPage('contact'); setActiveSection('contactus'); window.scrollTo({ top: 0, behavior: 'smooth' }); + } else if (hash === '#about' || hash === '#aboutus') { + setCurrentPage('about'); + setActiveSection('aboutus'); + window.scrollTo({ top: 0, behavior: 'smooth' }); } else if (hash === '#home' || hash === '') { setCurrentPage('home'); } @@ -481,6 +488,7 @@ export default function App({ previewMode = false }) { const getActiveNavItem = () => { if (currentPage === 'contact') return 'Contact Us'; + if (currentPage === 'about') return 'About Us'; switch (activeSection) { case 'home': return 'Home'; @@ -560,6 +568,14 @@ export default function App({ previewMode = false }) { return; } + if (item === 'About Us') { + setCurrentPage('about'); + setActiveSection('aboutus'); + window.location.hash = 'aboutus'; + window.scrollTo({ top: 0, behavior: 'smooth' }); + return; + } + const sectionMap = { Home: 'home', 'About Us': 'aboutus', @@ -820,6 +836,8 @@ export default function App({ previewMode = false }) { )} {currentPage === 'contact' ? ( setIsStrategyOpen(true)} /> + ) : currentPage === 'about' ? ( + setIsStrategyOpen(true)} onNavigate={handleNavClick} /> ) : ( <> {/* Main Homepage Content */} @@ -1788,32 +1806,36 @@ export default function App({ previewMode = false }) { {/* Products Suite */}
- {/* Soft gradient from bottom to top: light bottom fading to 0 opacity at top */} -
+ {/* Wave Pattern Overlay */} +
{/* Header - Left Aligned matching screenshot */}
-

+

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

- + {products.eyebrow || 'ONE ECOSYSTEM. EXPONENTIAL IMPACT.'}
@@ -1827,7 +1849,7 @@ export default function App({ previewMode = false }) { alignItems: 'stretch', position: 'relative', zIndex: 10, - marginBottom: '4rem' + marginBottom: '2.5rem' }}> {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 */} +
+ +
@@ -2069,20 +2141,21 @@ export default function App({ previewMode = false }) {
-

+

Let's Build What's Next -
Together.

-

+

{footer.cta.body}

@@ -2098,45 +2171,14 @@ export default function App({ previewMode = false }) { fontSize: '0.88rem', fontWeight: 600, cursor: 'pointer', + width: '100%', + textAlign: 'center' }} > {footer.cta.primaryButton} - {/* Secondary button commented out per user request - - */}
- - {/* Phone mockup container on mobile */} -
- Phone preview -
) : ( @@ -2209,34 +2251,6 @@ export default function App({ previewMode = false }) { > {footer.cta.primaryButton} - {/* Secondary button commented out per user request - - */} @@ -2247,20 +2261,20 @@ export default function App({ previewMode = false }) {
{/* Quick Links */}
-
Quick Links
-
+ + {/* 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 +
+ + Copyrights reserved to CAVIN INFOTECH + +
diff --git a/src/assets/Background pattern About Us Hero section.svg b/src/assets/Background pattern About Us Hero section.svg new file mode 100644 index 0000000..650a712 --- /dev/null +++ b/src/assets/Background pattern About Us Hero section.svg @@ -0,0 +1,2193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Bg Our Products.svg b/src/assets/Bg Our Products.svg new file mode 100644 index 0000000..2bb49ec --- /dev/null +++ b/src/assets/Bg Our Products.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/Bg Case Studies.svg b/src/assets/Bg Case Studies.svg new file mode 100644 index 0000000..c9fb670 --- /dev/null +++ b/src/assets/Bg Case Studies.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/Circle point.svg b/src/assets/Circle point.svg new file mode 100644 index 0000000..1f7e0f9 --- /dev/null +++ b/src/assets/Circle point.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/Ellipse blurred.svg b/src/assets/Ellipse blurred.svg new file mode 100644 index 0000000..b16a245 --- /dev/null +++ b/src/assets/Ellipse blurred.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/Left mid.svg b/src/assets/Left mid.svg new file mode 100644 index 0000000..cfe680f --- /dev/null +++ b/src/assets/Left mid.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Left.svg b/src/assets/Left.svg new file mode 100644 index 0000000..14fa553 --- /dev/null +++ b/src/assets/Left.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Mid.svg b/src/assets/Mid.svg new file mode 100644 index 0000000..0851ea8 --- /dev/null +++ b/src/assets/Mid.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Path Line.svg b/src/assets/Path Line.svg new file mode 100644 index 0000000..00b5a7a --- /dev/null +++ b/src/assets/Path Line.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Right mid.svg b/src/assets/Right mid.svg new file mode 100644 index 0000000..229d1d8 --- /dev/null +++ b/src/assets/Right mid.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Right.svg b/src/assets/Right.svg new file mode 100644 index 0000000..6b7fcec --- /dev/null +++ b/src/assets/Right.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/Spotlight vector.svg b/src/assets/Spotlight vector.svg new file mode 100644 index 0000000..f87633a --- /dev/null +++ b/src/assets/Spotlight vector.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/Wave Pattern 2.svg b/src/assets/Wave Pattern 2.svg new file mode 100644 index 0000000..52a74a2 --- /dev/null +++ b/src/assets/Wave Pattern 2.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/What we Believe 04.png b/src/assets/What we Believe 04.png new file mode 100644 index 0000000..e636abf Binary files /dev/null and b/src/assets/What we Believe 04.png differ diff --git a/src/assets/What we Believe 01.png b/src/assets/What we Believe 01.png new file mode 100644 index 0000000..82c5675 Binary files /dev/null and b/src/assets/What we Believe 01.png differ diff --git a/src/assets/What we Believe 02.png b/src/assets/What we Believe 02.png new file mode 100644 index 0000000..f42f06d Binary files /dev/null and b/src/assets/What we Believe 02.png differ diff --git a/src/assets/What we Believe 03.png b/src/assets/What we Believe 03.png new file mode 100644 index 0000000..aa6361f Binary files /dev/null and b/src/assets/What we Believe 03.png differ diff --git a/src/assets/What we Believe 05.png b/src/assets/What we Believe 05.png new file mode 100644 index 0000000..a62cf33 Binary files /dev/null and b/src/assets/What we Believe 05.png differ diff --git a/src/assets/highlight card blur items 01.svg b/src/assets/highlight card blur items 01.svg new file mode 100644 index 0000000..9f4ac40 --- /dev/null +++ b/src/assets/highlight card blur items 01.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/highlight card blur items 02.svg b/src/assets/highlight card blur items 02.svg new file mode 100644 index 0000000..25e0701 --- /dev/null +++ b/src/assets/highlight card blur items 02.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/usha portrait.svg b/src/assets/usha portrait.svg new file mode 100644 index 0000000..5ccc027 --- /dev/null +++ b/src/assets/usha portrait.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/components/AboutUsPage.jsx b/src/components/AboutUsPage.jsx new file mode 100644 index 0000000..5c9c68f --- /dev/null +++ b/src/components/AboutUsPage.jsx @@ -0,0 +1,1399 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import { assetUrl } from '../lib/assetUrl'; +import { + ArrowRight, + Sparkles, + ShieldCheck, + BrainCircuit, + Cloud, + Code2, + Factory, + Users, + Award, + Target, + ChevronRight, + TrendingUp, + Globe2 +} from 'lucide-react'; + +export default function AboutUsPage({ isMobile, onOpenStrategy, onNavigate }) { + const bgPatternUrl = assetUrl('/assets/Background pattern About Us Hero section.svg'); + const spotlightUrl = assetUrl('/assets/Spotlight vector.svg'); + + // Animation Variants + const fadeInUp = { + hidden: { opacity: 0, y: 35 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.8, ease: [0.22, 1, 0.36, 1] } + } + }; + + const fadeInStaggerContainer = { + hidden: {}, + visible: { + transition: { + staggerChildren: 0.1 + } + } + }; + + const fadeInStaggerCard = { + hidden: { opacity: 0, y: 25 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1] } + } + }; + + const milestoneVariants = (index) => ({ + hidden: { opacity: 0, scale: 0.85, y: 15 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { + delay: index * 0.12, + duration: 0.55, + ease: [0.22, 1, 0.36, 1] + } + } + }); + + const peopleCardVariants = (index) => ({ + hidden: { opacity: 0, y: 50 }, + visible: { + opacity: 1, + y: 0, + transition: { + delay: index * 0.08, + duration: 0.7, + ease: [0.22, 1, 0.36, 1] + } + } + }); + + return ( +
+ + {/* HERO SECTION */} +
+ {/* Background Pattern SVG */} +
+ + {/* Spotlight SVG Overlay */} +
+ + {/* Ambient Gold Radial Glow behind title */} +
+ + {/* Floating Sparkle Particles around text */} +
+ {/* Sparkle Left Top */} + + + + + + + {/* Sparkle Right Top */} + + + + + + + {/* Sparkle Left Bottom near button */} + + + + + + + {/* Sparkle Right Bottom */} + + + + + +
+ + {/* HERO CONTENT WRAPPER */} +
+ + {/* Badge Tag */} + + + AI • DATA • CLOUD • WEB & APP + + + + {/* Main Title */} + +

+ Where Technology Meets +

+ +

+ Business + + Transformation + +

+
+ + {/* Paragraph Description */} + + Founded in 2022, Cavin Infotech empowers forward-thinking organizations to harness the full potential of AI-powered solutions, smart manufacturing, intelligent automation, enterprise software, and digital transformation services. We turn complex challenges into measurable growth, efficiency, and lasting competitive advantage. + + + {/* Action Buttons */} + + {/* Primary Dark Blue Button */} + { + if (onNavigate) { + onNavigate('Products'); + } else { + window.location.hash = 'products'; + } + }} + style={{ + background: 'linear-gradient(180deg, #1A283D 0%, #0F1A2E 100%)', + border: '1px solid rgba(59, 130, 246, 0.35)', + color: '#FFFFFF', + padding: isMobile ? '0.85rem 2rem' : '0.9rem 2.25rem', + borderRadius: '9999px', + fontSize: '0.98rem', + fontWeight: 600, + cursor: 'pointer', + boxShadow: '0 4px 20px rgba(0, 0, 0, 0.4), inset 0 1px 1px rgba(255, 255, 255, 0.12)', + transition: 'all 0.3s ease', + width: isMobile ? '100%' : 'auto', + maxWidth: isMobile ? '300px' : 'none' + }} + > + Explore Our Services + + + {/* Secondary Light Glowing Button */} + { + const storyEl = document.getElementById('our-story'); + if (storyEl) { + storyEl.scrollIntoView({ behavior: 'smooth' }); + } + }} + style={{ + background: 'linear-gradient(180deg, #FFFFFF 0%, #E2E8F0 100%)', + border: 'none', + color: '#0F172A', + padding: isMobile ? '0.85rem 2rem' : '0.9rem 2.25rem', + borderRadius: '9999px', + fontSize: '0.98rem', + fontWeight: 600, + cursor: 'pointer', + boxShadow: '0 0 25px rgba(255, 255, 255, 0.35)', + transition: 'all 0.3s ease', + width: isMobile ? '100%' : 'auto', + maxWidth: isMobile ? '300px' : 'none' + }} + > + Discover our story + + +
+
+ + {/* OUR STORY, PURPOSE & MANAGING DIRECTOR MESSAGE SECTION */} +
+
+ + {/* ROW 1: OUR STORY */} + + {/* Left Heading */} +
+
+

+ Our Story +

+
+ {/* Right Content */} +
+

+ Cavin Infotech was founded with a clear vision: to bridge the gap between traditional operations and intelligent, technology-led growth. In just a few years, we have emerged as a trusted partner for enterprises seeking AI solutions, smart factory platforms, SAP excellence, custom software, and immersive technologies. +

+

+ Today, we help manufacturing, FMCG, engineering, retail, and technology companies innovate faster, operate smarter, and thrive in an increasingly digital world. +

+
+ + + {/* ROW 2: OUR PURPOSE */} + + {/* Left Heading */} +
+
+

+ Our Purpose +

+
+ {/* Right Content */} +
+

+ To empower organizations with scalable, secure, and future-ready technology solutions that deliver real business value, drive operational excellence, and support sustainable long-term growth. +

+
+ + + {/* ROW 3: A MESSAGE FROM OUR MANAGING DIRECTOR */} + + {/* Left Heading */} +
+
+

+ A Message from
Our Managing
Director +

+
+ + {/* Right Content Split (Text + Portrait Image) */} +
+ + {/* Text Block */} +
+

+ “Technology is reshaping industries at an unprecedented pace. The organizations that embrace innovation today will lead tomorrow.” +

+

+ At Cavin Infotech, we go beyond simple technology implementation. We partner with businesses to accelerate their digital transformation journey through Generative AI, Agentic AI, smart manufacturing, intelligent automation, and enterprise solutions. Our commitment is to deliver meaningful impact not just systems through deep collaboration, relentless innovation, and uncompromising quality. +

+
+ + {/* Portrait Image */} + + Managing Director - Cavin Infotech + + +
+ + +
+
+ + {/* WHAT DEFINES US GRID SECTION */} +
+
+ + {/* Section Header */} + +

+ What Defines Us +

+

+ A UNIFIED 3D DASHBOARD THAT BRINGS ADVANCED ANALYTICS, REAL-TIME DATA FLOWS, AND AUTONOMOUS AI AGENTS INTO A SINGLE PANE OF GLASS. +

+
+ + {/* Outer Grid Frame Container — solid dark background, visible border stroke */} +
+ + {[ + { + title: 'Innovation Driven', + desc: 'We continuously explore AI, Industrial IoT, automation, and Extended Reality (XR) to create cutting-edge solutions that drive true business transformation.', + subtext: 'Strategy-led technology thinking for meaningful business outcomes.', + highlighted: false + }, + { + title: 'Customer-Centric Approach', + desc: 'Every solution is tailored to your specific goals, operational realities, and desired business outcomes.', + subtext: 'User-first experiences shaped by clarity, usability, and adoption.', + highlighted: true + }, + { + title: 'Technology Excellence', + desc: 'We deliver robust enterprise AI, smart factory platforms, SAP managed services, and scalable custom software built for performance and growth.', + subtext: 'Reliable engineering practices for secure and scalable systems.', + highlighted: false + }, + { + title: 'Agile Mindset', + desc: 'We move fast, adapt quickly, and help our clients stay ahead in a rapidly evolving digital landscape.', + subtext: 'Intelligent transformation powered by AI, data, and automation.', + highlighted: false + }, + { + title: 'Secure & Reliable', + desc: 'Security, compliance, and operational reliability are embedded in everything we build.', + subtext: 'Future-ready solutions built for continuous growth.', + highlighted: false + }, + { + title: 'Outcome Focused', + desc: 'We measure success by improved efficiency, productivity, visibility, and tangible business growth.', + subtext: 'Trusted execution through clarity, responsibility, and partnership.', + highlighted: false + } + ].map((card) => ( + { + e.currentTarget.style.borderColor = card.highlighted ? '#8a8a8c' : '#3d4250'; + }} + onMouseLeave={e => { + e.currentTarget.style.borderColor = card.highlighted ? '#6B6A6C' : '#2B2F38'; + }} + > + {/* Blur shape TOP — only on highlighted card */} + {card.highlighted && ( + + )} + + {/* Blur shape BOTTOM — only on highlighted card */} + {card.highlighted && ( + + )} + + {/* Top: title + desc */} +
+

+ {card.title} +

+

+ {card.desc} +

+
+ + {/* Bottom: subtext footnote */} +

+ {card.subtext} +

+
+ ))} +
+
+ +
+
+ + {/* OUR GROWTH JOURNEY SECTION */} +
+ {/* Teal ellipse glow — section background bottom right */} + + + {/* Section Header */} + +

+ Our Growth Journey +

+

+ BUILDING CAPABILITIES. CREATING IMPACT. DRIVING INNOVATION. +

+
+ + {/* Journey Visualization — aspect-ratio framed container constrained to site max-width */} + {!isMobile && ( +
+ {/* Inner aspect-ratio box (1692 x 800) matching Path Line SVG coordinate system */} +
+ {/* Path Line SVG */} + + + {/* Ghost Numbers (1, 2, 3, 4) aligned next to each milestone dot */} + 1 + + 2 + + 3 + + 4 + + {/* ── MILESTONE 1: Technology Excellence ── */} + + Milestone 1 + {/* Label */} +
+

+ TECHNOLOGY
EXCELLENCE +

+

+ Developing scalable digital solutions that solve real-world business challenges. +

+
+
+ + {/* ── MILESTONE 2: Intelligent Automation ── */} + + Milestone 2 + {/* Label — aligned next to right side of circle point */} +
+

+ INTELLIGENT
AUTOMATION +

+

+ Transforming operations with AI, automation, and data-driven intelligence. +

+
+
+ + {/* ── MILESTONE 3: Smart Manufacturing ── */} + + Milestone 3 + {/* Label — aligned next to right side of circle point */} +
+

+ SMART
MANUFACTURING +

+

+ Connecting people, processes, and machines through Industry 4.0 technologies. +

+
+
+ + {/* ── MILESTONE 4: Future Innovation ── */} + + Milestone 4 + {/* Label — aligned directly to right side of circle point */} +
+

+ FUTURE
INNOVATION +

+

+ Exploring emerging technologies to shape the next generation of enterprise solutions. +

+
+
+ +
+
+ )} + + {/* Mobile fallback — vertical timeline */} + {isMobile && ( + + {[ + { num: '1', title: 'TECHNOLOGY\nEXCELLENCE', desc: 'Developing scalable digital solutions that solve real-world business challenges.' }, + { num: '2', title: 'INTELLIGENT\nAUTOMATION', desc: 'Transforming operations with AI, automation, and data-driven intelligence.' }, + { num: '3', title: 'SMART\nMANUFACTURING', desc: 'Connecting people, processes, and machines through Industry 4.0 technologies.' }, + { num: '4', title: 'FUTURE\nINNOVATION', desc: 'Exploring emerging technologies to shape the next generation of enterprise solutions.' }, + ].map((m) => ( + +
+ {m.num} +
+
+

{m.title}

+

{m.desc}

+
+
+ ))} +
+ )} +
+ {/* PEOPLE BEHIND THE TECHNOLOGY SECTION */} +
+ {/* Section Header */} + +

+ The People Behind the Technology +

+

+ OUR STRENGTH LIES IN OUR PEOPLE - A PASSIONATE TEAM OF +

+
+ + {/* Responsive 5-Card Arch Stage */} +
+ {/* Ambient floor glow */} +
+ + {/* 5-Card flex layout aligned to bottom to form the curved top arch */} +
+ {[ + { + svg: 'Left.svg', + title: 'Visionaries', + desc: 'Turning complexity into opportunity.', + topOffset: '12.86%' + }, + { + svg: 'Left mid.svg', + title: 'Innovators', + desc: 'Transforming emerging tech into business-ready solutions.', + topOffset: '9.17%' + }, + { + svg: 'Mid.svg', + title: 'Architects', + desc: 'Designing digital ecosystems built for growth and resilience.', + topOffset: '7.5%' + }, + { + svg: 'Right mid.svg', + title: 'Engineers', + desc: 'Building platforms and products that push boundaries.', + topOffset: '9.17%' + }, + { + svg: 'Right.svg', + title: 'Problem Solvers', + desc: 'Unlocking efficiency, agility, and innovation for organizations.', + topOffset: '12.86%' + } + ].map((card, index) => ( + + {/* SVG card containing background, sparkles, shadow, and silhouette */} + {card.title} + + {/* Text overlay — aligned horizontally with Architects text level */} +
+

+ {card.title} +

+ {!isMobile && ( +

+ {card.desc} +

+ )} +
+
+ ))} +
+
+ +
+ + {/* WHAT WE BELIEVE SECTION */} +
+
+ {/* Section Header */} + +

+ What We Believe +

+

+ WE DON’T JUST DELIVER TECHNOLOGY WE BELIEVE IN TECHNOLOGY THAT TRULY TRANSFORMS BUSINESSES. +

+
+ +
+ {/* Top Row: 3 Cards */} + + {[ + { + title: 'Intelligence Should Create Impact', + desc: 'AI and intelligent automation should go far beyond task automation. They must improve decision-making, simplify operations, and deliver clear, measurable business value.', + img: '/assets/What we Believe 01.png' + }, + { + title: 'Technology Should Be Human-First', + desc: 'Digital systems should empower people, reduce complexity, and make work more meaningful not add to the burden.', + img: '/assets/What we Believe 02.png' + }, + { + title: 'Manufacturing Should Be Smarter', + desc: 'Connected factories, real-time visibility, and Industrial IoT should help businesses minimize downtime, boost productivity, and operate with greater confidence and control.', + img: '/assets/What we Believe 03.png' + } + ].map((card) => ( + { + e.currentTarget.style.borderColor = 'rgba(255, 255, 255, 0.18)'; + e.currentTarget.style.transform = 'translateY(-4px)'; + }} + onMouseLeave={e => { + e.currentTarget.style.borderColor = 'rgba(255, 255, 255, 0.08)'; + e.currentTarget.style.transform = 'translateY(0px)'; + }} + > +
+

+ {card.title} +

+

+ {card.desc} +

+
+ +
+ {card.title} +
+
+ ))} +
+ + {/* Bottom Row: 2 Cards */} + + {[ + { + title: 'Software Should Fit the Business', + desc: 'Every enterprise is unique. We believe solutions must adapt to your real workflows, processes, and goals instead of forcing you to change the way you work.', + img: '/assets/What we Believe 04.png' + }, + { + title: 'Innovation Should Be Practical', + desc: 'New technologies like Generative AI, Agentic AI, and XR only matter when they solve actual challenges, drive efficiency, and support sustainable long-term growth.', + img: '/assets/What we Believe 05.png' + } + ].map((card) => ( + { + e.currentTarget.style.borderColor = 'rgba(255, 255, 255, 0.18)'; + e.currentTarget.style.transform = 'translateY(-4px)'; + }} + onMouseLeave={e => { + e.currentTarget.style.borderColor = 'rgba(255, 255, 255, 0.08)'; + e.currentTarget.style.transform = 'translateY(0px)'; + }} + > +
+

+ {card.title} +

+

+ {card.desc} +

+
+ +
+ {card.title} +
+
+ ))} +
+
+
+
+ +
+ ); +} diff --git a/src/components/ContactSection.jsx b/src/components/ContactSection.jsx index db3d272..431398a 100644 --- a/src/components/ContactSection.jsx +++ b/src/components/ContactSection.jsx @@ -31,8 +31,7 @@ export default function ContactSection({ isMobile, onOpenStrategy }) { setErrorMsg(''); try { - // Try sending via API endpoint - const response = await fetch('/api/send', { + let response = await fetch('/api/contact', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ @@ -40,21 +39,36 @@ export default function ContactSection({ isMobile, onOpenStrategy }) { name: formData.name, email: formData.email, phone: formData.phone, - interests: formData.subject, + subject: formData.subject, message: formData.message }) }); - if (response.ok) { + if (!response.ok) { + response = await fetch('/api/send', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + type: 'contact', + name: formData.name, + email: formData.email, + phone: formData.phone, + subject: formData.subject, + message: formData.message + }) + }); + } + + const resData = await response.json().catch(() => ({})); + + if (response.ok && resData.success) { setSubmitted(true); setFormData({ name: '', email: '', phone: '', subject: '', message: '' }); } else { - // Fallback smooth demo success if backend API is not configured with live EmailJS keys - setSubmitted(true); - setFormData({ name: '', email: '', phone: '', subject: '', message: '' }); + setErrorMsg(resData.error || resData.smtpError || 'Failed to send message. Please check SMTP configuration.'); } - } catch { - // Graceful fallback for local development without server + } catch (err) { + console.error('Contact submit error:', err); setSubmitted(true); setFormData({ name: '', email: '', phone: '', subject: '', message: '' }); } finally { diff --git a/src/components/FeaturedGallery.jsx b/src/components/FeaturedGallery.jsx index aadb4e4..a42e0b0 100644 --- a/src/components/FeaturedGallery.jsx +++ b/src/components/FeaturedGallery.jsx @@ -27,17 +27,22 @@ export default function FeaturedGallery({ gallery }) { }, [activeGalleryIndex, galleryData.length]); return ( -